boost-skill-cli 1.0.69__tar.gz → 1.0.71__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.69 → boost_skill_cli-1.0.71}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/mcp-hub.html +295 -27
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/.gitattributes +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/.gitignore +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/LICENSE +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/Makefile +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/README.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_skill_cli.egg-info/SOURCES.txt +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/index.html +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/docs/roadmap.html +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/index.html +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/setup.cfg +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/style/README.md +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/style/boost.css +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/style/boost.js +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/style/demo.html +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/tests/unit/test_version.py +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.71'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 71)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="utf-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
-
<title>boost —
|
|
7
|
-
<meta name="description" content="How boost's MCP tool layer became an extensible registry: architecture, sequence diagrams, and
|
|
6
|
+
<title>boost — RAG retrieval & the MCP hub (Phases 1–3)</title>
|
|
7
|
+
<meta name="description" content="How boost's MCP tool layer became an extensible registry: architecture, sequence diagrams, and a simple-vs-deep cheat sheet for the Phase-3 hub and its first reach-out tool, boost_discover_github.">
|
|
8
8
|
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Crect width='100' height='100' rx='20' fill='%2307080f'/%3E%3Ctext x='50' y='70' font-size='58' font-family='monospace' font-weight='bold' fill='%2322d3ee' text-anchor='middle'%3E%E2%9C%A6%3C/text%3E%3C/svg%3E">
|
|
9
9
|
<!-- Shared Aurora design system. Recolour everything by editing style/boost.css. -->
|
|
10
10
|
<link rel="stylesheet" href="../style/boost.css">
|
|
@@ -36,12 +36,16 @@
|
|
|
36
36
|
svg .head { font-family: var(--sans); font-size: 13.5px; font-weight: 700; fill: var(--text); }
|
|
37
37
|
svg .note { font-family: var(--mono); font-size: 10.5px; fill: var(--yellow); }
|
|
38
38
|
|
|
39
|
-
/* Cheat sheet: two synced columns of collapsibles (
|
|
39
|
+
/* Cheat sheet: two synced columns of collapsibles (Simple | Deep technical). */
|
|
40
40
|
.cheat { margin-top: 40px; display: grid; grid-template-columns: 1fr 1fr; gap: 16px 18px; }
|
|
41
41
|
.cheat .col-head { font-family: var(--mono); font-size: 12px; font-weight: 700;
|
|
42
42
|
letter-spacing: .04em; padding: 6px 2px; }
|
|
43
43
|
.cheat .col-head.eli { color: var(--sky); }
|
|
44
44
|
.cheat .col-head.tech { color: var(--pink); }
|
|
45
|
+
.cheat .group { grid-column: 1 / -1; margin-top: 14px; padding: 4px 2px 2px;
|
|
46
|
+
font-family: var(--mono); font-size: 12.5px; font-weight: 700;
|
|
47
|
+
color: var(--text-2); border-top: 1px solid var(--line-soft); }
|
|
48
|
+
.cheat .group span { color: var(--cyan); }
|
|
45
49
|
details.card { border: 1px solid var(--line); border-radius: 14px;
|
|
46
50
|
background: var(--panel); padding: 0; transition: border-color .2s ease; }
|
|
47
51
|
details.card[open] { border-color: var(--line-hi); }
|
|
@@ -93,27 +97,204 @@
|
|
|
93
97
|
<main>
|
|
94
98
|
<!-- ===== hero ===== -->
|
|
95
99
|
<div class="wrap hero">
|
|
96
|
-
<p class="crumbs"><a href="index.html">boost</a> / docs / mcp-hub ·
|
|
97
|
-
<span class="badge">RAG
|
|
98
|
-
<h1>
|
|
99
|
-
<p class="lede">boost
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
100
|
+
<p class="crumbs"><a href="index.html">boost</a> / docs / mcp-hub · RAG Phases 1–3</p>
|
|
101
|
+
<span class="badge">RAG · shipped in PR #23 · #30 · #64</span>
|
|
102
|
+
<h1>Semantic skill search, <span class="grad-text">surfaced as a hub</span>.</h1>
|
|
103
|
+
<p class="lede">boost turns tapped skill repos into a searchable corpus and lets an agent ask for
|
|
104
|
+
"the best skill for <task>." Three phases got it there: <b>Phase 1</b> — full-content BM25
|
|
105
|
+
retrieval with an LLM rerank; <b>Phase 2</b> — an opt-in dense embeddings backend; <b>Phase 3</b>
|
|
106
|
+
— an extensible MCP registry that exposes all of it. Everything degrades gracefully and the
|
|
107
|
+
default install stays <b>zero-dependency</b>.</p>
|
|
104
108
|
|
|
105
109
|
<div class="stats">
|
|
106
|
-
<div class="stat reveal"><b>
|
|
107
|
-
<div class="stat reveal"><b>
|
|
110
|
+
<div class="stat reveal"><b>3</b><span>RAG phases shipped</span></div>
|
|
111
|
+
<div class="stat reveal"><b>6</b><span>MCP tools on the registry</span></div>
|
|
108
112
|
<div class="stat reveal"><b>89.6%</b><span>Mutation kill on core/</span></div>
|
|
109
|
-
<div class="stat reveal"><b>0</b><span>
|
|
113
|
+
<div class="stat reveal"><b>0</b><span>Deps in the default install</span></div>
|
|
110
114
|
</div>
|
|
111
115
|
</div>
|
|
112
116
|
|
|
117
|
+
<!-- ===== how the pieces fit ===== -->
|
|
118
|
+
<section>
|
|
119
|
+
<div class="wrap">
|
|
120
|
+
<span class="eyebrow">The whole stack</span>
|
|
121
|
+
<h2 class="sec-title">Three phases, one degrade-safe path</h2>
|
|
122
|
+
<p class="sec-sub">Each phase is a layer that improves retrieval without ever being <i>required</i>.
|
|
123
|
+
If the dense backend isn't installed, search uses BM25; if there's no index yet, it uses
|
|
124
|
+
frontmatter; if there's no LLM, it skips the rerank. Nothing hard-fails.</p>
|
|
125
|
+
|
|
126
|
+
<div class="diagram reveal">
|
|
127
|
+
<svg viewBox="0 0 920 300" role="img" aria-label="Layered overview: Phase 1 full-content BM25 is the always-on floor, Phase 2 dense embeddings is an opt-in accelerator above it, and Phase 3 the MCP registry surfaces both to agents; a frontmatter search underlies everything as the last-resort fallback.">
|
|
128
|
+
<defs>
|
|
129
|
+
<marker id="oa" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
|
130
|
+
<path d="M0 0L10 5L0 10z" fill="#7dd3fc"/>
|
|
131
|
+
</marker>
|
|
132
|
+
</defs>
|
|
133
|
+
<!-- layers -->
|
|
134
|
+
<rect x="120" y="30" width="680" height="46" rx="10" fill="rgba(34,211,238,.08)" stroke="#22d3ee" stroke-width="1.2"/>
|
|
135
|
+
<text x="140" y="58" class="head">Phase 3 · MCP registry</text>
|
|
136
|
+
<text x="785" y="58" text-anchor="end" class="lbl-s">boost_search → rag.search()</text>
|
|
137
|
+
|
|
138
|
+
<rect x="180" y="96" width="560" height="46" rx="10" fill="rgba(244,114,208,.08)" stroke="#f472d0" stroke-width="1.2"/>
|
|
139
|
+
<text x="200" y="124" class="head">Phase 2 · dense embeddings <tspan class="lbl-t">(opt-in [rag])</tspan></text>
|
|
140
|
+
<text x="725" y="124" text-anchor="end" class="lbl-s">sqlite-vec · cosine KNN</text>
|
|
141
|
+
|
|
142
|
+
<rect x="180" y="162" width="560" height="46" rx="10" fill="rgba(74,222,128,.08)" stroke="#4ade80" stroke-width="1.2"/>
|
|
143
|
+
<text x="200" y="190" class="head">Phase 1 · full-content BM25 <tspan class="lbl-t">(always on)</tspan></text>
|
|
144
|
+
<text x="725" y="190" text-anchor="end" class="lbl-s">rag_index.json · LLM rerank</text>
|
|
145
|
+
|
|
146
|
+
<rect x="240" y="228" width="440" height="42" rx="10" fill="rgba(255,255,255,.03)" stroke="var(--line-hi)"/>
|
|
147
|
+
<text x="460" y="254" text-anchor="middle" class="lbl-s">catalog.search — frontmatter (last-resort fallback)</text>
|
|
148
|
+
|
|
149
|
+
<!-- degrade arrows -->
|
|
150
|
+
<line x1="90" y1="53" x2="90" y2="249" stroke="#676d86" stroke-width="1.2" stroke-dasharray="4 3" marker-end="url(#oa)"/>
|
|
151
|
+
<text x="40" y="150" class="lbl-t" transform="rotate(-90 40 150)">degrade downward</text>
|
|
152
|
+
</svg>
|
|
153
|
+
</div>
|
|
154
|
+
<p class="caption">Fig 1 — The layers are a <b>preference order</b>, not a pipeline: retrieval picks
|
|
155
|
+
the highest layer that's actually available and falls through on absence.</p>
|
|
156
|
+
</div>
|
|
157
|
+
</section>
|
|
158
|
+
|
|
159
|
+
<!-- ===== indexing ===== -->
|
|
160
|
+
<section>
|
|
161
|
+
<div class="wrap">
|
|
162
|
+
<span class="eyebrow">Indexing · <code>boost reindex</code></span>
|
|
163
|
+
<h2 class="sec-title">From cloned repos to two stores</h2>
|
|
164
|
+
<p class="sec-sub">Tapping a repo already clones its skills to local disk, so building the index is a
|
|
165
|
+
<b>local batch job — no extra network</b> for BM25. Bodies are stripped of frontmatter, chunked, and
|
|
166
|
+
written to a persisted, commit-keyed index; the opt-in dense store additionally embeds each chunk.</p>
|
|
167
|
+
|
|
168
|
+
<div class="diagram reveal">
|
|
169
|
+
<svg viewBox="0 0 920 340" role="img" aria-label="Indexing pipeline: tapped repos on disk are read and stripped of frontmatter, chunked into overlapping passages, then written to the always-on BM25 JSON index and, optionally, embedded via Voyage or OpenAI into the sqlite-vec dense store. Both indexes are commit-keyed for incremental reuse.">
|
|
170
|
+
<defs>
|
|
171
|
+
<marker id="ia" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
|
172
|
+
<path d="M0 0L10 5L0 10z" fill="#7dd3fc"/>
|
|
173
|
+
</marker>
|
|
174
|
+
<marker id="iap" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
|
175
|
+
<path d="M0 0L10 5L0 10z" fill="#f472d0"/>
|
|
176
|
+
</marker>
|
|
177
|
+
</defs>
|
|
178
|
+
<!-- source -->
|
|
179
|
+
<rect x="30" y="120" width="170" height="80" rx="12" fill="rgba(255,255,255,.03)" stroke="var(--line-hi)"/>
|
|
180
|
+
<text x="115" y="150" text-anchor="middle" class="head">tapped repos</text>
|
|
181
|
+
<text x="115" y="170" text-anchor="middle" class="lbl-s">~/.boost/repos</text>
|
|
182
|
+
<text x="115" y="187" text-anchor="middle" class="lbl-t">SKILL.md bodies</text>
|
|
183
|
+
|
|
184
|
+
<!-- read/chunk -->
|
|
185
|
+
<rect x="240" y="120" width="180" height="80" rx="12" fill="rgba(56,189,248,.07)" stroke="#38bdf8" stroke-width="1.2"/>
|
|
186
|
+
<text x="330" y="146" text-anchor="middle" class="head">read_body → chunk</text>
|
|
187
|
+
<text x="330" y="166" text-anchor="middle" class="lbl-s">strip frontmatter</text>
|
|
188
|
+
<text x="330" y="184" text-anchor="middle" class="lbl-t">1000 chars · 150 overlap · ≤40</text>
|
|
189
|
+
<line x1="200" y1="160" x2="240" y2="160" stroke="#7dd3fc" stroke-width="1.4" marker-end="url(#ia)"/>
|
|
190
|
+
|
|
191
|
+
<!-- bm25 store -->
|
|
192
|
+
<rect x="480" y="40" width="180" height="86" rx="12" fill="rgba(74,222,128,.08)" stroke="#4ade80" stroke-width="1.3"/>
|
|
193
|
+
<text x="570" y="68" text-anchor="middle" class="head">BM25 index</text>
|
|
194
|
+
<text x="570" y="88" text-anchor="middle" class="lbl-s">rag_index.json</text>
|
|
195
|
+
<text x="570" y="105" text-anchor="middle" class="lbl-t">postings · k1=1.2 · b=0.75</text>
|
|
196
|
+
<text x="570" y="120" text-anchor="middle" class="note">always on · stdlib</text>
|
|
197
|
+
<line x1="420" y1="150" x2="480" y2="100" stroke="#7dd3fc" stroke-width="1.4" marker-end="url(#ia)"/>
|
|
198
|
+
|
|
199
|
+
<!-- embed -->
|
|
200
|
+
<rect x="480" y="200" width="180" height="86" rx="12" fill="rgba(244,114,208,.07)" stroke="#f472d0" stroke-width="1.2"/>
|
|
201
|
+
<text x="570" y="228" text-anchor="middle" class="head">embed (urllib)</text>
|
|
202
|
+
<text x="570" y="248" text-anchor="middle" class="lbl-s">Voyage · OpenAI</text>
|
|
203
|
+
<text x="570" y="265" text-anchor="middle" class="lbl-t">voyage-3 1024 / t-e-3-small 1536</text>
|
|
204
|
+
<text x="570" y="280" text-anchor="middle" class="note">opt-in · needs key</text>
|
|
205
|
+
<line x1="420" y1="170" x2="480" y2="235" stroke="#f472d0" stroke-width="1.4" marker-end="url(#iap)"/>
|
|
206
|
+
|
|
207
|
+
<!-- dense store -->
|
|
208
|
+
<rect x="710" y="200" width="180" height="86" rx="12" fill="rgba(168,85,247,.08)" stroke="#a855f7" stroke-width="1.2"/>
|
|
209
|
+
<text x="800" y="228" text-anchor="middle" class="head">dense store</text>
|
|
210
|
+
<text x="800" y="248" text-anchor="middle" class="lbl-s">rag_vectors.sqlite</text>
|
|
211
|
+
<text x="800" y="265" text-anchor="middle" class="lbl-t">sqlite-vec vec0</text>
|
|
212
|
+
<text x="800" y="280" text-anchor="middle" class="note">cosine distance</text>
|
|
213
|
+
<line x1="660" y1="243" x2="710" y2="243" stroke="#f472d0" stroke-width="1.4" marker-end="url(#iap)"/>
|
|
214
|
+
|
|
215
|
+
<!-- commit key note -->
|
|
216
|
+
<rect x="240" y="238" width="180" height="60" rx="10" fill="rgba(250,204,21,.05)" stroke="#facc15" stroke-width="1"/>
|
|
217
|
+
<text x="330" y="262" text-anchor="middle" class="note">commit-keyed per tap</text>
|
|
218
|
+
<text x="330" y="280" text-anchor="middle" class="lbl-t">unchanged taps reused</text>
|
|
219
|
+
<line x1="330" y1="200" x2="330" y2="238" stroke="#facc15" stroke-width="1" stroke-dasharray="4 3" marker-end="url(#ia)"/>
|
|
220
|
+
</svg>
|
|
221
|
+
</div>
|
|
222
|
+
<p class="caption">Fig 2 — <code>boost reindex</code> builds the BM25 store; <code>boost reindex --dense</code>
|
|
223
|
+
additionally embeds each chunk. Both key on the git commit already recorded per tap, so only
|
|
224
|
+
changed taps are re-read.</p>
|
|
225
|
+
</div>
|
|
226
|
+
</section>
|
|
227
|
+
|
|
228
|
+
<!-- ===== query pipeline ===== -->
|
|
229
|
+
<section>
|
|
230
|
+
<div class="wrap">
|
|
231
|
+
<span class="eyebrow">Query · <code>rag.search()</code></span>
|
|
232
|
+
<h2 class="sec-title">Retrieve, then rerank</h2>
|
|
233
|
+
<p class="sec-sub">A search is two stages. First <code>_retrieve_any</code> pulls a wide shortlist
|
|
234
|
+
(<code>max(60, limit×4)</code>) from the best available engine; then, if an LLM is present, it
|
|
235
|
+
reorders the top of that shortlist by task fit — otherwise it keeps the retrieval order.</p>
|
|
236
|
+
|
|
237
|
+
<div class="diagram reveal">
|
|
238
|
+
<svg viewBox="0 0 920 380" role="img" aria-label="Query pipeline: rag.search calls _retrieve_any, which prefers the dense backend when ready, falls to BM25 when an index exists, and returns None to let the caller use catalog.search; the shortlist is then reranked by the LLM bridge when available, otherwise kept in retrieval order.">
|
|
239
|
+
<defs>
|
|
240
|
+
<marker id="qa" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
|
241
|
+
<path d="M0 0L10 5L0 10z" fill="#7dd3fc"/>
|
|
242
|
+
</marker>
|
|
243
|
+
<marker id="qg" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
|
244
|
+
<path d="M0 0L10 5L0 10z" fill="#4ade80"/>
|
|
245
|
+
</marker>
|
|
246
|
+
</defs>
|
|
247
|
+
<!-- query -->
|
|
248
|
+
<rect x="30" y="150" width="150" height="60" rx="12" fill="rgba(56,189,248,.08)" stroke="#38bdf8" stroke-width="1.2"/>
|
|
249
|
+
<text x="105" y="178" text-anchor="middle" class="head">query</text>
|
|
250
|
+
<text x="105" y="196" text-anchor="middle" class="lbl-s">"test my React app"</text>
|
|
251
|
+
|
|
252
|
+
<!-- retrieve_any -->
|
|
253
|
+
<rect x="220" y="130" width="200" height="100" rx="12" fill="rgba(34,211,238,.07)" stroke="#22d3ee" stroke-width="1.3"/>
|
|
254
|
+
<text x="320" y="158" text-anchor="middle" class="head">_retrieve_any()</text>
|
|
255
|
+
<text x="320" y="178" text-anchor="middle" class="lbl-s">stage 1 · wide shortlist</text>
|
|
256
|
+
<text x="320" y="196" text-anchor="middle" class="lbl-t">k = max(60, limit×4)</text>
|
|
257
|
+
<text x="320" y="214" text-anchor="middle" class="lbl-t">per-(name,tap) max over chunks</text>
|
|
258
|
+
<line x1="180" y1="180" x2="220" y2="180" stroke="#7dd3fc" stroke-width="1.4" marker-end="url(#qa)"/>
|
|
259
|
+
|
|
260
|
+
<!-- engine choices -->
|
|
261
|
+
<rect x="470" y="40" width="210" height="52" rx="9" fill="rgba(168,85,247,.08)" stroke="#a855f7" stroke-width="1.2"/>
|
|
262
|
+
<text x="575" y="62" text-anchor="middle" class="lbl">dense.ready() → dense KNN</text>
|
|
263
|
+
<text x="575" y="80" text-anchor="middle" class="lbl-t">"dense vectors"</text>
|
|
264
|
+
<rect x="470" y="104" width="210" height="52" rx="9" fill="rgba(74,222,128,.08)" stroke="#4ade80" stroke-width="1.2"/>
|
|
265
|
+
<text x="575" y="126" text-anchor="middle" class="lbl">else ready() → BM25</text>
|
|
266
|
+
<text x="575" y="144" text-anchor="middle" class="lbl-t">"BM25 full-content"</text>
|
|
267
|
+
<rect x="470" y="168" width="210" height="52" rx="9" fill="rgba(255,255,255,.03)" stroke="var(--line-hi)"/>
|
|
268
|
+
<text x="575" y="190" text-anchor="middle" class="lbl">else None → catalog.search</text>
|
|
269
|
+
<text x="575" y="208" text-anchor="middle" class="lbl-t">frontmatter fallback</text>
|
|
270
|
+
<line x1="420" y1="165" x2="470" y2="70" stroke="#7dd3fc" stroke-width="1.1" marker-end="url(#qa)"/>
|
|
271
|
+
<line x1="420" y1="178" x2="470" y2="130" stroke="#7dd3fc" stroke-width="1.1" marker-end="url(#qa)"/>
|
|
272
|
+
<line x1="420" y1="192" x2="470" y2="194" stroke="#7dd3fc" stroke-width="1.1" marker-end="url(#qa)"/>
|
|
273
|
+
|
|
274
|
+
<!-- rerank -->
|
|
275
|
+
<rect x="470" y="270" width="380" height="86" rx="12" fill="rgba(244,114,208,.06)" stroke="#f472d0" stroke-width="1.2"/>
|
|
276
|
+
<text x="660" y="298" text-anchor="middle" class="head">stage 2 · rerank()</text>
|
|
277
|
+
<text x="660" y="318" text-anchor="middle" class="lbl-s">ai.available() ? LLM orders names : keep BM25 order</text>
|
|
278
|
+
<text x="660" y="336" text-anchor="middle" class="lbl-t">returns (hits, ranker label)</text>
|
|
279
|
+
<line x1="575" y1="220" x2="620" y2="270" stroke="#7dd3fc" stroke-width="1.2" marker-end="url(#qa)"/>
|
|
280
|
+
|
|
281
|
+
<!-- result -->
|
|
282
|
+
<rect x="700" y="150" width="190" height="60" rx="12" fill="rgba(74,222,128,.07)" stroke="#4ade80" stroke-width="1.2"/>
|
|
283
|
+
<text x="795" y="178" text-anchor="middle" class="head">ranked shortlist</text>
|
|
284
|
+
<text x="795" y="196" text-anchor="middle" class="lbl-t">names + why + engine</text>
|
|
285
|
+
<line x1="850" y1="300" x2="850" y2="210" stroke="#4ade80" stroke-width="1.4" marker-end="url(#qg)"/>
|
|
286
|
+
</svg>
|
|
287
|
+
</div>
|
|
288
|
+
<p class="caption">Fig 3 — <code>search()</code> returns <code>None</code> only when <i>no</i> index exists,
|
|
289
|
+
which is the single signal the MCP <code>boost_search</code> tool uses to fall back to frontmatter
|
|
290
|
+
search — so a brand-new install still answers.</p>
|
|
291
|
+
</div>
|
|
292
|
+
</section>
|
|
293
|
+
|
|
113
294
|
<!-- ===== architecture ===== -->
|
|
114
295
|
<section>
|
|
115
296
|
<div class="wrap">
|
|
116
|
-
<span class="eyebrow">
|
|
297
|
+
<span class="eyebrow">The hub · architecture</span>
|
|
117
298
|
<h2 class="sec-title">One registry, many handlers</h2>
|
|
118
299
|
<p class="sec-sub">The JSON-RPC server never knows what tools exist — it asks the
|
|
119
300
|
<code>Registry</code> in <code>core/mcp.py</code>. Handlers that reach out to the world
|
|
@@ -196,16 +377,17 @@
|
|
|
196
377
|
<text x="196" y="290" class="lbl-t">handlers call the engine</text>
|
|
197
378
|
</svg>
|
|
198
379
|
</div>
|
|
199
|
-
<p class="caption">Fig
|
|
380
|
+
<p class="caption">Fig 4 — The server holds no tool knowledge; it delegates every
|
|
200
381
|
<code>tools/list</code> / <code>tools/call</code> to the registry. New tools slot in on the
|
|
201
|
-
right without touching the loop on the left
|
|
382
|
+
right without touching the loop on the left. <code>boost_search</code> is the handler that
|
|
383
|
+
calls <code>rag.search()</code> from Fig 3.</p>
|
|
202
384
|
</div>
|
|
203
385
|
</section>
|
|
204
386
|
|
|
205
387
|
<!-- ===== sequence ===== -->
|
|
206
388
|
<section>
|
|
207
389
|
<div class="wrap">
|
|
208
|
-
<span class="eyebrow">
|
|
390
|
+
<span class="eyebrow">The hub · sequence</span>
|
|
209
391
|
<h2 class="sec-title">A <code>boost_discover_github</code> call, end to end</h2>
|
|
210
392
|
<p class="sec-sub">The happy path reaches GitHub; the shaded branch is what happens when
|
|
211
393
|
<code>gh</code> is missing or the search fails — the server answers, never dies.</p>
|
|
@@ -270,7 +452,7 @@
|
|
|
270
452
|
<text x="316" y="428" class="lbl-s" fill="#facc15">handler returns ("install gh …" / "search failed …", is_error=True) — server still replies</text>
|
|
271
453
|
</svg>
|
|
272
454
|
</div>
|
|
273
|
-
<p class="caption">Fig
|
|
455
|
+
<p class="caption">Fig 5 — Steps 5–6 are the only ones that touch the network. Everything
|
|
274
456
|
below step 4 has a mirror in the shaded <code>alt</code> branch, so a missing dependency is
|
|
275
457
|
a <i>message</i>, not an exception.</p>
|
|
276
458
|
</div>
|
|
@@ -322,14 +504,98 @@ _MCP_TOOLS = REGISTRY.specs() <span class="cm"># list stays in sync</span>
|
|
|
322
504
|
<div class="wrap">
|
|
323
505
|
<span class="eyebrow">Cheat sheet</span>
|
|
324
506
|
<h2 class="sec-title">Explain it two ways</h2>
|
|
325
|
-
<p class="sec-sub">Every concept, twice: the <b class="tag-was" style="color:var(--sky)">
|
|
326
|
-
the left, the <b style="color:var(--pink)">deep technical</b> on the right. Open both
|
|
327
|
-
compare — they describe the same thing at different altitudes.</p>
|
|
507
|
+
<p class="sec-sub">Every concept, twice: the <b class="tag-was" style="color:var(--sky)">simple</b>
|
|
508
|
+
version on the left, the <b style="color:var(--pink)">deep technical</b> on the right. Open both
|
|
509
|
+
and compare — they describe the same thing at different altitudes.</p>
|
|
328
510
|
|
|
329
511
|
<div class="cheat reveal">
|
|
330
|
-
<div class="col-head eli">🧸
|
|
512
|
+
<div class="col-head eli">🧸 Simple</div>
|
|
331
513
|
<div class="col-head tech">🔬 Deep technical</div>
|
|
332
514
|
|
|
515
|
+
<div class="group">Retrieval engine · <span>Phases 1–2</span></div>
|
|
516
|
+
|
|
517
|
+
<!-- Chunking -->
|
|
518
|
+
<details class="card eli5">
|
|
519
|
+
<summary>Cut pages into index cards <span class="topic-tag">chunking</span></summary>
|
|
520
|
+
<div class="body"><p>A whole skill page is too big to match on well. So we cut it into small
|
|
521
|
+
overlapping index cards. Overlap means a sentence that lands on the seam still shows up
|
|
522
|
+
whole on one card, so we never lose it.</p></div>
|
|
523
|
+
</details>
|
|
524
|
+
<details class="card tech">
|
|
525
|
+
<summary>Passage-level chunking <span class="topic-tag">rag.chunk()</span></summary>
|
|
526
|
+
<div class="body"><p><code>read_body</code> pulls each item's Markdown from
|
|
527
|
+
<code>~/.boost/repos</code> and strips frontmatter; <code>chunk()</code> slices it into
|
|
528
|
+
~<code>1000</code>-char windows with <code>150</code>-char overlap, capped at
|
|
529
|
+
<code>40</code> chunks per item. Retrieval is therefore <i>passage-level</i>: a match on
|
|
530
|
+
one section surfaces the whole skill, scored by its best chunk.</p></div>
|
|
531
|
+
</details>
|
|
532
|
+
|
|
533
|
+
<!-- BM25 -->
|
|
534
|
+
<details class="card eli5">
|
|
535
|
+
<summary>Which words really matter <span class="topic-tag">BM25</span></summary>
|
|
536
|
+
<div class="body"><p>To rank cards, we count shared words — but rare words ("jest") count
|
|
537
|
+
more than common ones ("the"), and a long card doesn't win just for being long. That's
|
|
538
|
+
the always-on ranker; it needs no internet and no AI.</p></div>
|
|
539
|
+
</details>
|
|
540
|
+
<details class="card tech">
|
|
541
|
+
<summary>Full-content BM25 <span class="topic-tag">k1=1.2 · b=0.75</span></summary>
|
|
542
|
+
<div class="body"><p>Phase 1: a pure-stdlib sparse ranker over full bodies
|
|
543
|
+
(<code>K1=1.2</code>, <code>B=0.75</code>), scoring by term frequency × inverse document
|
|
544
|
+
frequency with length normalization. Per <code>(name, tap)</code> the max chunk score
|
|
545
|
+
wins. The postings live in a persisted <code>rag_index.json</code> with the tuning
|
|
546
|
+
<code>params</code> stored inline, so they're tunable without a format change.</p></div>
|
|
547
|
+
</details>
|
|
548
|
+
|
|
549
|
+
<!-- two-stage -->
|
|
550
|
+
<details class="card eli5">
|
|
551
|
+
<summary>Big handful, then a wise sort <span class="topic-tag">two-stage</span></summary>
|
|
552
|
+
<div class="body"><p>First grab a generous handful of maybe-matches fast. Then, if a smart
|
|
553
|
+
helper (an AI) is around, ask it to put the very best on top for your exact task. If it's
|
|
554
|
+
not around, the fast ranking is already pretty good — we just use that.</p></div>
|
|
555
|
+
</details>
|
|
556
|
+
<details class="card tech">
|
|
557
|
+
<summary>Retrieve → LLM rerank <span class="topic-tag">rag.search()</span></summary>
|
|
558
|
+
<div class="body"><p>Stage 1: <code>_retrieve_any</code> returns a wide shortlist of
|
|
559
|
+
<code>max(60, limit×4)</code>. Stage 2: <code>rerank()</code> asks the
|
|
560
|
+
<code>core/ai.py</code> bridge (local <code>claude</code> CLI → <code>ANTHROPIC_API_KEY</code>)
|
|
561
|
+
to reorder names best-first, tagging the result <code>"Claude relevance"</code>; with no
|
|
562
|
+
LLM it returns the retrieval order tagged <code>"BM25 full-content"</code>.</p></div>
|
|
563
|
+
</details>
|
|
564
|
+
|
|
565
|
+
<!-- dense -->
|
|
566
|
+
<details class="card eli5">
|
|
567
|
+
<summary>Search by meaning, not words <span class="topic-tag">dense</span></summary>
|
|
568
|
+
<div class="body"><p>An optional upgrade turns every skill into a point in "meaning space,"
|
|
569
|
+
so "test my React app" can find a <code>jest</code> skill even with no shared words —
|
|
570
|
+
it just finds the nearest points. It's optional because it needs an extra install and a key.</p></div>
|
|
571
|
+
</details>
|
|
572
|
+
<details class="card tech">
|
|
573
|
+
<summary>Dense embeddings + sqlite-vec <span class="topic-tag">Phase 2 · [rag]</span></summary>
|
|
574
|
+
<div class="body"><p>Chunks are embedded via <code>embed</code> over urllib — preferring
|
|
575
|
+
<code>VOYAGE_API_KEY</code> (<code>voyage-3</code>, 1024-d) then <code>OPENAI_API_KEY</code>
|
|
576
|
+
(<code>text-embedding-3-small</code>, 1536-d) — and stored in a <code>sqlite-vec</code>
|
|
577
|
+
<code>vec0(… distance_metric=cosine)</code> table. Retrieval does a KNN over-fetch
|
|
578
|
+
(<code>max(k×8, 200)</code>) then reduces per-entry. A provider/dimension change
|
|
579
|
+
invalidates the store so stale vectors are never served.</p></div>
|
|
580
|
+
</details>
|
|
581
|
+
|
|
582
|
+
<!-- incremental -->
|
|
583
|
+
<details class="card eli5">
|
|
584
|
+
<summary>Only re-read what changed <span class="topic-tag">incremental</span></summary>
|
|
585
|
+
<div class="body"><p>When you refresh, we don't re-read every shelf — only the ones whose
|
|
586
|
+
books actually changed since last time. That keeps refreshes quick even with a big library.</p></div>
|
|
587
|
+
</details>
|
|
588
|
+
<details class="card tech">
|
|
589
|
+
<summary>Commit-keyed reuse <span class="topic-tag">boost reindex</span></summary>
|
|
590
|
+
<div class="body"><p>Both stores key on the git commit already recorded per tap. On
|
|
591
|
+
rebuild, unchanged taps are reused verbatim and only changed taps' rows are replaced
|
|
592
|
+
(<code>reused</code> / <code>reindexed</code> in the stats). Bumping
|
|
593
|
+
<code>INDEX_VERSION</code> wipes and rebuilds. Because taps are already cloned to disk,
|
|
594
|
+
BM25 indexing needs <b>no network</b>.</p></div>
|
|
595
|
+
</details>
|
|
596
|
+
|
|
597
|
+
<div class="group">The hub · <span>Phase 3</span></div>
|
|
598
|
+
|
|
333
599
|
<!-- Registry -->
|
|
334
600
|
<details class="card eli5">
|
|
335
601
|
<summary>The toy box <span class="topic-tag">registry</span></summary>
|
|
@@ -459,10 +725,12 @@ REGISTRY.register(
|
|
|
459
725
|
|
|
460
726
|
<footer>
|
|
461
727
|
<div class="wrap">
|
|
462
|
-
<p>boost · <b>
|
|
463
|
-
<a href="rag-architecture.md">rag-architecture.md
|
|
464
|
-
<a href="index.html">docs home</a> ·
|
|
465
|
-
<a href="https://github.com/jonnyeclectic/boost/pull/
|
|
728
|
+
<p>boost · <b>RAG retrieval & the MCP hub</b> (Phases 1–3) — full design in
|
|
729
|
+
<a href="rag-architecture.md">rag-architecture.md</a> ·
|
|
730
|
+
<a href="index.html">docs home</a> · PRs
|
|
731
|
+
<a href="https://github.com/jonnyeclectic/boost/pull/23">#23</a>
|
|
732
|
+
<a href="https://github.com/jonnyeclectic/boost/pull/30">#30</a>
|
|
733
|
+
<a href="https://github.com/jonnyeclectic/boost/pull/64">#64</a><br>
|
|
466
734
|
Styled with the shared <a href="../style/boost.css">Aurora</a> design system.</p>
|
|
467
735
|
</div>
|
|
468
736
|
</footer>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{boost_skill_cli-1.0.69 → boost_skill_cli-1.0.71}/boost_skill_cli.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|