boost-skill-cli 1.0.342__tar.gz → 1.0.344__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.342 → boost_skill_cli-1.0.344}/CLAUDE.md +1 -1
- {boost_skill_cli-1.0.342/boost_skill_cli.egg-info → boost_skill_cli-1.0.344}/PKG-INFO +3 -3
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/README.md +2 -2
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/cli.py +1 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/intelligence.py +99 -0
- boost_skill_cli-1.0.344/boost_cli/core/chat.py +242 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344/boost_skill_cli.egg-info}/PKG-INFO +3 -3
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_skill_cli.egg-info/SOURCES.txt +9 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel.html +2 -2
- boost_skill_cli-1.0.344/docs/chat.html +143 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/commands.html +19 -2
- boost_skill_cli-1.0.344/docs/demo-index.json +1 -0
- boost_skill_cli-1.0.344/docs/demo.gif +0 -0
- boost_skill_cli-1.0.344/docs/demo.html +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/index.html +6 -3
- boost_skill_cli-1.0.344/docs/roadmap/items/chat-command-grounded-conversational-search.md +60 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +32 -2
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap.html +89 -3
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/pyproject.toml +3 -1
- boost_skill_cli-1.0.344/scripts/build_demo_index.py +74 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/post_deploy_smoke.py +2 -0
- boost_skill_cli-1.0.344/tests/functional/test_cli_chat.py +99 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_configuration.py +3 -3
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_everyday_loop.py +1 -1
- boost_skill_cli-1.0.344/tests/unit/test_chat.py +192 -0
- boost_skill_cli-1.0.344/tests/unit/test_demo_index.py +108 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_errors_and_cli_table.py +6 -6
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/visual/a11y_check.mjs +1 -0
- boost_skill_cli-1.0.342/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.gitattributes +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.gitignore +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.vale.ini +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/LICENSE +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/Makefile +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/codecov.yml +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/evals/README.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/examples/README.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/index.html +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/noxfile.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/setup.cfg +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/style/README.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/style/boost.css +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/style/boost.js +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/style/demo.html +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/visual/visual_check.mjs +0 -0
|
@@ -181,7 +181,7 @@ for both — edit items, run `build_roadmap.py`, never touch the HTML by hand.
|
|
|
181
181
|
## Architecture
|
|
182
182
|
|
|
183
183
|
**CLI dispatch.** `boost_cli/cli.py` holds `COMMANDS`, the single
|
|
184
|
-
source-of-truth list of `(name, group, module, summary)` for all
|
|
184
|
+
source-of-truth list of `(name, group, module, summary)` for all 79 commands.
|
|
185
185
|
Each command is implemented as `def cmd_<name_with_underscores>(argv) -> int`
|
|
186
186
|
inside `boost_cli/commands/<module>.py`, and `_dispatch` imports that module
|
|
187
187
|
lazily on invocation — so `boost --help` stays instant and command modules are
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.344
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -927,7 +927,7 @@ boost doctor # sanity check: broken links, lock drift, stale taps
|
|
|
927
927
|
boost bundle dump > Boostfile # everyone else runs: boost bundle install
|
|
928
928
|
```
|
|
929
929
|
|
|
930
|
-
##
|
|
930
|
+
## 79 commands, organized into 8 groups
|
|
931
931
|
|
|
932
932
|
`boost --help` prints the full grouped command list; for a visual tour see
|
|
933
933
|
[`docs/index.html`](docs/index.html), and for every flag of every command see
|
|
@@ -1082,7 +1082,7 @@ Four layers, all enforced (`make check` runs the full set; CI runs the same thin
|
|
|
1082
1082
|
|
|
1083
1083
|
| Layer | What it does | Gate |
|
|
1084
1084
|
|---|---|---|
|
|
1085
|
-
| `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all
|
|
1085
|
+
| `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all 79 commands in-process against sandboxed homes) | **≥80% line coverage** of `boost_cli` (`fail_under` in pyproject.toml) |
|
|
1086
1086
|
| `make smoke` | `tests/smoke.sh` — 170 checks run through the actual `./boost` shim (`--online` also hits real registries) | all pass |
|
|
1087
1087
|
| `make mutation` | [mutmut] mutates `boost_cli/core` (~9,900 mutants) and reruns the unit suite against each one | **≥80% killed** (`scripts/mutation_gate.py`) |
|
|
1088
1088
|
| `make evals` | scores the search ranker on a graded golden set — recall@5/@10, MRR, nDCG@5/@10 | **metric floors + no statistically significant regression** (`scripts/eval_gate.py`) |
|
|
@@ -209,7 +209,7 @@ boost doctor # sanity check: broken links, lock drift, stale taps
|
|
|
209
209
|
boost bundle dump > Boostfile # everyone else runs: boost bundle install
|
|
210
210
|
```
|
|
211
211
|
|
|
212
|
-
##
|
|
212
|
+
## 79 commands, organized into 8 groups
|
|
213
213
|
|
|
214
214
|
`boost --help` prints the full grouped command list; for a visual tour see
|
|
215
215
|
[`docs/index.html`](docs/index.html), and for every flag of every command see
|
|
@@ -364,7 +364,7 @@ Four layers, all enforced (`make check` runs the full set; CI runs the same thin
|
|
|
364
364
|
|
|
365
365
|
| Layer | What it does | Gate |
|
|
366
366
|
|---|---|---|
|
|
367
|
-
| `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all
|
|
367
|
+
| `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all 79 commands in-process against sandboxed homes) | **≥80% line coverage** of `boost_cli` (`fail_under` in pyproject.toml) |
|
|
368
368
|
| `make smoke` | `tests/smoke.sh` — 170 checks run through the actual `./boost` shim (`--online` also hits real registries) | all pass |
|
|
369
369
|
| `make mutation` | [mutmut] mutates `boost_cli/core` (~9,900 mutants) and reruns the unit suite against each one | **≥80% killed** (`scripts/mutation_gate.py`) |
|
|
370
370
|
| `make evals` | scores the search ranker on a graded golden set — recall@5/@10, MRR, nDCG@5/@10 | **metric floors + no statistically significant regression** (`scripts/eval_gate.py`) |
|
|
@@ -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.344'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 344)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -90,6 +90,7 @@ COMMANDS = [
|
|
|
90
90
|
("taps", "tap", "taps", "List all configured registry taps"),
|
|
91
91
|
("outdated", "tap", "taps", "Show skills with available updates"),
|
|
92
92
|
# Intelligence (8)
|
|
93
|
+
("chat", "ai", "intelligence", "Ask about skills in plain language (RAG-grounded)"),
|
|
93
94
|
("distill", "ai", "intelligence", "Merge multiple skills into one deduplicated skill"),
|
|
94
95
|
("simulate", "ai", "intelligence", "Preview how a skill would change Claude's behavior"),
|
|
95
96
|
("infer", "ai", "intelligence", "Generate a SKILL.md from your codebase patterns"),
|
|
@@ -28,9 +28,13 @@ from ..core import (
|
|
|
28
28
|
journal,
|
|
29
29
|
lockfile,
|
|
30
30
|
paths,
|
|
31
|
+
registry,
|
|
31
32
|
store,
|
|
32
33
|
util,
|
|
33
34
|
)
|
|
35
|
+
from ..core import (
|
|
36
|
+
chat as chat_engine,
|
|
37
|
+
)
|
|
34
38
|
from ..core import output as out
|
|
35
39
|
from ..errors import BoostError
|
|
36
40
|
|
|
@@ -1035,3 +1039,98 @@ def _repo_activity(since: str) -> Tuple[Optional[int], Optional[int]]:
|
|
|
1035
1039
|
if proc.returncode == 0:
|
|
1036
1040
|
files = len({ln.strip() for ln in proc.stdout.splitlines() if ln.strip()})
|
|
1037
1041
|
return commits, files
|
|
1042
|
+
|
|
1043
|
+
|
|
1044
|
+
def _print_reply(reply: chat_engine.Reply, show_sources: bool) -> None:
|
|
1045
|
+
"""Render one answer: the prose, then where it came from.
|
|
1046
|
+
|
|
1047
|
+
Citations are not decoration here. The next thing a user does with an answer
|
|
1048
|
+
is install code that runs inside their agent, so every recommendation has to
|
|
1049
|
+
be checkable against a real catalogue entry.
|
|
1050
|
+
"""
|
|
1051
|
+
for line in reply.text.splitlines():
|
|
1052
|
+
out.info(line)
|
|
1053
|
+
if show_sources and reply.skills:
|
|
1054
|
+
out.info("")
|
|
1055
|
+
out.info(out.role("sources · ranked by %s" % reply.engine, "muted"))
|
|
1056
|
+
for cite in chat_engine.citations(reply.skills):
|
|
1057
|
+
out.info(out.role(" %s %s (%s)"
|
|
1058
|
+
% (cite["name"], cite["kind"], cite["tap"]), "muted"))
|
|
1059
|
+
if reply.source == "extractive" and not reply.grounded:
|
|
1060
|
+
# The model answered and was rejected. Saying so beats silently showing
|
|
1061
|
+
# a downgraded answer that looks identical to a confident one.
|
|
1062
|
+
out.warn("the AI reply named something outside the retrieved skills — "
|
|
1063
|
+
"showing the grounded matches instead")
|
|
1064
|
+
|
|
1065
|
+
|
|
1066
|
+
def cmd_chat(argv: List[str]) -> int:
|
|
1067
|
+
"""Ask about skills in plain language; answers are grounded in retrieval."""
|
|
1068
|
+
ap = cliparse.parser(
|
|
1069
|
+
prog="boost chat",
|
|
1070
|
+
description="Ask about skills in plain language")
|
|
1071
|
+
ap.add_argument("question", nargs="*", metavar="QUESTION",
|
|
1072
|
+
help="ask once and exit; omit for an interactive session")
|
|
1073
|
+
ap.add_argument("-k", "--limit", type=int, default=chat_engine.TOP_K,
|
|
1074
|
+
metavar="N", help="candidate skills to consider (default %d)"
|
|
1075
|
+
% chat_engine.TOP_K)
|
|
1076
|
+
ap.add_argument("--no-sources", action="store_true",
|
|
1077
|
+
help="hide the citation block under each answer")
|
|
1078
|
+
ap.add_argument("--json", action="store_true", dest="as_json",
|
|
1079
|
+
help="machine-readable answer (implies one-shot)")
|
|
1080
|
+
args = ap.parse_args(argv)
|
|
1081
|
+
|
|
1082
|
+
if not registry.list_taps():
|
|
1083
|
+
raise BoostError("no taps configured — nothing to chat about",
|
|
1084
|
+
hint="add the recommended registries with `boost tap --defaults`")
|
|
1085
|
+
|
|
1086
|
+
question = " ".join(args.question).strip()
|
|
1087
|
+
if args.as_json:
|
|
1088
|
+
if not question:
|
|
1089
|
+
raise BoostError("--json needs a question",
|
|
1090
|
+
hint='try: boost chat --json "how do I review a diff?"')
|
|
1091
|
+
reply = chat_engine.answer(question, k=args.limit)
|
|
1092
|
+
print(json.dumps({
|
|
1093
|
+
"question": question,
|
|
1094
|
+
"answer": reply.text,
|
|
1095
|
+
"engine": reply.engine,
|
|
1096
|
+
"source": reply.source,
|
|
1097
|
+
"grounded": reply.grounded,
|
|
1098
|
+
"skills": chat_engine.citations(reply.skills),
|
|
1099
|
+
}))
|
|
1100
|
+
return 0
|
|
1101
|
+
|
|
1102
|
+
if question:
|
|
1103
|
+
_print_reply(chat_engine.answer(question, k=args.limit), not args.no_sources)
|
|
1104
|
+
return 0
|
|
1105
|
+
|
|
1106
|
+
return _chat_session(args)
|
|
1107
|
+
|
|
1108
|
+
|
|
1109
|
+
def _chat_session(args) -> int:
|
|
1110
|
+
"""The interactive loop. Kept separate so cmd_chat stays a dispatcher.
|
|
1111
|
+
|
|
1112
|
+
History is bounded by chat_engine.HISTORY_TURNS — this is a lookup
|
|
1113
|
+
assistant, and a long transcript encourages answering from the conversation
|
|
1114
|
+
rather than from what retrieval actually returned.
|
|
1115
|
+
"""
|
|
1116
|
+
if not ai.available():
|
|
1117
|
+
# Worth saying up front rather than letting every answer look terse for
|
|
1118
|
+
# an unexplained reason.
|
|
1119
|
+
out.info(out.role("no AI configured — answers are the grounded matches "
|
|
1120
|
+
"themselves (%s)" % ai.fallback_note(), "muted"))
|
|
1121
|
+
out.info(out.role("ask about skills; blank line or Ctrl-D to exit", "muted"))
|
|
1122
|
+
history: List[chat_engine.Turn] = []
|
|
1123
|
+
while True:
|
|
1124
|
+
try:
|
|
1125
|
+
question = input("\n> ").strip()
|
|
1126
|
+
except (EOFError, KeyboardInterrupt):
|
|
1127
|
+
out.info("")
|
|
1128
|
+
return 0
|
|
1129
|
+
if not question:
|
|
1130
|
+
return 0
|
|
1131
|
+
reply = chat_engine.answer(question, history=history, k=args.limit)
|
|
1132
|
+
out.info("")
|
|
1133
|
+
_print_reply(reply, not args.no_sources)
|
|
1134
|
+
history.append(chat_engine.Turn(question, reply.text))
|
|
1135
|
+
for follow in chat_engine.suggest_followups(reply.skills)[:2]:
|
|
1136
|
+
out.info(out.role(" try: %s" % follow, "muted"))
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"""Conversational search over the tapped catalogue.
|
|
2
|
+
|
|
3
|
+
``boost chat`` sits on top of machinery that already exists — ``rag.retrieve_any``
|
|
4
|
+
for finding candidates, ``ai.ask`` for prose, ``faithfulness.score`` for checking
|
|
5
|
+
that prose against its source — and adds the one thing they do not do together:
|
|
6
|
+
turn a question into an answer that names specific skills and says why.
|
|
7
|
+
|
|
8
|
+
THE FAILURE THIS IS BUILT AROUND. boost is a package manager. A chatbot that
|
|
9
|
+
invents a plausible-sounding skill name is not a cosmetic bug: the user goes
|
|
10
|
+
looking for ``docker-compose-expert``, does not find it, and either concludes the
|
|
11
|
+
catalogue is broken or — worse — installs something adjacent from an untrusted
|
|
12
|
+
tap. Typosquatting is a real hazard in this ecosystem (``core/typosquat.py``
|
|
13
|
+
exists for it), so an assistant that manufactures names is actively dangerous
|
|
14
|
+
rather than merely unhelpful.
|
|
15
|
+
|
|
16
|
+
Two defences, in order:
|
|
17
|
+
|
|
18
|
+
* **Retrieval decides what may be discussed.** The model is never asked "what
|
|
19
|
+
skill does X?" — it is asked to summarise a specific, retrieved set. Nothing
|
|
20
|
+
outside that set can be recommended because nothing outside it is in the
|
|
21
|
+
prompt.
|
|
22
|
+
* **The reply is checked before it is shown.** Every skill name in the answer
|
|
23
|
+
must appear in the retrieved set (:func:`ungrounded_names`), and the prose as a
|
|
24
|
+
whole must score against the source text (:func:`faithfulness.score`, the same
|
|
25
|
+
gate ``boost explain`` uses). A reply that fails either is discarded, not
|
|
26
|
+
patched — and the extractive answer below is shown instead.
|
|
27
|
+
|
|
28
|
+
Degrading rather than failing is the house contract: with ``BOOST_NO_AI=1``, no
|
|
29
|
+
API key, or no ``claude`` CLI, :func:`answer` still returns a useful grounded
|
|
30
|
+
answer assembled from the retrieved descriptions. The AI path improves the prose;
|
|
31
|
+
it is never load-bearing for correctness.
|
|
32
|
+
"""
|
|
33
|
+
from __future__ import annotations
|
|
34
|
+
|
|
35
|
+
import re
|
|
36
|
+
from typing import Dict, List, NamedTuple, Optional, Sequence, Tuple
|
|
37
|
+
|
|
38
|
+
from . import ai, catalog, faithfulness, rag
|
|
39
|
+
|
|
40
|
+
# How many candidates reach the prompt. Small on purpose: the model summarises
|
|
41
|
+
# rather than searches, and a long tail of weak hits invites it to reach for
|
|
42
|
+
# whichever one sounds closest to the question rather than the one that ranked.
|
|
43
|
+
TOP_K = 5
|
|
44
|
+
|
|
45
|
+
# Minimum groundedness for AI prose, matching `boost explain`'s default. Below
|
|
46
|
+
# this the reply names specifics its sources never did, which is the observable
|
|
47
|
+
# shape of a fabricated capability.
|
|
48
|
+
MIN_FAITHFULNESS = 0.60
|
|
49
|
+
|
|
50
|
+
# A conversation is kept this short deliberately. `chat` is a lookup assistant,
|
|
51
|
+
# not an agent: more history means more chances for the model to answer from the
|
|
52
|
+
# conversation instead of from what retrieval actually returned.
|
|
53
|
+
HISTORY_TURNS = 4
|
|
54
|
+
|
|
55
|
+
_SYSTEM = (
|
|
56
|
+
"You help a developer pick an AI coding-agent skill from a catalogue. "
|
|
57
|
+
"Answer ONLY from the numbered skills provided. Never invent a skill name. "
|
|
58
|
+
"If none fit, say so plainly. Be concrete and brief: 3-5 sentences, no "
|
|
59
|
+
"markdown, no bullet lists. Name the skills you recommend exactly as given."
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class Turn(NamedTuple):
|
|
64
|
+
"""One exchange, kept so a follow-up can refer back to it."""
|
|
65
|
+
|
|
66
|
+
question: str
|
|
67
|
+
answer: str
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class Reply(NamedTuple):
|
|
71
|
+
"""What :func:`answer` produces.
|
|
72
|
+
|
|
73
|
+
``grounded`` is False only when the AI path was tried and rejected — the
|
|
74
|
+
caller may want to say so, since a silently downgraded answer looks the same
|
|
75
|
+
as a confident one.
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
text: str
|
|
79
|
+
skills: List[dict] # the catalogue entries the answer draws on
|
|
80
|
+
engine: str # which retrieval engine ran, for attribution
|
|
81
|
+
source: str # "ai" | "extractive"
|
|
82
|
+
grounded: bool
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _history_context(history: Sequence[Turn]) -> str:
|
|
86
|
+
"""Recent turns, oldest first, as plain text for the prompt."""
|
|
87
|
+
recent = list(history)[-HISTORY_TURNS:]
|
|
88
|
+
if not recent:
|
|
89
|
+
return ""
|
|
90
|
+
lines = ["Earlier in this conversation:"]
|
|
91
|
+
for turn in recent:
|
|
92
|
+
lines.extend(("Q: %s" % turn.question, "A: %s" % turn.answer))
|
|
93
|
+
return "\n".join(lines) + "\n\n"
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def expand_query(question: str, history: Sequence[Turn]) -> str:
|
|
97
|
+
"""The string actually sent to retrieval.
|
|
98
|
+
|
|
99
|
+
A follow-up like "what about the second one?" carries almost no searchable
|
|
100
|
+
terms, so retrieving on it alone returns noise. Appending the previous
|
|
101
|
+
question restores the subject without needing the model to rewrite it — a
|
|
102
|
+
rewrite would be another place for the assistant to drift off-topic.
|
|
103
|
+
|
|
104
|
+
Only the immediately preceding question is used: two turns back is usually a
|
|
105
|
+
different subject, and blending them retrieves for neither.
|
|
106
|
+
"""
|
|
107
|
+
question = question.strip()
|
|
108
|
+
if not history:
|
|
109
|
+
return question
|
|
110
|
+
# Long questions carry their own context; short ones are the follow-ups.
|
|
111
|
+
if len(question.split()) > 6:
|
|
112
|
+
return question
|
|
113
|
+
return "%s %s" % (history[-1].question, question)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def retrieve(question: str, history: Sequence[Turn] = (),
|
|
117
|
+
k: int = TOP_K) -> Tuple[List[dict], str]:
|
|
118
|
+
"""Candidate catalogue entries for ``question``, best first.
|
|
119
|
+
|
|
120
|
+
Returns ``(entries, engine_label)``. Uses :func:`rag.retrieve_any` so chat
|
|
121
|
+
gets whatever the machine has — hybrid, dense, or BM25 — rather than pinning
|
|
122
|
+
an engine of its own, and falls back to the frontmatter scan when no index
|
|
123
|
+
exists at all so a fresh install still answers.
|
|
124
|
+
"""
|
|
125
|
+
query = expand_query(question, history)
|
|
126
|
+
entries = catalog.all_entries()
|
|
127
|
+
hits, engine = rag.retrieve_any(query, k=k, entries=entries)
|
|
128
|
+
if hits is None:
|
|
129
|
+
# No index of any kind: catalog.search is the documented floor.
|
|
130
|
+
scored = catalog.search(query)
|
|
131
|
+
return [e for e, _score in scored[:k]], "frontmatter scan"
|
|
132
|
+
return [h["entry"] for h in hits[:k]], engine
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def _describe(entry: dict) -> str:
|
|
136
|
+
"""One catalogue entry as a line of prompt/answer text."""
|
|
137
|
+
return "%s (%s) — %s" % (entry.get("name", "?"), entry.get("tap", "?"),
|
|
138
|
+
(entry.get("description") or "").strip() or "no description")
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def source_text(entries: Sequence[dict]) -> str:
|
|
142
|
+
"""The numbered candidate list the model is allowed to answer from."""
|
|
143
|
+
return "\n".join("%d. %s" % (i, _describe(e)) for i, e in enumerate(entries, 1))
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def ungrounded_names(reply: str, entries: Sequence[dict]) -> List[str]:
|
|
147
|
+
"""Skill-shaped tokens in ``reply`` that name nothing in ``entries``.
|
|
148
|
+
|
|
149
|
+
Catalogue names are lowercase hyphenated words (``code-reviewer``,
|
|
150
|
+
``pdf``), which is a distinctive enough shape to spot in prose. Anything
|
|
151
|
+
matching that shape and not present in the candidate set is a name the model
|
|
152
|
+
supplied itself — the exact failure that sends a user hunting for a skill
|
|
153
|
+
that does not exist.
|
|
154
|
+
|
|
155
|
+
Deliberately narrow: it only flags *hyphenated* tokens. A single ordinary
|
|
156
|
+
word cannot be told apart from prose, so this under-reports rather than
|
|
157
|
+
firing on innocent sentences, and the faithfulness score covers the rest.
|
|
158
|
+
"""
|
|
159
|
+
known = {str(e.get("name", "")).lower() for e in entries}
|
|
160
|
+
candidates = set(re.findall(r"\b[a-z][a-z0-9]*(?:-[a-z0-9]+)+\b", reply.lower()))
|
|
161
|
+
return sorted(c for c in candidates if c not in known)
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def _extractive(question: str, entries: Sequence[dict]) -> str:
|
|
165
|
+
"""A grounded answer with no model involved.
|
|
166
|
+
|
|
167
|
+
This is what every keyless, offline or AI-disabled install gets, so it has to
|
|
168
|
+
be genuinely useful rather than an apology: the top candidates with their
|
|
169
|
+
descriptions and where they came from, which is the information the user
|
|
170
|
+
needs to decide.
|
|
171
|
+
"""
|
|
172
|
+
if not entries:
|
|
173
|
+
return ("Nothing in the tapped catalogue matches that. Try `boost tap "
|
|
174
|
+
"--defaults` for more registries, or rephrase with the concrete "
|
|
175
|
+
"terms you would expect in the skill's own description.")
|
|
176
|
+
lines = ["Closest matches in your tapped catalogue:"]
|
|
177
|
+
lines.extend(" " + _describe(entry) for entry in entries)
|
|
178
|
+
lines.extend(("", "Run `boost info <name>` for the full skill, or "
|
|
179
|
+
"`boost install <name>` to add it."))
|
|
180
|
+
return "\n".join(lines)
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def answer(question: str, history: Sequence[Turn] = (),
|
|
184
|
+
k: int = TOP_K) -> Reply:
|
|
185
|
+
"""Answer ``question`` from the tapped catalogue.
|
|
186
|
+
|
|
187
|
+
The AI path is attempted only when :func:`ai.available`; its reply is used
|
|
188
|
+
only when it passes both grounding checks. Otherwise the extractive answer is
|
|
189
|
+
returned, which is the same information in a plainer shape.
|
|
190
|
+
"""
|
|
191
|
+
entries, engine = retrieve(question, history, k=k)
|
|
192
|
+
extractive = _extractive(question, entries)
|
|
193
|
+
if not entries or not ai.available():
|
|
194
|
+
return Reply(extractive, entries.copy(), engine, "extractive", True)
|
|
195
|
+
|
|
196
|
+
source = source_text(entries)
|
|
197
|
+
prompt = "%s%s\n\nCandidate skills:\n%s\n\nQuestion: %s" % (
|
|
198
|
+
_history_context(history),
|
|
199
|
+
"Answer the question using only the numbered skills below.",
|
|
200
|
+
source, question)
|
|
201
|
+
reply = ai.ask(prompt, system=_SYSTEM)
|
|
202
|
+
if not reply:
|
|
203
|
+
return Reply(extractive, entries.copy(), engine, "extractive", True)
|
|
204
|
+
|
|
205
|
+
reply = reply.strip()
|
|
206
|
+
invented = ungrounded_names(reply, entries)
|
|
207
|
+
if invented:
|
|
208
|
+
# A manufactured name is unrecoverable — there is no honest way to show
|
|
209
|
+
# prose that points at a skill which does not exist.
|
|
210
|
+
return Reply(extractive, entries.copy(), engine, "extractive", False)
|
|
211
|
+
if faithfulness.score(reply, source) < MIN_FAITHFULNESS:
|
|
212
|
+
return Reply(extractive, entries.copy(), engine, "extractive", False)
|
|
213
|
+
return Reply(reply, entries.copy(), engine, "ai", True)
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def citations(entries: Sequence[dict]) -> List[Dict[str, str]]:
|
|
217
|
+
"""Name/tap pairs for the entries an answer drew on.
|
|
218
|
+
|
|
219
|
+
Shown under every answer so a claim can be checked against the source, which
|
|
220
|
+
matters more here than in an ordinary chatbot: the next step is installing
|
|
221
|
+
code that will run inside the user's agent.
|
|
222
|
+
"""
|
|
223
|
+
return [{"name": str(e.get("name", "")), "tap": str(e.get("tap", "")),
|
|
224
|
+
"kind": str(e.get("kind", "skill"))} for e in entries]
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def suggest_followups(entries: Sequence[dict]) -> List[str]:
|
|
228
|
+
"""Concrete next questions, drawn from what was actually retrieved.
|
|
229
|
+
|
|
230
|
+
Generic prompts ("ask me anything!") teach nothing; naming a real retrieved
|
|
231
|
+
skill shows the user the shape of a question that works.
|
|
232
|
+
"""
|
|
233
|
+
if not entries:
|
|
234
|
+
return ["what skills do I have installed?"]
|
|
235
|
+
top: Optional[dict] = entries[0]
|
|
236
|
+
name = str(top.get("name", "")) if top else ""
|
|
237
|
+
out: List[str] = []
|
|
238
|
+
if name:
|
|
239
|
+
out.extend(("what does %s actually do?" % name,
|
|
240
|
+
"how is %s different from the others?" % name))
|
|
241
|
+
out.append("which of these should I install first?")
|
|
242
|
+
return out
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.344
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -927,7 +927,7 @@ boost doctor # sanity check: broken links, lock drift, stale taps
|
|
|
927
927
|
boost bundle dump > Boostfile # everyone else runs: boost bundle install
|
|
928
928
|
```
|
|
929
929
|
|
|
930
|
-
##
|
|
930
|
+
## 79 commands, organized into 8 groups
|
|
931
931
|
|
|
932
932
|
`boost --help` prints the full grouped command list; for a visual tour see
|
|
933
933
|
[`docs/index.html`](docs/index.html), and for every flag of every command see
|
|
@@ -1082,7 +1082,7 @@ Four layers, all enforced (`make check` runs the full set; CI runs the same thin
|
|
|
1082
1082
|
|
|
1083
1083
|
| Layer | What it does | Gate |
|
|
1084
1084
|
|---|---|---|
|
|
1085
|
-
| `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all
|
|
1085
|
+
| `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all 79 commands in-process against sandboxed homes) | **≥80% line coverage** of `boost_cli` (`fail_under` in pyproject.toml) |
|
|
1086
1086
|
| `make smoke` | `tests/smoke.sh` — 170 checks run through the actual `./boost` shim (`--online` also hits real registries) | all pass |
|
|
1087
1087
|
| `make mutation` | [mutmut] mutates `boost_cli/core` (~9,900 mutants) and reruns the unit suite against each one | **≥80% killed** (`scripts/mutation_gate.py`) |
|
|
1088
1088
|
| `make evals` | scores the search ranker on a graded golden set — recall@5/@10, MRR, nDCG@5/@10 | **metric floors + no statistically significant regression** (`scripts/eval_gate.py`) |
|
|
@@ -53,6 +53,7 @@ boost_cli/core/agents.py
|
|
|
53
53
|
boost_cli/core/ai.py
|
|
54
54
|
boost_cli/core/capabilities.py
|
|
55
55
|
boost_cli/core/catalog.py
|
|
56
|
+
boost_cli/core/chat.py
|
|
56
57
|
boost_cli/core/claude_settings.py
|
|
57
58
|
boost_cli/core/config.py
|
|
58
59
|
boost_cli/core/dense.py
|
|
@@ -105,8 +106,11 @@ boost_skill_cli.egg-info/top_level.txt
|
|
|
105
106
|
docs/DEBUGGING.md
|
|
106
107
|
docs/adapters.html
|
|
107
108
|
docs/carousel.html
|
|
109
|
+
docs/chat.html
|
|
108
110
|
docs/commands.html
|
|
111
|
+
docs/demo-index.json
|
|
109
112
|
docs/demo.gif
|
|
113
|
+
docs/demo.html
|
|
110
114
|
docs/demo.tape
|
|
111
115
|
docs/design-roadmap.html
|
|
112
116
|
docs/eval.html
|
|
@@ -179,6 +183,7 @@ docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md
|
|
|
179
183
|
docs/roadmap/items/build-provenance-slsa-attestations.md
|
|
180
184
|
docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md
|
|
181
185
|
docs/roadmap/items/capability-manifest-and-least-privilege-policy.md
|
|
186
|
+
docs/roadmap/items/chat-command-grounded-conversational-search.md
|
|
182
187
|
docs/roadmap/items/ci-job-timeout-minutes.md
|
|
183
188
|
docs/roadmap/items/ci-summary-step-fails-itself.md
|
|
184
189
|
docs/roadmap/items/ci-time-is-now-runner-queueing.md
|
|
@@ -379,6 +384,7 @@ requirements/test-tools.txt
|
|
|
379
384
|
scripts/a11y_check.py
|
|
380
385
|
scripts/bench_cli.sh
|
|
381
386
|
scripts/build_command_reference.py
|
|
387
|
+
scripts/build_demo_index.py
|
|
382
388
|
scripts/build_registries.py
|
|
383
389
|
scripts/build_roadmap.py
|
|
384
390
|
scripts/check_anchors.py
|
|
@@ -431,6 +437,7 @@ tests/eval/taps.txt
|
|
|
431
437
|
tests/functional/test_capabilities_policy.py
|
|
432
438
|
tests/functional/test_cli_adapt.py
|
|
433
439
|
tests/functional/test_cli_bmad.py
|
|
440
|
+
tests/functional/test_cli_chat.py
|
|
434
441
|
tests/functional/test_cli_configuration.py
|
|
435
442
|
tests/functional/test_cli_discovery.py
|
|
436
443
|
tests/functional/test_cli_hooks.py
|
|
@@ -478,6 +485,7 @@ tests/unit/test_agents.py
|
|
|
478
485
|
tests/unit/test_ai.py
|
|
479
486
|
tests/unit/test_capabilities.py
|
|
480
487
|
tests/unit/test_catalog.py
|
|
488
|
+
tests/unit/test_chat.py
|
|
481
489
|
tests/unit/test_check_anchors.py
|
|
482
490
|
tests/unit/test_check_licenses.py
|
|
483
491
|
tests/unit/test_claude_settings.py
|
|
@@ -488,6 +496,7 @@ tests/unit/test_community_health_files.py
|
|
|
488
496
|
tests/unit/test_config.py
|
|
489
497
|
tests/unit/test_content_dedupe.py
|
|
490
498
|
tests/unit/test_dedup_trust.py
|
|
499
|
+
tests/unit/test_demo_index.py
|
|
491
500
|
tests/unit/test_dense.py
|
|
492
501
|
tests/unit/test_dense_fallback.py
|
|
493
502
|
tests/unit/test_dense_fix_hint.py
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
<div class="wrap hero">
|
|
116
116
|
<p class="crumbs"><a href="index.html">boost</a> / docs / carousel</p>
|
|
117
117
|
<span class="badge">8 command groups · recorded live with VHS</span>
|
|
118
|
-
<h1>
|
|
118
|
+
<h1>79 commands. <span class="grad-text">One flagship each.</span></h1>
|
|
119
119
|
<p class="lede">boost's command surface spans 8 groups, from package management to team
|
|
120
120
|
collaboration. Rather than 78 near-identical recordings, this page tours <b>one
|
|
121
121
|
representative command per group</b> — the one that shows what that group is actually
|
|
@@ -275,7 +275,7 @@
|
|
|
275
275
|
<code>simulate</code><code>infer</code><code>absorb</code><code>evolve</code>
|
|
276
276
|
<code>context</code><code>focus</code><code>impact</code>
|
|
277
277
|
</div>
|
|
278
|
-
<p class="group-note">
|
|
278
|
+
<p class="group-note">9 commands in this group.</p>
|
|
279
279
|
<p class="regen">regenerate: <code>vhs docs/carousel/tapes/distill.tape</code></p>
|
|
280
280
|
</div>
|
|
281
281
|
</div>
|