boost-skill-cli 1.0.332__tar.gz → 1.0.334__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.332/boost_skill_cli.egg-info → boost_skill_cli-1.0.334}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/commands/discovery.py +42 -1
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/dense.py +111 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/rag.py +20 -4
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_skill_cli.egg-info/SOURCES.txt +1 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/commands.html +6 -4
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +28 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +25 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap.html +55 -2
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/functional/test_cli_discovery.py +60 -0
- boost_skill_cli-1.0.334/tests/unit/test_dense_shards.py +242 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/.gitattributes +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/.gitignore +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/.vale.ini +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/LICENSE +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/Makefile +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/README.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/codecov.yml +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/index.html +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/evals/README.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/examples/README.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/index.html +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/noxfile.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/setup.cfg +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/style/README.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/style/boost.css +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/style/boost.js +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/style/demo.html +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.332 → boost_skill_cli-1.0.334}/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.334'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 334)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -194,6 +194,38 @@ def _hint_semantic_search(engine: str) -> None:
|
|
|
194
194
|
out.info(out.role(line, "muted"))
|
|
195
195
|
|
|
196
196
|
|
|
197
|
+
def _shard_io(args) -> int:
|
|
198
|
+
"""`--export-shard` / `--import-shard`, the two halves of a prebuilt shard.
|
|
199
|
+
|
|
200
|
+
Embedding is ~1.2 s/chunk on CPU — 74 minutes for 743 entries — so without
|
|
201
|
+
a way to move vectors between machines the keyless tier is available in
|
|
202
|
+
principle and unreachable in practice. Import validates rather than trusts;
|
|
203
|
+
see `dense.import_shard` for why a mismatched shard must be refused instead
|
|
204
|
+
of merged.
|
|
205
|
+
"""
|
|
206
|
+
from ..core import dense
|
|
207
|
+
if args.export_shard:
|
|
208
|
+
shard = dense.export_shard(args.export_shard)
|
|
209
|
+
if not shard.get("chunks"):
|
|
210
|
+
raise BoostError("no vectors for %r" % args.export_shard,
|
|
211
|
+
hint="build them first with `boost reindex --dense`")
|
|
212
|
+
print(json.dumps(shard))
|
|
213
|
+
return 0
|
|
214
|
+
path = Path(args.import_shard)
|
|
215
|
+
try:
|
|
216
|
+
shard = json.loads(path.read_text(encoding="utf-8"))
|
|
217
|
+
except (OSError, json.JSONDecodeError) as exc:
|
|
218
|
+
raise BoostError("cannot read shard %s: %s" % (path, exc)) from exc
|
|
219
|
+
tap = str(shard.get("tap") or "")
|
|
220
|
+
commit = rag._tap_commits().get(tap.replace("/", "__"), "")
|
|
221
|
+
ok, reason = dense.import_shard(shard, commit=commit)
|
|
222
|
+
if not ok:
|
|
223
|
+
raise BoostError("shard refused — %s" % reason,
|
|
224
|
+
hint="`boost reindex --dense` embeds it locally instead")
|
|
225
|
+
out.ok("%s: %s" % (tap, reason))
|
|
226
|
+
return 0
|
|
227
|
+
|
|
228
|
+
|
|
197
229
|
def cmd_reindex(argv):
|
|
198
230
|
"""Build/refresh the full-content (RAG) search index over tapped items."""
|
|
199
231
|
p = cliparse.parser(
|
|
@@ -203,10 +235,19 @@ def cmd_reindex(argv):
|
|
|
203
235
|
help="reindex every tap, ignoring cached commits")
|
|
204
236
|
p.add_argument("--dense", action="store_true",
|
|
205
237
|
help="also embed chunks into the opt-in dense vector store "
|
|
206
|
-
"(needs the `rag` extra
|
|
238
|
+
"(needs the `rag` extra; no API key required)")
|
|
239
|
+
p.add_argument("--export-shard", metavar="TAP",
|
|
240
|
+
help="write TAP's prebuilt vectors to stdout as JSON, for "
|
|
241
|
+
"publishing so others need not re-embed them")
|
|
242
|
+
p.add_argument("--import-shard", metavar="FILE",
|
|
243
|
+
help="merge a prebuilt vector shard, skipping the embed "
|
|
244
|
+
"cost; refused unless it matches this store's backend "
|
|
245
|
+
"and the tap's current commit")
|
|
207
246
|
p.add_argument("--json", action="store_true", dest="as_json",
|
|
208
247
|
help="machine-readable output")
|
|
209
248
|
args = p.parse_args(argv)
|
|
249
|
+
if args.export_shard or args.import_shard:
|
|
250
|
+
return _shard_io(args)
|
|
210
251
|
if not registry.list_taps():
|
|
211
252
|
raise BoostError("no taps configured — nothing to index",
|
|
212
253
|
hint="add the recommended registries with `boost tap --defaults`")
|
|
@@ -12,6 +12,7 @@ are the expensive step, so an unchanged tap is never re-embedded.
|
|
|
12
12
|
"""
|
|
13
13
|
from __future__ import annotations
|
|
14
14
|
|
|
15
|
+
import base64
|
|
15
16
|
import json
|
|
16
17
|
import sqlite3
|
|
17
18
|
from pathlib import Path
|
|
@@ -345,6 +346,116 @@ def build(entries: Optional[List[dict]] = None,
|
|
|
345
346
|
con.close()
|
|
346
347
|
|
|
347
348
|
|
|
349
|
+
def export_shard(tap: str) -> dict:
|
|
350
|
+
"""One tap's vectors plus the provenance needed to validate them later.
|
|
351
|
+
|
|
352
|
+
Embedding is the expensive half of the keyless tier — measured at ~1.2 s per
|
|
353
|
+
chunk on CPU, so 74 minutes for 743 entries — while querying is milliseconds.
|
|
354
|
+
A shard lets that cost be paid once in CI and downloaded by everyone else.
|
|
355
|
+
|
|
356
|
+
The provenance fields are not decoration: vectors are only comparable inside
|
|
357
|
+
the embedding space that produced them, so provider/model/dim have to travel
|
|
358
|
+
with the rows, and the registry commit has to travel too or a stale shard
|
|
359
|
+
would be indistinguishable from a current one.
|
|
360
|
+
"""
|
|
361
|
+
# Plain sqlite3, NOT _connect: exporting reads `chunks`, `meta` and the
|
|
362
|
+
# stored embedding blobs, all ordinary tables. Routing through _connect
|
|
363
|
+
# would make export impossible without the sqlite-vec extension — the same
|
|
364
|
+
# trap `_recorded_meta` documents — and a machine that built vectors and
|
|
365
|
+
# then dropped the extra is exactly the one whose shard is worth having.
|
|
366
|
+
if not db_path().exists():
|
|
367
|
+
return {"tap": tap, "chunks": []}
|
|
368
|
+
try:
|
|
369
|
+
con = sqlite3.connect(str(db_path()))
|
|
370
|
+
except sqlite3.Error:
|
|
371
|
+
return {"tap": tap, "chunks": []}
|
|
372
|
+
try:
|
|
373
|
+
meta = _read_meta(con)
|
|
374
|
+
commits = meta.get("commits")
|
|
375
|
+
commit = ""
|
|
376
|
+
if isinstance(commits, dict):
|
|
377
|
+
commit = str(commits.get(tap.replace("/", "__")) or "")
|
|
378
|
+
chunks = []
|
|
379
|
+
for row in con.execute(
|
|
380
|
+
"SELECT c.name, c.tap, c.path, c.kind, c.cix, c.snip, v.embedding "
|
|
381
|
+
"FROM chunks c JOIN vec_chunks v ON v.rowid = c.id "
|
|
382
|
+
"WHERE c.tap = ? ORDER BY c.id", (tap,)):
|
|
383
|
+
name, ctap, path, kind, cix, snip, emb = row
|
|
384
|
+
chunks.append({
|
|
385
|
+
"name": name, "tap": ctap, "path": path, "kind": kind,
|
|
386
|
+
"cix": cix, "snip": snip,
|
|
387
|
+
# base64 so the shard is plain JSON and can be published as a
|
|
388
|
+
# release artifact without a binary format of its own.
|
|
389
|
+
"embedding": base64.b64encode(bytes(emb)).decode("ascii"),
|
|
390
|
+
})
|
|
391
|
+
return {"tap": tap, "commit": commit,
|
|
392
|
+
"provider": meta.get("provider"), "model": meta.get("model"),
|
|
393
|
+
"dim": meta.get("dim"), "version": INDEX_VERSION,
|
|
394
|
+
"chunks": chunks}
|
|
395
|
+
except sqlite3.Error:
|
|
396
|
+
return {"tap": tap, "chunks": []}
|
|
397
|
+
finally:
|
|
398
|
+
con.close()
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
def import_shard(shard: dict, commit: str) -> Tuple[bool, str]:
|
|
402
|
+
"""Merge a prebuilt shard into this machine's store. ``(ok, reason)``.
|
|
403
|
+
|
|
404
|
+
Refuses rather than degrades. A vector is only meaningful against others
|
|
405
|
+
from the same embedding space, so a shard from a different provider, model
|
|
406
|
+
or dimension cannot be mixed in: doing so would not raise, it would quietly
|
|
407
|
+
return nonsense rankings, which is the worse failure. A shard whose commit
|
|
408
|
+
does not match the tap as it stands now is refused for a different reason —
|
|
409
|
+
accepting it would let `build()` mark that tap "reused" and never re-embed
|
|
410
|
+
it, pinning the user to stale vectors indefinitely.
|
|
411
|
+
"""
|
|
412
|
+
for field in ("provider", "model", "dim"):
|
|
413
|
+
if shard.get(field) in (None, ""):
|
|
414
|
+
return False, "shard is missing %s" % field
|
|
415
|
+
if str(shard.get("commit") or "") != commit:
|
|
416
|
+
return False, ("commit mismatch: shard %r, tap %r"
|
|
417
|
+
% (shard.get("commit"), commit))
|
|
418
|
+
con = _connect()
|
|
419
|
+
if con is None:
|
|
420
|
+
return False, "no vector backend available"
|
|
421
|
+
try:
|
|
422
|
+
meta = _read_meta(con)
|
|
423
|
+
# An empty store has no opinion yet, so it adopts the shard's backend.
|
|
424
|
+
if meta.get("provider"):
|
|
425
|
+
for field in ("provider", "model", "dim"):
|
|
426
|
+
if meta.get(field) != shard.get(field):
|
|
427
|
+
return False, ("%s mismatch: store %r, shard %r"
|
|
428
|
+
% (field, meta.get(field), shard.get(field)))
|
|
429
|
+
dim = int(shard["dim"])
|
|
430
|
+
_ensure_schema(con, dim)
|
|
431
|
+
# Replace, never append: re-importing must not double a tap's rows.
|
|
432
|
+
_delete_taps(con, [str(shard.get("tap") or "")])
|
|
433
|
+
mod = _load()
|
|
434
|
+
for c in shard.get("chunks") or []:
|
|
435
|
+
cur = con.execute(
|
|
436
|
+
"INSERT INTO chunks (name, tap, path, kind, cix, snip) "
|
|
437
|
+
"VALUES (?, ?, ?, ?, ?, ?)",
|
|
438
|
+
(c.get("name"), c.get("tap"), c.get("path"), c.get("kind"),
|
|
439
|
+
c.get("cix"), c.get("snip")))
|
|
440
|
+
blob = base64.b64decode(c["embedding"])
|
|
441
|
+
con.execute("INSERT INTO vec_chunks (rowid, embedding) VALUES (?, ?)",
|
|
442
|
+
(cur.lastrowid, blob))
|
|
443
|
+
commits = meta.get("commits")
|
|
444
|
+
commits = dict(commits) if isinstance(commits, dict) else {}
|
|
445
|
+
commits[str(shard.get("tap") or "").replace("/", "__")] = commit
|
|
446
|
+
_write_meta(con, {"version": INDEX_VERSION,
|
|
447
|
+
"provider": shard.get("provider"),
|
|
448
|
+
"model": shard.get("model"), "dim": dim,
|
|
449
|
+
"commits": commits})
|
|
450
|
+
con.commit()
|
|
451
|
+
_ = mod # extension loaded by _connect; kept for symmetry
|
|
452
|
+
return True, "imported %d chunks" % len(shard.get("chunks") or [])
|
|
453
|
+
except sqlite3.Error as exc:
|
|
454
|
+
return False, "store error: %s" % exc
|
|
455
|
+
finally:
|
|
456
|
+
con.close()
|
|
457
|
+
|
|
458
|
+
|
|
348
459
|
def _indexed_taps(con: sqlite3.Connection) -> set:
|
|
349
460
|
"""Every tap name the vector index currently holds chunks for."""
|
|
350
461
|
try:
|
|
@@ -219,17 +219,33 @@ def _make_docs(entries: List[dict], tap_paths: Dict[str, Path]) -> List[dict]:
|
|
|
219
219
|
|
|
220
220
|
|
|
221
221
|
def _postings_to_doc_tf(raw: dict) -> Dict[int, Dict[str, int]]:
|
|
222
|
-
"""Invert persisted postings back to per-doc term frequencies.
|
|
222
|
+
"""Invert persisted postings back to per-doc term frequencies.
|
|
223
|
+
|
|
224
|
+
Pure: it inverts whatever ``raw`` carries and reads nothing. An earlier
|
|
225
|
+
version fell back to the SQLite store with ``or``, which made a caller
|
|
226
|
+
passing ``{}`` silently receive tens of thousands of postings from the live
|
|
227
|
+
index — invisible in CI, where no store exists, and wrong everywhere else.
|
|
228
|
+
Callers that need the store now say so; see :func:`_kept_docs`.
|
|
229
|
+
"""
|
|
223
230
|
doc_tf: Dict[int, Dict[str, int]] = defaultdict(dict)
|
|
224
|
-
for term, plist in (raw.get("postings") or
|
|
231
|
+
for term, plist in (raw.get("postings") or {}).items():
|
|
225
232
|
for doc_id, tf in plist:
|
|
226
233
|
doc_tf[doc_id][term] = tf
|
|
227
234
|
return doc_tf
|
|
228
235
|
|
|
229
236
|
|
|
230
237
|
def _kept_docs(raw: dict, keep_safe: set) -> List[dict]:
|
|
231
|
-
"""Recover cached docs (with term freqs) for taps that did not change.
|
|
232
|
-
|
|
238
|
+
"""Recover cached docs (with term freqs) for taps that did not change.
|
|
239
|
+
|
|
240
|
+
Term frequencies live in the SQLite postings store since they left the JSON
|
|
241
|
+
index, so an index without an inline ``postings`` key is normal rather than
|
|
242
|
+
empty — this is the caller that reaches for the store, explicitly.
|
|
243
|
+
"""
|
|
244
|
+
# Key ABSENCE, not falsiness: an index carrying an explicit empty
|
|
245
|
+
# `postings` is stating it has none, and must not be answered from the
|
|
246
|
+
# store. Only an index with no such key predates the SQLite move.
|
|
247
|
+
doc_tf = _postings_to_doc_tf(
|
|
248
|
+
raw if "postings" in raw else {"postings": _all_postings()})
|
|
233
249
|
return [{**meta, "tf": doc_tf.get(doc_id, {})}
|
|
234
250
|
for doc_id, meta in enumerate(raw.get("docs", []))
|
|
235
251
|
if meta["t"].replace("/", "__") in keep_safe]
|
|
@@ -489,6 +489,7 @@ tests/unit/test_dedup_trust.py
|
|
|
489
489
|
tests/unit/test_dense.py
|
|
490
490
|
tests/unit/test_dense_fallback.py
|
|
491
491
|
tests/unit/test_dense_fix_hint.py
|
|
492
|
+
tests/unit/test_dense_shards.py
|
|
492
493
|
tests/unit/test_dense_status.py
|
|
493
494
|
tests/unit/test_dependabot_config.py
|
|
494
495
|
tests/unit/test_docs_pages_linked.py
|
|
@@ -117,7 +117,7 @@
|
|
|
117
117
|
<div class="group" data-group="find">
|
|
118
118
|
<div class="group-h">Find & search</div>
|
|
119
119
|
<a class="cmd-link" href="#cmd-search" data-search="search search skills across tap registries (ai-ranked) --smart --limit limit --json query">search</a>
|
|
120
|
-
<a class="cmd-link" href="#cmd-reindex" data-search="reindex build/refresh the full-content search index build or refresh the full-content search index --force --dense --json">reindex</a>
|
|
120
|
+
<a class="cmd-link" href="#cmd-reindex" data-search="reindex build/refresh the full-content search index build or refresh the full-content search index --force --dense --export-shard tap --import-shard file --json">reindex</a>
|
|
121
121
|
<a class="cmd-link" href="#cmd-discover" data-search="discover browse & search the github-wide skill discovery index --limit limit --json query">discover</a>
|
|
122
122
|
<a class="cmd-link" href="#cmd-recommend" data-search="recommend suggest skills based on your project's tech stack --path path --limit limit --json">recommend</a>
|
|
123
123
|
<a class="cmd-link" href="#cmd-browse" data-search="browse interactive full-screen tui with fuzzy search ">browse</a>
|
|
@@ -413,15 +413,17 @@
|
|
|
413
413
|
<div class="arg"><code>--json</code><span>machine-readable output</span></div>
|
|
414
414
|
</div>
|
|
415
415
|
</section>
|
|
416
|
-
<section class="cmd" id="cmd-reindex" data-search="reindex build/refresh the full-content search index build or refresh the full-content search index --force --dense --json">
|
|
416
|
+
<section class="cmd" id="cmd-reindex" data-search="reindex build/refresh the full-content search index build or refresh the full-content search index --force --dense --export-shard tap --import-shard file --json">
|
|
417
417
|
<h3><span class="cname">reindex</span><span class="gtag">find</span></h3>
|
|
418
418
|
<p class="summary">Build/refresh the full-content search index</p>
|
|
419
|
-
<pre class="syn">boost reindex [--force] [--dense] [--json]</pre>
|
|
419
|
+
<pre class="syn">boost reindex [--force] [--dense] [--export-shard TAP] [--import-shard FILE] [--json]</pre>
|
|
420
420
|
<p class="desc">Build or refresh the full-content search index</p>
|
|
421
421
|
<div class="args-h">Options</div>
|
|
422
422
|
<div class="args">
|
|
423
423
|
<div class="arg"><code>--force</code><span>reindex every tap, ignoring cached commits</span></div>
|
|
424
|
-
<div class="arg"><code>--dense</code><span>also embed chunks into the opt-in dense vector store (needs the `rag` extra
|
|
424
|
+
<div class="arg"><code>--dense</code><span>also embed chunks into the opt-in dense vector store (needs the `rag` extra; no API key required)</span></div>
|
|
425
|
+
<div class="arg"><code>--export-shard TAP</code><span>write TAP's prebuilt vectors to stdout as JSON, for publishing so others need not re-embed them</span></div>
|
|
426
|
+
<div class="arg"><code>--import-shard FILE</code><span>merge a prebuilt vector shard, skipping the embed cost; refused unless it matches this store's backend and the tap's current commit</span></div>
|
|
425
427
|
<div class="arg"><code>--json</code><span>machine-readable output</span></div>
|
|
426
428
|
</div>
|
|
427
429
|
</section>
|
|
@@ -60,3 +60,31 @@ runs fine locally (<code>npm ci</code> with <code>npm_config_cache</code> redire
|
|
|
60
60
|
single-instance app: launching the bundle binary attaches to the running instance instead of starting
|
|
61
61
|
an isolated one. Nothing to fix in the harness — it is why the reproduction loop belongs on a
|
|
62
62
|
Linux runner (or against Chrome for Testing), not on a developer laptop with Chrome open.
|
|
63
|
+
|
|
64
|
+
<b>Cause found — and my earlier “maybe axe is right about the contrast” caveat was
|
|
65
|
+
wrong.</b> It is a harness defect, and the harness predicted it in a comment.
|
|
66
|
+
|
|
67
|
+
<code>a11y_check.mjs</code> loads each page over <code>file://</code> and passes
|
|
68
|
+
<code>--allow-file-access-from-files</code>, with this note: “without this Chrome treats each
|
|
69
|
+
file as its own opaque origin and the stylesheet never applies, <em>which would make every contrast
|
|
70
|
+
result meaningless</em>.” That is exactly what happens intermittently. Every failing element
|
|
71
|
+
resolves its colour from <code>var(--text-3)</code>, defined once in
|
|
72
|
+
<code>style/boost.css</code> and linked <em>relatively</em> (<code>../style/boost.css</code>).
|
|
73
|
+
|
|
74
|
+
The arithmetic settles it. The shipped token is <code>#767c96</code>, which is
|
|
75
|
+
<b>4.85:1 on <code>#07080f</code> — passing AA</b>, and it was already raised once from
|
|
76
|
+
<code>#676d86</code> (3.9:1) by <code>#243</code>. The colours axe reported —
|
|
77
|
+
<code>#505467</code> on <code>roadmap.html</code>, <code>#656a81</code> on <code>mcp-hub.html</code>
|
|
78
|
+
— <b>appear nowhere in this repository</b>. They are Chrome's unstyled fallbacks. So both
|
|
79
|
+
“contrast failures” were the same defect: the stylesheet silently not applying.
|
|
80
|
+
|
|
81
|
+
<b>The fix is therefore not a colour and not a settle delay.</b> Both would be treating a symptom.
|
|
82
|
+
The real options are to stop depending on a flag that intermittently fails — serve the docs
|
|
83
|
+
over a throwaway <code>http://</code> origin for the sweep, or inline the stylesheet into a temporary
|
|
84
|
+
copy — and, more importantly, to <b>fail loudly when it happens</b>: assert that a known token
|
|
85
|
+
resolves before running axe at all, so an unstyled page reports “stylesheet did not load”
|
|
86
|
+
rather than twenty plausible-looking contrast violations against colours that do not exist.
|
|
87
|
+
|
|
88
|
+
That guard matters more than the flake. Without it the sweep produces confident, specific,
|
|
89
|
+
<em>entirely wrong</em> findings — which is what sent me to check a token that had been correct
|
|
90
|
+
for months.
|
|
@@ -306,3 +306,28 @@ deltas.
|
|
|
306
306
|
<b>Claim released.</b> Steps 1, 4 and 6 have shipped; steps 2, 3 and 5 are unowned and open. Step 2
|
|
307
307
|
is the one to take next and it is better justified than when it was written: embedding measured at
|
|
308
308
|
~1.2 s/chunk locally, so prebuilt per-registry shards are a requirement rather than an optimisation.
|
|
309
|
+
|
|
310
|
+
<b>Step 2, the shard mechanism, is shipped.</b> <code>boost reindex --export-shard TAP</code> writes
|
|
311
|
+
one registry's vectors as JSON; <code>--import-shard FILE</code> merges them. Measured end to end on
|
|
312
|
+
the real store: exporting <code>anthropics/skills</code> gives <b>262 chunks in 0.63 MB</b>, and
|
|
313
|
+
importing it into a fresh <code>BOOST_HOME</code> takes <b>0.12 s</b> against roughly five minutes to
|
|
314
|
+
embed the same rows locally. That ratio is the whole point of the step.
|
|
315
|
+
|
|
316
|
+
<b>Import refuses rather than degrades.</b> A shard carries the provider, model, dimension and the
|
|
317
|
+
registry commit it was built from, and all four are checked. Mixing vectors from a different
|
|
318
|
+
embedding space would not raise — it would quietly return nonsense rankings, which is worse
|
|
319
|
+
than failing — and accepting a shard from a stale commit would let <code>build()</code> mark
|
|
320
|
+
that tap “reused” and never re-embed it, pinning the user to old vectors indefinitely.
|
|
321
|
+
Verified: a shard with a doctored commit is rejected with a message naming both hashes.
|
|
322
|
+
|
|
323
|
+
<b>What this does NOT remove: the query-side model download.</b> A shard eliminates the
|
|
324
|
+
<em>document</em> embedding cost, but a keyless user still needs the ~133 MB local model to embed
|
|
325
|
+
their own <em>query</em>. Confirmed by importing into a fresh <code>BOOST_HOME</code>, where retrieval
|
|
326
|
+
returned zero hits until the model was present — <code>dense.status()</code> reported
|
|
327
|
+
<code>ready</code> the whole time, because the store genuinely was ready. The card's framing of
|
|
328
|
+
“the only API-bound step is turning text into vectors” is right, but that step runs on
|
|
329
|
+
both sides, and only the document half can be shipped ahead of time.
|
|
330
|
+
|
|
331
|
+
<b>Still open in step 2:</b> the CI workflow that publishes shards as release artifacts, and the
|
|
332
|
+
<code>boost tap</code> integration that fetches one automatically. Both are now plumbing on top of a
|
|
333
|
+
verified mechanism rather than open questions. Steps 3 and 5 are untouched.
|
|
@@ -893,7 +893,32 @@ deltas.
|
|
|
893
893
|
|
|
894
894
|
<b>Claim released.</b> Steps 1, 4 and 6 have shipped; steps 2, 3 and 5 are unowned and open. Step 2
|
|
895
895
|
is the one to take next and it is better justified than when it was written: embedding measured at
|
|
896
|
-
~1.2 s/chunk locally, so prebuilt per-registry shards are a requirement rather than an optimisation
|
|
896
|
+
~1.2 s/chunk locally, so prebuilt per-registry shards are a requirement rather than an optimisation.
|
|
897
|
+
|
|
898
|
+
<b>Step 2, the shard mechanism, is shipped.</b> <code>boost reindex --export-shard TAP</code> writes
|
|
899
|
+
one registry's vectors as JSON; <code>--import-shard FILE</code> merges them. Measured end to end on
|
|
900
|
+
the real store: exporting <code>anthropics/skills</code> gives <b>262 chunks in 0.63 MB</b>, and
|
|
901
|
+
importing it into a fresh <code>BOOST_HOME</code> takes <b>0.12 s</b> against roughly five minutes to
|
|
902
|
+
embed the same rows locally. That ratio is the whole point of the step.
|
|
903
|
+
|
|
904
|
+
<b>Import refuses rather than degrades.</b> A shard carries the provider, model, dimension and the
|
|
905
|
+
registry commit it was built from, and all four are checked. Mixing vectors from a different
|
|
906
|
+
embedding space would not raise — it would quietly return nonsense rankings, which is worse
|
|
907
|
+
than failing — and accepting a shard from a stale commit would let <code>build()</code> mark
|
|
908
|
+
that tap “reused” and never re-embed it, pinning the user to old vectors indefinitely.
|
|
909
|
+
Verified: a shard with a doctored commit is rejected with a message naming both hashes.
|
|
910
|
+
|
|
911
|
+
<b>What this does NOT remove: the query-side model download.</b> A shard eliminates the
|
|
912
|
+
<em>document</em> embedding cost, but a keyless user still needs the ~133 MB local model to embed
|
|
913
|
+
their own <em>query</em>. Confirmed by importing into a fresh <code>BOOST_HOME</code>, where retrieval
|
|
914
|
+
returned zero hits until the model was present — <code>dense.status()</code> reported
|
|
915
|
+
<code>ready</code> the whole time, because the store genuinely was ready. The card's framing of
|
|
916
|
+
“the only API-bound step is turning text into vectors” is right, but that step runs on
|
|
917
|
+
both sides, and only the document half can be shipped ahead of time.
|
|
918
|
+
|
|
919
|
+
<b>Still open in step 2:</b> the CI workflow that publishes shards as release artifacts, and the
|
|
920
|
+
<code>boost tap</code> integration that fetches one automatically. Both are now plumbing on top of a
|
|
921
|
+
verified mechanism rather than open questions. Steps 3 and 5 are untouched.</p>
|
|
897
922
|
<div class="meta">
|
|
898
923
|
<span class="m">Complexity <b>L</b></span>
|
|
899
924
|
<span class="m hi">Impact <b>High</b></span>
|
|
@@ -1936,7 +1961,35 @@ runs fine locally (<code>npm ci</code> with <code>npm_config_cache</code> redire
|
|
|
1936
1961
|
<em>newly created</em> <code>userDataDir</code> each time, because Chrome on macOS is a
|
|
1937
1962
|
single-instance app: launching the bundle binary attaches to the running instance instead of starting
|
|
1938
1963
|
an isolated one. Nothing to fix in the harness — it is why the reproduction loop belongs on a
|
|
1939
|
-
Linux runner (or against Chrome for Testing), not on a developer laptop with Chrome open
|
|
1964
|
+
Linux runner (or against Chrome for Testing), not on a developer laptop with Chrome open.
|
|
1965
|
+
|
|
1966
|
+
<b>Cause found — and my earlier “maybe axe is right about the contrast” caveat was
|
|
1967
|
+
wrong.</b> It is a harness defect, and the harness predicted it in a comment.
|
|
1968
|
+
|
|
1969
|
+
<code>a11y_check.mjs</code> loads each page over <code>file://</code> and passes
|
|
1970
|
+
<code>--allow-file-access-from-files</code>, with this note: “without this Chrome treats each
|
|
1971
|
+
file as its own opaque origin and the stylesheet never applies, <em>which would make every contrast
|
|
1972
|
+
result meaningless</em>.” That is exactly what happens intermittently. Every failing element
|
|
1973
|
+
resolves its colour from <code>var(--text-3)</code>, defined once in
|
|
1974
|
+
<code>style/boost.css</code> and linked <em>relatively</em> (<code>../style/boost.css</code>).
|
|
1975
|
+
|
|
1976
|
+
The arithmetic settles it. The shipped token is <code>#767c96</code>, which is
|
|
1977
|
+
<b>4.85:1 on <code>#07080f</code> — passing AA</b>, and it was already raised once from
|
|
1978
|
+
<code>#676d86</code> (3.9:1) by <code>#243</code>. The colours axe reported —
|
|
1979
|
+
<code>#505467</code> on <code>roadmap.html</code>, <code>#656a81</code> on <code>mcp-hub.html</code>
|
|
1980
|
+
— <b>appear nowhere in this repository</b>. They are Chrome's unstyled fallbacks. So both
|
|
1981
|
+
“contrast failures” were the same defect: the stylesheet silently not applying.
|
|
1982
|
+
|
|
1983
|
+
<b>The fix is therefore not a colour and not a settle delay.</b> Both would be treating a symptom.
|
|
1984
|
+
The real options are to stop depending on a flag that intermittently fails — serve the docs
|
|
1985
|
+
over a throwaway <code>http://</code> origin for the sweep, or inline the stylesheet into a temporary
|
|
1986
|
+
copy — and, more importantly, to <b>fail loudly when it happens</b>: assert that a known token
|
|
1987
|
+
resolves before running axe at all, so an unstyled page reports “stylesheet did not load”
|
|
1988
|
+
rather than twenty plausible-looking contrast violations against colours that do not exist.
|
|
1989
|
+
|
|
1990
|
+
That guard matters more than the flake. Without it the sweep produces confident, specific,
|
|
1991
|
+
<em>entirely wrong</em> findings — which is what sent me to check a token that had been correct
|
|
1992
|
+
for months.</p>
|
|
1940
1993
|
<div class="meta">
|
|
1941
1994
|
<span class="m">Complexity <b>S</b></span>
|
|
1942
1995
|
<span class="m">Impact <b>Med</b></span>
|
|
@@ -1226,3 +1226,63 @@ class TestSearchSemanticHint:
|
|
|
1226
1226
|
boost("reindex")
|
|
1227
1227
|
r = boost("search", "brainstorming")
|
|
1228
1228
|
assert "semantic search is off" not in r.out
|
|
1229
|
+
|
|
1230
|
+
|
|
1231
|
+
class TestReindexShards:
|
|
1232
|
+
"""`--export-shard` / `--import-shard`, the user-facing half of shards.
|
|
1233
|
+
|
|
1234
|
+
The engine is covered in tests/unit/test_dense_shards.py; this pins the CLI
|
|
1235
|
+
contract — exit codes, JSON on stdout, and that a refused shard reports why
|
|
1236
|
+
rather than half-importing.
|
|
1237
|
+
"""
|
|
1238
|
+
|
|
1239
|
+
def test_exporting_a_tap_with_no_vectors_fails_with_a_hint(self, boost,
|
|
1240
|
+
tapped):
|
|
1241
|
+
r = boost("reindex", "--export-shard", "acme/skills", expect=1)
|
|
1242
|
+
assert "no vectors" in r.err
|
|
1243
|
+
assert "reindex --dense" in r.err # names the one next action
|
|
1244
|
+
|
|
1245
|
+
def test_export_writes_json_to_stdout(self, boost, tapped, monkeypatch):
|
|
1246
|
+
from boost_cli.core import dense
|
|
1247
|
+
monkeypatch.setattr(dense, "export_shard", lambda tap: {
|
|
1248
|
+
"tap": tap, "commit": "c1", "provider": "local", "model": "bge",
|
|
1249
|
+
"dim": 3, "chunks": [{"name": "a", "tap": tap, "path": "a/SKILL.md",
|
|
1250
|
+
"kind": "skill", "cix": 0, "snip": "s",
|
|
1251
|
+
"embedding": "AAAA"}]})
|
|
1252
|
+
r = boost("reindex", "--export-shard", "acme/skills")
|
|
1253
|
+
payload = json.loads(r.out) # must be parseable, not pretty
|
|
1254
|
+
assert payload["tap"] == "acme/skills"
|
|
1255
|
+
assert len(payload["chunks"]) == 1
|
|
1256
|
+
|
|
1257
|
+
def test_importing_a_missing_file_is_an_error(self, boost, tapped, tmp_path):
|
|
1258
|
+
r = boost("reindex", "--import-shard", str(tmp_path / "nope.json"),
|
|
1259
|
+
expect=1)
|
|
1260
|
+
assert "cannot read shard" in r.err
|
|
1261
|
+
|
|
1262
|
+
def test_importing_malformed_json_is_an_error(self, boost, tapped, tmp_path):
|
|
1263
|
+
bad = tmp_path / "bad.json"
|
|
1264
|
+
bad.write_text("{not json", encoding="utf-8")
|
|
1265
|
+
r = boost("reindex", "--import-shard", str(bad), expect=1)
|
|
1266
|
+
assert "cannot read shard" in r.err
|
|
1267
|
+
|
|
1268
|
+
def test_a_refused_shard_reports_the_reason(self, boost, tapped, tmp_path,
|
|
1269
|
+
monkeypatch):
|
|
1270
|
+
from boost_cli.core import dense
|
|
1271
|
+
monkeypatch.setattr(dense, "import_shard",
|
|
1272
|
+
lambda shard, commit: (False, "dim mismatch"))
|
|
1273
|
+
f = tmp_path / "s.json"
|
|
1274
|
+
f.write_text(json.dumps({"tap": "acme/skills"}), encoding="utf-8")
|
|
1275
|
+
r = boost("reindex", "--import-shard", str(f), expect=1)
|
|
1276
|
+
assert "dim mismatch" in r.err
|
|
1277
|
+
assert "reindex --dense" in r.err # the fallback that always works
|
|
1278
|
+
|
|
1279
|
+
def test_a_good_shard_reports_what_landed(self, boost, tapped, tmp_path,
|
|
1280
|
+
monkeypatch):
|
|
1281
|
+
from boost_cli.core import dense
|
|
1282
|
+
monkeypatch.setattr(dense, "import_shard",
|
|
1283
|
+
lambda shard, commit: (True, "imported 7 chunks"))
|
|
1284
|
+
f = tmp_path / "s.json"
|
|
1285
|
+
f.write_text(json.dumps({"tap": "acme/skills"}), encoding="utf-8")
|
|
1286
|
+
r = boost("reindex", "--import-shard", str(f))
|
|
1287
|
+
assert "imported 7 chunks" in r.out
|
|
1288
|
+
assert "acme/skills" in r.out
|