boost-skill-cli 1.0.331__tar.gz → 1.0.333__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.331/boost_skill_cli.egg-info → boost_skill_cli-1.0.333}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/commands/discovery.py +42 -1
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/dense.py +111 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/rag.py +20 -4
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_skill_cli.egg-info/SOURCES.txt +1 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/commands.html +6 -4
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +25 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +15 -2
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +10 -2
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +16 -1
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap.html +68 -7
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/functional/test_cli_discovery.py +60 -0
- boost_skill_cli-1.0.333/tests/unit/test_dense_shards.py +242 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/.gitattributes +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/.gitignore +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/.vale.ini +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/LICENSE +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/Makefile +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/README.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/codecov.yml +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/index.html +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/evals/README.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/examples/README.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/index.html +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/noxfile.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/setup.cfg +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/style/README.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/style/boost.css +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/style/boost.js +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/style/demo.html +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.331 → boost_skill_cli-1.0.333}/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.333'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 333)
|
|
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>
|
|
@@ -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.
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
id: mcp-check-skills-before-starting-a-task
|
|
3
3
|
board: code
|
|
4
4
|
section: dx
|
|
5
|
-
status:
|
|
5
|
+
status: shipped
|
|
6
6
|
category: Interop · Adoption
|
|
7
7
|
complexity: S
|
|
8
8
|
impact: High
|
|
9
9
|
wow: 3
|
|
10
10
|
note: agent reflex
|
|
11
11
|
order: 64
|
|
12
|
-
owner:
|
|
12
|
+
owner:
|
|
13
13
|
pr: 318
|
|
14
14
|
title: MCP — check for a skill when a task starts, not only when authoring one
|
|
15
15
|
---
|
|
@@ -28,3 +28,16 @@ check. A closing proportion note bounds it, because an unbounded <em>always chec
|
|
|
28
28
|
turns every trivial turn into a tool call and an agent that learns to ignore the guidance
|
|
29
29
|
ignores all of it. Both triggers and the bound are pinned by tests, so dropping either
|
|
30
30
|
regresses.
|
|
31
|
+
|
|
32
|
+
<b>Shipped — the claim was stale, not the work.</b> PR <code>#318</code> merged and its branch
|
|
33
|
+
is gone, but this item sat at <code>inflight</code> under that branch name, so the board advertised
|
|
34
|
+
live work as taken. Verified against the code rather than the PR state alone:
|
|
35
|
+
<code>mcp.INSTRUCTIONS</code> leads with using an installed skill, names <code>boost_list</code> for
|
|
36
|
+
what is usable right now, and carries the proportion bound this card asks for — “Skip it
|
|
37
|
+
for a question, a one-line edit, or a command you were just handed.” The trigger is pinned by
|
|
38
|
+
<code>test_instructions_lead_with_using_a_skill_not_authoring_one</code>.
|
|
39
|
+
|
|
40
|
+
One note for anyone reading both cards: <code>mcp-one-benefit-nameable-task</code> (<code>#355</code>,
|
|
41
|
+
later) <em>superseded</em> this card's “two declared triggers” framing by demoting
|
|
42
|
+
authoring to a clause on <code>boost_search</code>, on the grounds that it was the rarer moment
|
|
43
|
+
crowding out the common one. The task-start trigger this card argued for is what survived.
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
id: mcp-one-benefit-nameable-task
|
|
3
3
|
board: code
|
|
4
4
|
section: dx
|
|
5
|
-
status:
|
|
5
|
+
status: shipped
|
|
6
6
|
category: Interop · Adoption
|
|
7
7
|
complexity: S
|
|
8
8
|
impact: High
|
|
9
9
|
wow: 3
|
|
10
10
|
note: agent reflex
|
|
11
11
|
order: 74
|
|
12
|
-
owner:
|
|
12
|
+
owner:
|
|
13
13
|
pr: 355
|
|
14
14
|
title: MCP — one benefit, one observable trigger (and stop routing through boost_info)
|
|
15
15
|
---
|
|
@@ -42,3 +42,11 @@ so the hop bought a round-trip and a decision point and nothing else. It stays r
|
|
|
42
42
|
for looking up a name from elsewhere, and its description now says so. All of it is
|
|
43
43
|
pinned by tests, including negative assertions so authoring and the info hop cannot
|
|
44
44
|
creep back.
|
|
45
|
+
|
|
46
|
+
<b>Shipped — the claim was stale, not the work.</b> PR <code>#355</code> merged and its branch
|
|
47
|
+
is gone, yet this item still read as owned. Every element is verifiable in
|
|
48
|
+
<code>mcp.INSTRUCTIONS</code> today: the stated cost (“read-only, take about a second, and
|
|
49
|
+
install nothing”), the miss protocol (“Finding nothing is a good outcome, not a wasted
|
|
50
|
+
call”), “The task stays yours”, and <code>boost_info</code> absent from the
|
|
51
|
+
advertised flow — which <code>test_instructions_route_search_straight_to_install</code> pins
|
|
52
|
+
with a negative assertion so the hop cannot creep back.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
id: pytest-tmpdir-cve-blocked-by-py39-floor
|
|
3
3
|
board: code
|
|
4
4
|
section: pipeline
|
|
5
|
-
status:
|
|
5
|
+
status: declined
|
|
6
6
|
category: Supply chain
|
|
7
7
|
complexity: M
|
|
8
8
|
impact: Low
|
|
@@ -34,3 +34,18 @@ Revisit when either the 3.9 floor is dropped or a patched 8.x lands. If the floo
|
|
|
34
34
|
and the alert must clear, the real mitigation is pointing pytest at a private base
|
|
35
35
|
temp dir (<code>--basetemp</code> / <code>PYTEST_DEBUG_TEMPROOT</code>) so the predictable
|
|
36
36
|
path is never used — that fixes the behaviour without satisfying Dependabot's version check.
|
|
37
|
+
|
|
38
|
+
<b>Declined — recorded as a decision rather than left to look like pending work.</b> The
|
|
39
|
+
alert is already dismissed upstream as <code>tolerable_risk</code>; leaving the card
|
|
40
|
+
<code>planned</code> made the board advertise work that nobody intends to do and that no code change
|
|
41
|
+
could complete.
|
|
42
|
+
|
|
43
|
+
The revisit condition was re-checked rather than assumed: this card says revisit “when either
|
|
44
|
+
the 3.9 floor is dropped or a patched 8.x lands”. PyPI's latest 8.x is still
|
|
45
|
+
<b><code>8.4.2</code></b> — no <code>8.4.3</code>, no <code>8.5</code> — and the advisory
|
|
46
|
+
marks every 8.x vulnerable, so there is nothing to move to. The 3.9 floor is a deliberate
|
|
47
|
+
compatibility promise in <code>pyproject.toml</code>, not an oversight.
|
|
48
|
+
|
|
49
|
+
Reopen this if either condition changes. The residual exposure is unchanged and remains
|
|
50
|
+
contributor-facing only: <code>[project].dependencies</code> is empty, so nobody installing
|
|
51
|
+
<code>boost-skill-cli</code> ever receives pytest.
|
|
@@ -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>
|
|
@@ -2608,7 +2633,7 @@ extra ships it.</p>
|
|
|
2608
2633
|
</article>
|
|
2609
2634
|
|
|
2610
2635
|
<article class="cap rcard" id="pytest-tmpdir-cve-blocked-by-py39-floor">
|
|
2611
|
-
<div class="head"><span class="pill
|
|
2636
|
+
<div class="head"><span class="pill declined">Declined</span><span class="cat">Supply chain</span></div>
|
|
2612
2637
|
<h3>The <code>pytest</code> tmpdir CVE has no fix at our Python floor</h3>
|
|
2613
2638
|
<p>CVE-2025-71176 — pytest through 9.0.2 relies on the predictable
|
|
2614
2639
|
<code>/tmp/pytest-of-{user}</code> path, letting a <b>local</b> user cause a denial of
|
|
@@ -2630,7 +2655,22 @@ ephemeral VMs where the local-attacker precondition does not hold. <b>Dismissed
|
|
|
2630
2655
|
Revisit when either the 3.9 floor is dropped or a patched 8.x lands. If the floor must stay
|
|
2631
2656
|
and the alert must clear, the real mitigation is pointing pytest at a private base
|
|
2632
2657
|
temp dir (<code>--basetemp</code> / <code>PYTEST_DEBUG_TEMPROOT</code>) so the predictable
|
|
2633
|
-
path is never used — that fixes the behaviour without satisfying Dependabot's version check
|
|
2658
|
+
path is never used — that fixes the behaviour without satisfying Dependabot's version check.
|
|
2659
|
+
|
|
2660
|
+
<b>Declined — recorded as a decision rather than left to look like pending work.</b> The
|
|
2661
|
+
alert is already dismissed upstream as <code>tolerable_risk</code>; leaving the card
|
|
2662
|
+
<code>planned</code> made the board advertise work that nobody intends to do and that no code change
|
|
2663
|
+
could complete.
|
|
2664
|
+
|
|
2665
|
+
The revisit condition was re-checked rather than assumed: this card says revisit “when either
|
|
2666
|
+
the 3.9 floor is dropped or a patched 8.x lands”. PyPI's latest 8.x is still
|
|
2667
|
+
<b><code>8.4.2</code></b> — no <code>8.4.3</code>, no <code>8.5</code> — and the advisory
|
|
2668
|
+
marks every 8.x vulnerable, so there is nothing to move to. The 3.9 floor is a deliberate
|
|
2669
|
+
compatibility promise in <code>pyproject.toml</code>, not an oversight.
|
|
2670
|
+
|
|
2671
|
+
Reopen this if either condition changes. The residual exposure is unchanged and remains
|
|
2672
|
+
contributor-facing only: <code>[project].dependencies</code> is empty, so nobody installing
|
|
2673
|
+
<code>boost-skill-cli</code> ever receives pytest.</p>
|
|
2634
2674
|
<div class="meta">
|
|
2635
2675
|
<span class="m">Complexity <b>M</b></span>
|
|
2636
2676
|
<span class="m">Impact <b>Low</b></span>
|
|
@@ -4506,7 +4546,7 @@ three states: a <b>failing</b> actionlint now fails <code>make</code> (exit 2) i
|
|
|
4506
4546
|
</article>
|
|
4507
4547
|
|
|
4508
4548
|
<article class="cap rcard" id="mcp-check-skills-before-starting-a-task">
|
|
4509
|
-
<div class="head"><span class="pill
|
|
4549
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Interop · Adoption</span></div>
|
|
4510
4550
|
<h3>MCP — check for a skill when a task starts, not only when authoring one</h3>
|
|
4511
4551
|
<p><a href="#mcp-search-before-reinventing">The previous pass</a> gave the MCP server
|
|
4512
4552
|
<code>initialize</code> <code>instructions</code> and intent-framed tool descriptions, but
|
|
@@ -4522,7 +4562,20 @@ duplicate install" to "leverage a capability you already have" — it is the fre
|
|
|
4522
4562
|
check. A closing proportion note bounds it, because an unbounded <em>always check first</em>
|
|
4523
4563
|
turns every trivial turn into a tool call and an agent that learns to ignore the guidance
|
|
4524
4564
|
ignores all of it. Both triggers and the bound are pinned by tests, so dropping either
|
|
4525
|
-
regresses
|
|
4565
|
+
regresses.
|
|
4566
|
+
|
|
4567
|
+
<b>Shipped — the claim was stale, not the work.</b> PR <code>#318</code> merged and its branch
|
|
4568
|
+
is gone, but this item sat at <code>inflight</code> under that branch name, so the board advertised
|
|
4569
|
+
live work as taken. Verified against the code rather than the PR state alone:
|
|
4570
|
+
<code>mcp.INSTRUCTIONS</code> leads with using an installed skill, names <code>boost_list</code> for
|
|
4571
|
+
what is usable right now, and carries the proportion bound this card asks for — “Skip it
|
|
4572
|
+
for a question, a one-line edit, or a command you were just handed.” The trigger is pinned by
|
|
4573
|
+
<code>test_instructions_lead_with_using_a_skill_not_authoring_one</code>.
|
|
4574
|
+
|
|
4575
|
+
One note for anyone reading both cards: <code>mcp-one-benefit-nameable-task</code> (<code>#355</code>,
|
|
4576
|
+
later) <em>superseded</em> this card's “two declared triggers” framing by demoting
|
|
4577
|
+
authoring to a clause on <code>boost_search</code>, on the grounds that it was the rarer moment
|
|
4578
|
+
crowding out the common one. The task-start trigger this card argued for is what survived.</p>
|
|
4526
4579
|
<div class="meta">
|
|
4527
4580
|
<span class="m">Complexity <b>S</b></span>
|
|
4528
4581
|
<span class="m hi">Impact <b>High</b></span>
|
|
@@ -4586,7 +4639,7 @@ open: <code>zizmor</code> and <code>gitleaks</code> run only in CI and have no M
|
|
|
4586
4639
|
</article>
|
|
4587
4640
|
|
|
4588
4641
|
<article class="cap rcard" id="mcp-one-benefit-nameable-task">
|
|
4589
|
-
<div class="head"><span class="pill
|
|
4642
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Interop · Adoption</span></div>
|
|
4590
4643
|
<h3>MCP — one benefit, one observable trigger (and stop routing through boost_info)</h3>
|
|
4591
4644
|
<p>Gemini CLI used the boost MCP server only when asked by hand, never on its own.
|
|
4592
4645
|
Two causes, and neither was fixed by writing more instructions.
|
|
@@ -4616,7 +4669,15 @@ already returns each hit's description, the only field that changes an install d
|
|
|
4616
4669
|
so the hop bought a round-trip and a decision point and nothing else. It stays registered
|
|
4617
4670
|
for looking up a name from elsewhere, and its description now says so. All of it is
|
|
4618
4671
|
pinned by tests, including negative assertions so authoring and the info hop cannot
|
|
4619
|
-
creep back
|
|
4672
|
+
creep back.
|
|
4673
|
+
|
|
4674
|
+
<b>Shipped — the claim was stale, not the work.</b> PR <code>#355</code> merged and its branch
|
|
4675
|
+
is gone, yet this item still read as owned. Every element is verifiable in
|
|
4676
|
+
<code>mcp.INSTRUCTIONS</code> today: the stated cost (“read-only, take about a second, and
|
|
4677
|
+
install nothing”), the miss protocol (“Finding nothing is a good outcome, not a wasted
|
|
4678
|
+
call”), “The task stays yours”, and <code>boost_info</code> absent from the
|
|
4679
|
+
advertised flow — which <code>test_instructions_route_search_straight_to_install</code> pins
|
|
4680
|
+
with a negative assertion so the hop cannot creep back.</p>
|
|
4620
4681
|
<div class="meta">
|
|
4621
4682
|
<span class="m">Complexity <b>S</b></span>
|
|
4622
4683
|
<span class="m hi">Impact <b>High</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
|