boost-skill-cli 1.0.316__tar.gz → 1.0.317__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.
Files changed (573) hide show
  1. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/CLAUDE.md +10 -3
  2. {boost_skill_cli-1.0.316/boost_skill_cli.egg-info → boost_skill_cli-1.0.317}/PKG-INFO +28 -8
  3. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/README.md +27 -7
  4. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/_version.py +2 -2
  5. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/discovery.py +37 -0
  6. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/quality.py +3 -19
  7. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/dense.py +30 -0
  8. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/mcp.py +26 -1
  9. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317/boost_skill_cli.egg-info}/PKG-INFO +28 -8
  10. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_skill_cli.egg-info/SOURCES.txt +1 -0
  11. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/mcp-hub.html +8 -6
  12. boost_skill_cli-1.0.317/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +49 -0
  13. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap.html +24 -16
  14. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_discovery.py +65 -1
  15. boost_skill_cli-1.0.317/tests/unit/test_dense_fix_hint.py +131 -0
  16. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_dense_status.py +31 -3
  17. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_embed.py +26 -1
  18. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_mcp.py +53 -1
  19. boost_skill_cli-1.0.316/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -41
  20. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.gitattributes +0 -0
  21. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.gitignore +0 -0
  22. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.gitleaks.toml +0 -0
  23. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.htmlvalidate.json +0 -0
  24. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.lighthouserc.json +0 -0
  25. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.lycheeignore +0 -0
  26. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.markdownlint-cli2.jsonc +0 -0
  27. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.pre-commit-config.yaml +0 -0
  28. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.stylelintrc.json +0 -0
  29. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.vale/styles/boost/Terminology.yml +0 -0
  30. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  31. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.vale.ini +0 -0
  32. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/CODE_OF_CONDUCT.md +0 -0
  33. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/CONTRIBUTING.md +0 -0
  34. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/LICENSE +0 -0
  35. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/MANIFEST.in +0 -0
  36. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/Makefile +0 -0
  37. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/SECURITY.md +0 -0
  38. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost +0 -0
  39. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/__init__.py +0 -0
  40. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/__main__.py +0 -0
  41. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/cli.py +0 -0
  42. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/cliparse.py +0 -0
  43. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/__init__.py +0 -0
  44. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/_common.py +0 -0
  45. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/bmad.py +0 -0
  46. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/configuration.py +0 -0
  47. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/hooks.py +0 -0
  48. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/info.py +0 -0
  49. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/intelligence.py +0 -0
  50. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/pkg.py +0 -0
  51. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/run.py +0 -0
  52. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/safety.py +0 -0
  53. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/taps.py +0 -0
  54. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/team.py +0 -0
  55. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/__init__.py +0 -0
  56. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/adapters.py +0 -0
  57. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/agents.py +0 -0
  58. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/ai.py +0 -0
  59. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/capabilities.py +0 -0
  60. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/catalog.py +0 -0
  61. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/claude_settings.py +0 -0
  62. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/config.py +0 -0
  63. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/ed25519.py +0 -0
  64. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/embed.py +0 -0
  65. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/faithfulness.py +0 -0
  66. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/frontmatter.py +0 -0
  67. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/gitutil.py +0 -0
  68. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/imperative.py +0 -0
  69. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/injectscan.py +0 -0
  70. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/installscan.py +0 -0
  71. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/integrity.py +0 -0
  72. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/journal.py +0 -0
  73. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/localembed.py +0 -0
  74. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/lockfile.py +0 -0
  75. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/logs.py +0 -0
  76. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/mcpdecl.py +0 -0
  77. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/mcphost.py +0 -0
  78. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/minisign.py +0 -0
  79. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/nethttp.py +0 -0
  80. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/output.py +0 -0
  81. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/paths.py +0 -0
  82. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/policy.py +0 -0
  83. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/projectlock.py +0 -0
  84. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/provenance.py +0 -0
  85. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/rag.py +0 -0
  86. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/registry.py +0 -0
  87. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/resolve.py +0 -0
  88. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/rules.py +0 -0
  89. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/scopes.py +0 -0
  90. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/secretscan.py +0 -0
  91. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/selfupdate.py +0 -0
  92. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/serve.py +0 -0
  93. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/stackprobe.py +0 -0
  94. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/staleness.py +0 -0
  95. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/store.py +0 -0
  96. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/trustaudit.py +0 -0
  97. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/typosquat.py +0 -0
  98. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/updatediff.py +0 -0
  99. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/util.py +0 -0
  100. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/workflows.py +0 -0
  101. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/data/registries.json +0 -0
  102. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/errors.py +0 -0
  103. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/spin.py +0 -0
  104. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  105. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  106. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_skill_cli.egg-info/requires.txt +0 -0
  107. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_skill_cli.egg-info/top_level.txt +0 -0
  108. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/codecov.yml +0 -0
  109. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/.claude/settings.local.json +0 -0
  110. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/DEBUGGING.md +0 -0
  111. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/adapters.html +0 -0
  112. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/architecture/README.md +0 -0
  113. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/architecture/c4-components-core.md +0 -0
  114. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/architecture/c4-containers.md +0 -0
  115. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/architecture/c4-context.md +0 -0
  116. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/architecture/c4-dynamic-install.md +0 -0
  117. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/gifs/distill.gif +0 -0
  118. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/gifs/doctor.gif +0 -0
  119. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/gifs/explain.gif +0 -0
  120. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/gifs/hooks.gif +0 -0
  121. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/gifs/install.gif +0 -0
  122. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/gifs/pulse.gif +0 -0
  123. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/gifs/search.gif +0 -0
  124. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/gifs/tap.gif +0 -0
  125. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/tapes/distill.tape +0 -0
  126. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/tapes/doctor.tape +0 -0
  127. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/tapes/explain.tape +0 -0
  128. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/tapes/hooks.tape +0 -0
  129. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/tapes/install.tape +0 -0
  130. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/tapes/pulse.tape +0 -0
  131. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/tapes/search.tape +0 -0
  132. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/tapes/tap.tape +0 -0
  133. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel.html +0 -0
  134. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/commands.html +0 -0
  135. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/demo.gif +0 -0
  136. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/demo.tape +0 -0
  137. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/design-roadmap.html +0 -0
  138. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/eval.html +0 -0
  139. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/index.html +0 -0
  140. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/rag-architecture.md +0 -0
  141. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D01.md +0 -0
  142. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D02.md +0 -0
  143. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D03.md +0 -0
  144. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D04.md +0 -0
  145. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D05.md +0 -0
  146. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D06.md +0 -0
  147. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D07.md +0 -0
  148. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D08.md +0 -0
  149. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D09.md +0 -0
  150. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D10.md +0 -0
  151. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D11.md +0 -0
  152. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D12.md +0 -0
  153. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D13.md +0 -0
  154. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D14.md +0 -0
  155. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D15.md +0 -0
  156. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D16.md +0 -0
  157. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D17.md +0 -0
  158. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D18.md +0 -0
  159. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D19.md +0 -0
  160. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D20.md +0 -0
  161. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D21.md +0 -0
  162. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D22.md +0 -0
  163. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D23.md +0 -0
  164. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D24.md +0 -0
  165. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D25.md +0 -0
  166. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D26.md +0 -0
  167. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  168. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  169. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  170. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  171. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  172. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  173. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  174. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  175. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  176. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  177. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  178. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  179. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  180. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  181. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  182. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  183. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  184. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  185. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  186. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  187. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  188. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  189. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/command-carousel-page.md +0 -0
  190. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  191. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  192. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  193. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  194. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  195. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  196. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  197. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  198. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  199. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  200. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  201. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  202. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  203. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  204. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  205. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  206. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  207. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  208. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  209. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  210. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  211. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  212. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  213. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  214. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  215. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  216. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  217. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  218. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  219. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/github-community-health-files.md +0 -0
  220. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  221. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  222. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  223. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  224. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  225. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  226. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  227. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  228. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  229. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  230. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  231. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  232. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  233. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  234. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  235. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  236. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  237. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  238. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  239. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  240. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  241. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  242. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  243. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  244. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  245. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  246. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  247. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  248. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  249. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  250. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  251. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  252. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  253. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  254. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  255. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  256. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  257. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  258. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  259. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  260. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  261. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  262. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  263. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  264. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  265. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  266. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  267. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  268. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  269. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  270. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  271. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  272. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  273. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  274. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  275. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  276. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  277. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  278. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  279. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  280. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  281. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  282. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  283. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  284. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  285. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  286. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  287. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  288. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  289. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  290. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  291. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  292. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  293. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  294. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  295. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  296. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  297. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  298. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  299. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  300. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  301. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  302. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  303. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  304. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  305. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  306. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  307. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  308. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  309. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  310. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  311. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  312. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  313. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  314. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  315. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  316. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  317. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  318. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  319. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  320. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  321. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  322. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  323. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  324. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  325. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  326. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  327. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  328. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  329. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  330. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  331. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  332. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  333. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  334. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  335. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  336. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  337. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  338. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  339. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  340. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  341. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  342. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  343. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  344. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  345. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  346. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  347. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  348. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  349. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  350. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  351. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  352. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/workspace-scope-install.md +0 -0
  353. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  354. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/eslint.config.mjs +0 -0
  355. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/evals/README.md +0 -0
  356. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/evals/__init__.py +0 -0
  357. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/evals/baseline.json +0 -0
  358. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/evals/faithfulness.py +0 -0
  359. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/evals/golden_set.json +0 -0
  360. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/evals/make_corpus.py +0 -0
  361. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/evals/make_golden.py +0 -0
  362. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/evals/metrics.py +0 -0
  363. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/evals/run_evals.py +0 -0
  364. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/examples/README.md +0 -0
  365. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/examples/adapt-demo.sh +0 -0
  366. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/examples/boost-run-prototype.sh +0 -0
  367. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/index.html +0 -0
  368. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/noxfile.py +0 -0
  369. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/pyproject.toml +0 -0
  370. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/coverage-tools.in +0 -0
  371. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/coverage-tools.txt +0 -0
  372. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/lint-tools.in +0 -0
  373. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/lint-tools.txt +0 -0
  374. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/mutation-tools.in +0 -0
  375. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/mutation-tools.txt +0 -0
  376. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/platform-pins.lock +0 -0
  377. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/release-tools.in +0 -0
  378. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/release-tools.txt +0 -0
  379. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/test-tools.in +0 -0
  380. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/test-tools.txt +0 -0
  381. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/a11y_check.py +0 -0
  382. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/bench_cli.sh +0 -0
  383. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/build_command_reference.py +0 -0
  384. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/build_registries.py +0 -0
  385. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/build_roadmap.py +0 -0
  386. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/check_anchors.py +0 -0
  387. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/check_licenses.py +0 -0
  388. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/check_required_checks.py +0 -0
  389. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/ensure_eval_corpus.sh +0 -0
  390. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/eval_explain.py +0 -0
  391. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/eval_gate.py +0 -0
  392. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/eval_recommend.py +0 -0
  393. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/eval_retrieval.py +0 -0
  394. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/eval_stats_summary.py +0 -0
  395. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/import_budget.py +0 -0
  396. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/lock_toolchain.py +0 -0
  397. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/mutation_gate.py +0 -0
  398. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/mutation_shards.py +0 -0
  399. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/mutation_weights.json +0 -0
  400. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/perf_gate.py +0 -0
  401. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/post_deploy_smoke.py +0 -0
  402. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/release_guard.py +0 -0
  403. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/release_preflight.py +0 -0
  404. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/setup.cfg +0 -0
  405. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/sonar-project.properties +0 -0
  406. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/style/README.md +0 -0
  407. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/style/boost.css +0 -0
  408. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/style/boost.js +0 -0
  409. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/style/demo.html +0 -0
  410. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/adapt.feature +0 -0
  411. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/browse.feature +0 -0
  412. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/count.feature +0 -0
  413. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/discover.feature +0 -0
  414. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/doctor.feature +0 -0
  415. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/environment.py +0 -0
  416. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/explain.feature +0 -0
  417. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/index.feature +0 -0
  418. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/install.feature +0 -0
  419. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/list.feature +0 -0
  420. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/mcp.feature +0 -0
  421. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/search.feature +0 -0
  422. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/steps/cli_steps.py +0 -0
  423. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/steps/discovery_steps.py +0 -0
  424. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/steps/mcp_steps.py +0 -0
  425. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/steps/quality_steps.py +0 -0
  426. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/conftest.py +0 -0
  427. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/eval/baseline.json +0 -0
  428. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/eval/explain.jsonl +0 -0
  429. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/eval/golden-natural.jsonl +0 -0
  430. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/eval/golden.jsonl +0 -0
  431. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/eval/recommend.jsonl +0 -0
  432. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/eval/taps.txt +0 -0
  433. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_capabilities_policy.py +0 -0
  434. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_adapt.py +0 -0
  435. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_bmad.py +0 -0
  436. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_configuration.py +0 -0
  437. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_hooks.py +0 -0
  438. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_info.py +0 -0
  439. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_intelligence.py +0 -0
  440. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_pkg.py +0 -0
  441. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_quality.py +0 -0
  442. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_taps.py +0 -0
  443. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_team.py +0 -0
  444. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_everyday_loop.py +0 -0
  445. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_integrity_enforce.py +0 -0
  446. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_property_parsers.py +0 -0
  447. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_run.py +0 -0
  448. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_tap_signing.py +0 -0
  449. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_workspace_scope.py +0 -0
  450. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/README.md +0 -0
  451. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  452. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  453. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  454. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  455. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  456. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  457. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  458. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  459. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  460. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  461. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  462. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  463. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  464. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  465. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  466. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  467. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  468. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  469. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  470. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  471. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/fuzz_frontmatter.py +0 -0
  472. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/fuzz_registry.py +0 -0
  473. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/make_fixture.py +0 -0
  474. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/perf/test_benchmarks.py +0 -0
  475. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/smoke.sh +0 -0
  476. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_a11y_check.py +0 -0
  477. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_adapters.py +0 -0
  478. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_adapters_multi.py +0 -0
  479. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_adapters_runner.py +0 -0
  480. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_agents.py +0 -0
  481. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_ai.py +0 -0
  482. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_capabilities.py +0 -0
  483. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_catalog.py +0 -0
  484. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_check_anchors.py +0 -0
  485. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_check_licenses.py +0 -0
  486. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_claude_settings.py +0 -0
  487. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_cliparse.py +0 -0
  488. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_codeql_analysis_key.py +0 -0
  489. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_command_reference_fresh.py +0 -0
  490. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_community_health_files.py +0 -0
  491. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_config.py +0 -0
  492. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_dense.py +0 -0
  493. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_dense_fallback.py +0 -0
  494. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_dependabot_config.py +0 -0
  495. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_docs_pages_linked.py +0 -0
  496. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_docsite_chrome.py +0 -0
  497. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_ed25519.py +0 -0
  498. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_embed_local.py +0 -0
  499. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_errors_and_cli_table.py +0 -0
  500. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_eval_faithfulness.py +0 -0
  501. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_eval_gate.py +0 -0
  502. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_eval_metrics.py +0 -0
  503. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_eval_stats_summary.py +0 -0
  504. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_faithfulness.py +0 -0
  505. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_frontmatter.py +0 -0
  506. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_fuzz_targets.py +0 -0
  507. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_gitleaks_config.py +0 -0
  508. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_gitutil.py +0 -0
  509. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_imperative.py +0 -0
  510. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_import_budget.py +0 -0
  511. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_injectscan.py +0 -0
  512. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_installscan.py +0 -0
  513. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_integrity.py +0 -0
  514. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_journal.py +0 -0
  515. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_localembed.py +0 -0
  516. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_lockfile.py +0 -0
  517. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_logs.py +0 -0
  518. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_marketing_counts.py +0 -0
  519. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_mcp_install_scan.py +0 -0
  520. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_mcpdecl.py +0 -0
  521. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_mcphost.py +0 -0
  522. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_minisign.py +0 -0
  523. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_mutation_hardening.py +0 -0
  524. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_mutation_shards.py +0 -0
  525. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_mutation_subfile_shards.py +0 -0
  526. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_mutmut_source_paths.py +0 -0
  527. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_nethttp.py +0 -0
  528. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_output.py +0 -0
  529. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_paths.py +0 -0
  530. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_perf_gate.py +0 -0
  531. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_pkg_confusions.py +0 -0
  532. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_pkg_injection.py +0 -0
  533. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_pkg_secrets.py +0 -0
  534. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_platform_pins.py +0 -0
  535. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_policy.py +0 -0
  536. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_post_deploy_smoke.py +0 -0
  537. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_project_mcp_sidecar.py +0 -0
  538. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_projectlock.py +0 -0
  539. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_provenance.py +0 -0
  540. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_rag.py +0 -0
  541. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_rag_fusion.py +0 -0
  542. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_registries_fresh.py +0 -0
  543. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_registry.py +0 -0
  544. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_registry_categories.py +0 -0
  545. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_release_guard.py +0 -0
  546. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_release_preflight.py +0 -0
  547. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_required_checks.py +0 -0
  548. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_resolve.py +0 -0
  549. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_roadmap_fresh.py +0 -0
  550. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_rules.py +0 -0
  551. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_scopes.py +0 -0
  552. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_secretscan.py +0 -0
  553. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_selfupdate.py +0 -0
  554. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_serve.py +0 -0
  555. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_spin.py +0 -0
  556. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_stackprobe.py +0 -0
  557. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_staleness.py +0 -0
  558. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_store.py +0 -0
  559. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_token_parity.py +0 -0
  560. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_toolchain_lock.py +0 -0
  561. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_trustaudit.py +0 -0
  562. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_typosquat.py +0 -0
  563. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_updatediff.py +0 -0
  564. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_util.py +0 -0
  565. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_version.py +0 -0
  566. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_workflow_concurrency.py +0 -0
  567. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_workflow_timeouts.py +0 -0
  568. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_workflows.py +0 -0
  569. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/visual/a11y_check.mjs +0 -0
  570. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/visual/console_check.mjs +0 -0
  571. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/visual/package-lock.json +0 -0
  572. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/visual/package.json +0 -0
  573. {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/visual/visual_check.mjs +0 -0
@@ -228,9 +228,16 @@ each agent's skills dir, and updating the lock file.
228
228
  **Search has two engines**, both in `core/`: `rag.py` is the always-on,
229
229
  zero-dependency BM25 engine (full-content index, auto-builds on first
230
230
  search — this is what the required `eval` gate floors at recall@k ≥ 0.85).
231
- `dense.py` is optional dense/vector retrieval behind the `[rag]` extra plus
232
- an embeddings key (`VOYAGE_API_KEY`/`OPENAI_API_KEY`); it's used when both
233
- are present and falls back to BM25 otherwise. `core/ai.py` wraps the
231
+ `dense.py` is optional dense/vector retrieval behind the `[rag]` extra —
232
+ **no API key required**: `embed.py` tries Voyage, then OpenAI, then a local
233
+ `BAAI/bge-small-en-v1.5` that ships with the extra, so a key is a quality
234
+ upgrade rather than the entry fee. When both engines are built, `retrieve_any`
235
+ fuses them with reciprocal rank fusion (`rag.rrf_fuse`, `RRF_K = 60`) and
236
+ reports `hybrid RRF`; it degrades to whichever single engine is ready, and to
237
+ BM25 alone otherwise. `dense.status()` names which of the three links (extra,
238
+ backend, built store) is missing, and `dense.fix_hint()` maps that to the one
239
+ next action — both `boost doctor` and `boost search` read that same table, so
240
+ they can't give contradictory advice. `core/ai.py` wraps the
234
241
  opt-in LLM-assisted paths (`search --smart`, `explain`, `distill`, `infer`,
235
242
  `absorb`, `evolve`, `simulate`, …), shelling out to the `claude` CLI or
236
243
  `ANTHROPIC_API_KEY` when available and degrading to heuristics when not.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.316
3
+ Version: 1.0.317
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -786,17 +786,37 @@ pipx upgrade boost-skill-cli # or: pip install --upgrade boost-skill-cli
786
786
  The default install is **zero-dependency** (pure stdlib). `boost search` and the
787
787
  `boost_search` MCP tool rank results with a built-in full-content BM25 engine —
788
788
  the index builds automatically on your first search, so BM25 is the default with
789
- no setup (`boost reindex` just forces a rebuild). For optional **dense semantic
790
- search**, install the `[rag]` extra and set an embeddings key — retrieval then
791
- embeds every skill and ranks by vector similarity, falling back to BM25 whenever
792
- the extra or key is absent:
789
+ no setup (`boost reindex` just forces a rebuild).
790
+
791
+ ### Configuring semantic search
792
+
793
+ BM25 matches words. It is very good when your query shares vocabulary with the
794
+ docs and poor when it doesn't — ask it *"my app is slow"* and it has nothing to
795
+ match on. Semantic search ranks by meaning instead, and boost fuses the two so
796
+ each covers the other's blind spot.
797
+
798
+ **No API key is required.** Two steps:
793
799
 
794
800
  ```bash
795
- pip install "boost-skill-cli[rag]" # adds the sqlite-vec vector store
796
- export VOYAGE_API_KEY=... # or OPENAI_API_KEY
797
- boost reindex --dense # embed chunks into the vector store
801
+ pip install "boost-skill-cli[rag]" # vector store + local embedding model
802
+ boost reindex --dense # embed your tapped registries
798
803
  ```
799
804
 
805
+ The first search after that downloads a small embedding model once (~133 MB,
806
+ sha256-pinned, cached under `~/.boost/cache/models`) and runs it on CPU. Nothing
807
+ is sent anywhere.
808
+
809
+ | | required | what you get |
810
+ |---|---|---|
811
+ | BM25 | nothing — it is the default | keyword matching, always on |
812
+ | `[rag]` extra + `reindex --dense` | no account, no key | meaning-based search, fused with BM25 |
813
+ | `VOYAGE_API_KEY` or `OPENAI_API_KEY` | an account | a larger embedding model; same behaviour otherwise |
814
+
815
+ A key is a **quality upgrade, not an entry fee** — set one and boost prefers it
816
+ automatically, re-embedding on the next `reindex --dense`. Every layer degrades
817
+ rather than failing: no extra, no key, or no built store each fall back to BM25,
818
+ and `boost doctor` reports which engine is actually serving and why.
819
+
800
820
  Want the whole ecosystem instead of the starter set? boost ships a **curated
801
821
  registry catalog** — 460+ classified GitHub registries of skills, Cursor/Windsurf
802
822
  **rules**, and Claude Code **workflows** (slash commands & subagents),
@@ -68,17 +68,37 @@ pipx upgrade boost-skill-cli # or: pip install --upgrade boost-skill-cli
68
68
  The default install is **zero-dependency** (pure stdlib). `boost search` and the
69
69
  `boost_search` MCP tool rank results with a built-in full-content BM25 engine —
70
70
  the index builds automatically on your first search, so BM25 is the default with
71
- no setup (`boost reindex` just forces a rebuild). For optional **dense semantic
72
- search**, install the `[rag]` extra and set an embeddings key — retrieval then
73
- embeds every skill and ranks by vector similarity, falling back to BM25 whenever
74
- the extra or key is absent:
71
+ no setup (`boost reindex` just forces a rebuild).
72
+
73
+ ### Configuring semantic search
74
+
75
+ BM25 matches words. It is very good when your query shares vocabulary with the
76
+ docs and poor when it doesn't — ask it *"my app is slow"* and it has nothing to
77
+ match on. Semantic search ranks by meaning instead, and boost fuses the two so
78
+ each covers the other's blind spot.
79
+
80
+ **No API key is required.** Two steps:
75
81
 
76
82
  ```bash
77
- pip install "boost-skill-cli[rag]" # adds the sqlite-vec vector store
78
- export VOYAGE_API_KEY=... # or OPENAI_API_KEY
79
- boost reindex --dense # embed chunks into the vector store
83
+ pip install "boost-skill-cli[rag]" # vector store + local embedding model
84
+ boost reindex --dense # embed your tapped registries
80
85
  ```
81
86
 
87
+ The first search after that downloads a small embedding model once (~133 MB,
88
+ sha256-pinned, cached under `~/.boost/cache/models`) and runs it on CPU. Nothing
89
+ is sent anywhere.
90
+
91
+ | | required | what you get |
92
+ |---|---|---|
93
+ | BM25 | nothing — it is the default | keyword matching, always on |
94
+ | `[rag]` extra + `reindex --dense` | no account, no key | meaning-based search, fused with BM25 |
95
+ | `VOYAGE_API_KEY` or `OPENAI_API_KEY` | an account | a larger embedding model; same behaviour otherwise |
96
+
97
+ A key is a **quality upgrade, not an entry fee** — set one and boost prefers it
98
+ automatically, re-embedding on the next `reindex --dense`. Every layer degrades
99
+ rather than failing: no extra, no key, or no built store each fall back to BM25,
100
+ and `boost doctor` reports which engine is actually serving and why.
101
+
82
102
  Want the whole ecosystem instead of the starter set? boost ships a **curated
83
103
  registry catalog** — 460+ classified GitHub registries of skills, Cursor/Windsurf
84
104
  **rules**, and Claude Code **workflows** (slash commands & subagents),
@@ -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.316'
22
- __version_tuple__ = version_tuple = (1, 0, 316)
21
+ __version__ = version = '1.0.317'
22
+ __version_tuple__ = version_tuple = (1, 0, 317)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -12,6 +12,7 @@ import re
12
12
  import shutil
13
13
  import subprocess
14
14
  import sys
15
+ import textwrap
15
16
  import threading
16
17
  import time
17
18
  import urllib.parse
@@ -122,6 +123,7 @@ def cmd_search(argv):
122
123
  if not scored:
123
124
  out.info("no matches for %r" % query)
124
125
  out.info(out.role("try `boost discover %s` to search all of GitHub" % query, "muted"))
126
+ _hint_semantic_search(engine)
125
127
  return 0
126
128
  # The CLI's long-standing wording for the BM25 engine differs from the label
127
129
  # rag/eval use ("BM25 full-content"), and both are load-bearing: the latter
@@ -154,9 +156,44 @@ def cmd_search(argv):
154
156
  + out.truncate(e["description"] or "", desc_w) + tag)
155
157
  out.info(out.role("%d match%s · ranked by %s"
156
158
  % (len(scored), "" if len(scored) == 1 else "es", ranker), "muted"))
159
+ _hint_semantic_search(engine)
157
160
  return 0
158
161
 
159
162
 
163
+ def _hint_semantic_search(engine: str) -> None:
164
+ """Say that a better engine exists, when BM25 answered alone.
165
+
166
+ `boost search` reported which engine *ran* and never that a better one was
167
+ available, so a user who installed the extra but never reindexed had no way
168
+ to learn the semantic search they think they enabled has never once run.
169
+ That is the silent half of the three-things-must-line-up problem, and
170
+ `boost doctor` was the only surface that said anything about it.
171
+
172
+ Deliberately quiet: one muted line, only when dense contributed nothing, and
173
+ naming the ONE next action rather than the whole setup. The remedy comes
174
+ from core.dense.fix_hint — the same table doctor reads — so the two surfaces
175
+ can never disagree about whether an API key is needed.
176
+ """
177
+ if engine != "BM25 full-content":
178
+ # Anything else either already used vectors ("dense vectors", "hybrid
179
+ # RRF") or is the frontmatter fallback, where the BM25 index failed to
180
+ # build — a louder problem that this hint would only paper over.
181
+ return
182
+ from ..core import dense
183
+ st = dense.status()
184
+ if st.get("ready"):
185
+ return
186
+ # Wrap to the pane like every other row here: at COLUMNS=60 the longest
187
+ # remedy is 82 characters and would be the one line in this output that
188
+ # blows the terminal width. `break_long_words=False` keeps the shell command
189
+ # runnable — a copy-pasteable `pip install ...` matters more than a hard
190
+ # clamp, and _FIX is tested to hold no token long enough to overflow.
191
+ msg = "semantic search is off — %s" % dense.fix_hint(st.get("reason", ""))
192
+ for line in textwrap.wrap(msg, max(out.term_width(), 20),
193
+ break_long_words=False, break_on_hyphens=False):
194
+ out.info(out.role(line, "muted"))
195
+
196
+
160
197
  def cmd_reindex(argv):
161
198
  """Build/refresh the full-content (RAG) search index over tapped items."""
162
199
  p = cliparse.parser(
@@ -407,24 +407,8 @@ def cmd_doctor(argv):
407
407
  return 1 if issues else 0
408
408
 
409
409
 
410
- # Why dense retrieval isn't serving, keyed by `dense.status()["reason"]`. Each
411
- # names the ONE next action; the reason order in `status()` guarantees only the
412
- # first missing link is ever reported, so these never chain.
413
- _DENSE_FIX = {
414
- "no-backend": "install the extra: `pip install 'boost-skill-cli[rag]'`",
415
- # Names the keyless remedy first: since the [rag] extra carries a local
416
- # embedding model, an API key is the quality ceiling, not the entry fee.
417
- # This reason now means "no key AND no local backend", which in practice is
418
- # a partial install or BOOST_NO_EMBED.
419
- "no-key": ("reinstall the extra: `pip install 'boost-skill-cli[rag]'` "
420
- "(or set VOYAGE_API_KEY / OPENAI_API_KEY for a larger model)"),
421
- "no-store": "build it: `boost reindex --dense`",
422
- "version-changed": "rebuild it: `boost reindex --dense --force`",
423
- "provider-changed": "rebuild it: `boost reindex --dense --force`",
424
- "model-changed": "rebuild it: `boost reindex --dense --force`",
425
- "dim-changed": "rebuild it: `boost reindex --dense --force`",
426
- "empty": "rebuild it: `boost reindex --dense --force`",
427
- }
410
+ # The remedy table moved to core.dense.fix_hint so `boost search` reports the
411
+ # same next action as `boost doctor` — see that function for why.
428
412
 
429
413
 
430
414
  def _report_search_engine(bad) -> None:
@@ -445,7 +429,7 @@ def _report_search_engine(bad) -> None:
445
429
  st["chunks"], _s(st["chunks"]), st["taps"], _s(st["taps"])))
446
430
  return
447
431
 
448
- fix = _DENSE_FIX.get(str(st["reason"]), "see `boost reindex --dense`")
432
+ fix = dense.fix_hint(st["reason"])
449
433
  if st["degraded"]:
450
434
  # The store was built and is now dead weight: say what it holds, what
451
435
  # changed, and that search has silently been on BM25 the whole time.
@@ -134,6 +134,36 @@ def _recorded_meta() -> dict:
134
134
  con.close()
135
135
 
136
136
 
137
+ # Why dense retrieval isn't serving, keyed by the `reason` status() returns.
138
+ # Each names the ONE next action; the reason order in status() guarantees only
139
+ # the first missing link is ever reported, so these never chain.
140
+ #
141
+ # Lives here rather than in a command module because two surfaces need the same
142
+ # answer — `boost doctor` and `boost search` — and two copies would drift, which
143
+ # is how a surface ends up telling a user to set an API key that the [rag]
144
+ # extra's local model already made unnecessary.
145
+ _FIX = {
146
+ "no-backend": "install the extra: `pip install 'boost-skill-cli[rag]'`",
147
+ # Names the keyless remedy first: since the [rag] extra carries a local
148
+ # embedding model, an API key is the quality ceiling, not the entry fee.
149
+ # This reason means "no key AND no local backend", which in practice is a
150
+ # partial install or BOOST_NO_EMBED.
151
+ "no-key": ("reinstall the extra: `pip install 'boost-skill-cli[rag]'` "
152
+ "(or set VOYAGE_API_KEY / OPENAI_API_KEY for a larger model)"),
153
+ "no-store": "build it: `boost reindex --dense`",
154
+ "version-changed": "rebuild it: `boost reindex --dense --force`",
155
+ "provider-changed": "rebuild it: `boost reindex --dense --force`",
156
+ "model-changed": "rebuild it: `boost reindex --dense --force`",
157
+ "dim-changed": "rebuild it: `boost reindex --dense --force`",
158
+ "empty": "rebuild it: `boost reindex --dense --force`",
159
+ }
160
+
161
+
162
+ def fix_hint(reason: str) -> str:
163
+ """The single next action for a `status()` reason, or a safe default."""
164
+ return _FIX.get(reason, "see `boost reindex --dense`")
165
+
166
+
137
167
  def status() -> dict:
138
168
  """Why dense retrieval is, or is not, serving queries.
139
169
 
@@ -132,6 +132,31 @@ INSTRUCTIONS = (
132
132
  )
133
133
 
134
134
 
135
+ def engine_note() -> str:
136
+ """One line telling the agent which retrieval engine `boost_search` will use.
137
+
138
+ MCP hosts load `instructions` into the agent's context, and an agent that
139
+ cannot tell a keyword index from a semantic one will phrase queries for a
140
+ vector search that is not running — asking "my containers keep restarting"
141
+ of a BM25 index that needs the word "docker". Naming the engine, and the one
142
+ command that upgrades it, costs a line and removes the guess.
143
+
144
+ Appended at `initialize` rather than baked into INSTRUCTIONS because the
145
+ answer depends on machine state at connect time, not on the build.
146
+ """
147
+ from . import dense
148
+ st = dense.status()
149
+ if st.get("ready"):
150
+ return ("\n\nSEARCH ENGINE: hybrid — BM25 keywords fused with dense "
151
+ "vectors (%s). Natural-language problem descriptions retrieve "
152
+ "well; you do not need to guess the skill's vocabulary."
153
+ % st.get("model"))
154
+ return ("\n\nSEARCH ENGINE: BM25 keyword matching only — dense vectors are "
155
+ "not configured, so queries are matched on shared words rather than "
156
+ "meaning. Prefer concrete terms over paraphrase. To enable semantic "
157
+ "search, %s." % dense.fix_hint(st.get("reason", "")))
158
+
159
+
135
160
  def handle_request(req: dict, *, version: str,
136
161
  registry: Registry) -> Optional[dict]:
137
162
  """Map one parsed JSON-RPC request to its response dict.
@@ -149,7 +174,7 @@ def handle_request(req: dict, *, version: str,
149
174
  resp["result"] = {"protocolVersion": PROTOCOL_VERSION,
150
175
  "capabilities": {"tools": {}},
151
176
  "serverInfo": {"name": "boost", "version": version},
152
- "instructions": INSTRUCTIONS}
177
+ "instructions": INSTRUCTIONS + engine_note()}
153
178
  elif method == "ping":
154
179
  resp["result"] = {}
155
180
  elif method == "tools/list":
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.316
3
+ Version: 1.0.317
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -786,17 +786,37 @@ pipx upgrade boost-skill-cli # or: pip install --upgrade boost-skill-cli
786
786
  The default install is **zero-dependency** (pure stdlib). `boost search` and the
787
787
  `boost_search` MCP tool rank results with a built-in full-content BM25 engine —
788
788
  the index builds automatically on your first search, so BM25 is the default with
789
- no setup (`boost reindex` just forces a rebuild). For optional **dense semantic
790
- search**, install the `[rag]` extra and set an embeddings key — retrieval then
791
- embeds every skill and ranks by vector similarity, falling back to BM25 whenever
792
- the extra or key is absent:
789
+ no setup (`boost reindex` just forces a rebuild).
790
+
791
+ ### Configuring semantic search
792
+
793
+ BM25 matches words. It is very good when your query shares vocabulary with the
794
+ docs and poor when it doesn't — ask it *"my app is slow"* and it has nothing to
795
+ match on. Semantic search ranks by meaning instead, and boost fuses the two so
796
+ each covers the other's blind spot.
797
+
798
+ **No API key is required.** Two steps:
793
799
 
794
800
  ```bash
795
- pip install "boost-skill-cli[rag]" # adds the sqlite-vec vector store
796
- export VOYAGE_API_KEY=... # or OPENAI_API_KEY
797
- boost reindex --dense # embed chunks into the vector store
801
+ pip install "boost-skill-cli[rag]" # vector store + local embedding model
802
+ boost reindex --dense # embed your tapped registries
798
803
  ```
799
804
 
805
+ The first search after that downloads a small embedding model once (~133 MB,
806
+ sha256-pinned, cached under `~/.boost/cache/models`) and runs it on CPU. Nothing
807
+ is sent anywhere.
808
+
809
+ | | required | what you get |
810
+ |---|---|---|
811
+ | BM25 | nothing — it is the default | keyword matching, always on |
812
+ | `[rag]` extra + `reindex --dense` | no account, no key | meaning-based search, fused with BM25 |
813
+ | `VOYAGE_API_KEY` or `OPENAI_API_KEY` | an account | a larger embedding model; same behaviour otherwise |
814
+
815
+ A key is a **quality upgrade, not an entry fee** — set one and boost prefers it
816
+ automatically, re-embedding on the next `reindex --dense`. Every layer degrades
817
+ rather than failing: no extra, no key, or no built store each fall back to BM25,
818
+ and `boost doctor` reports which engine is actually serving and why.
819
+
800
820
  Want the whole ecosystem instead of the starter set? boost ships a **curated
801
821
  registry catalog** — 460+ classified GitHub registries of skills, Cursor/Windsurf
802
822
  **rules**, and Claude Code **workflows** (slash commands & subagents),
@@ -485,6 +485,7 @@ tests/unit/test_community_health_files.py
485
485
  tests/unit/test_config.py
486
486
  tests/unit/test_dense.py
487
487
  tests/unit/test_dense_fallback.py
488
+ tests/unit/test_dense_fix_hint.py
488
489
  tests/unit/test_dense_status.py
489
490
  tests/unit/test_dependabot_config.py
490
491
  tests/unit/test_docs_pages_linked.py
@@ -222,9 +222,9 @@
222
222
  <!-- embed -->
223
223
  <rect x="480" y="200" width="180" height="86" rx="12" fill="rgba(244,114,208,.07)" stroke="#f472d0" stroke-width="1.2"/>
224
224
  <text x="570" y="228" text-anchor="middle" class="head">embed (urllib)</text>
225
- <text x="570" y="248" text-anchor="middle" class="lbl-s">Voyage · OpenAI</text>
226
- <text x="570" y="265" text-anchor="middle" class="lbl-t" textLength="164" lengthAdjust="spacingAndGlyphs">voyage-3 1024 / t-e-3-small 1536</text>
227
- <text x="570" y="280" text-anchor="middle" class="note">opt-in · needs key</text>
225
+ <text x="570" y="248" text-anchor="middle" class="lbl-s">Voyage · OpenAI · local</text>
226
+ <text x="570" y="265" text-anchor="middle" class="lbl-t" textLength="164" lengthAdjust="spacingAndGlyphs">voyage-4 1024 / bge-small 384</text>
227
+ <text x="570" y="280" text-anchor="middle" class="note">opt-in · no key needed</text>
228
228
  <line x1="420" y1="170" x2="480" y2="235" stroke="#f472d0" stroke-width="1.4" marker-end="url(#iap)"/>
229
229
 
230
230
  <!-- dense store -->
@@ -590,13 +590,15 @@ _MCP_TOOLS = REGISTRY.specs() <span class="cm"># list stays in sync</span>
590
590
  <summary>Search by meaning, not words <span class="topic-tag">dense</span></summary>
591
591
  <div class="body"><p>An optional upgrade turns every skill into a point in "meaning space,"
592
592
  so "test my React app" can find a <code>jest</code> skill even with no shared words —
593
- it just finds the nearest points. It's optional because it needs an extra install and a key.</p></div>
593
+ it just finds the nearest points. It's optional because it needs an extra install — but not a key.</p></div>
594
594
  </details>
595
595
  <details class="card tech">
596
596
  <summary>Dense embeddings + sqlite-vec <span class="topic-tag">Phase 2 · [rag]</span></summary>
597
597
  <div class="body"><p>Chunks are embedded via <code>embed</code> over urllib — preferring
598
- <code>VOYAGE_API_KEY</code> (<code>voyage-3</code>, 1024-d) then <code>OPENAI_API_KEY</code>
599
- (<code>text-embedding-3-small</code>, 1536-d) — and stored in a <code>sqlite-vec</code>
598
+ <code>VOYAGE_API_KEY</code> (<code>voyage-4</code>, 1024-d), then <code>OPENAI_API_KEY</code>
599
+ (<code>text-embedding-3-small</code>, 1536-d), and falling back to a local
600
+ <code>BAAI/bge-small-en-v1.5</code> (384-d) that ships with the extra and needs no
601
+ key at all — and stored in a <code>sqlite-vec</code>
600
602
  <code>vec0(… distance_metric=cosine)</code> table. Retrieval does a KNN over-fetch
601
603
  (<code>max(k×8, 200)</code>) then reduces per-entry. A provider/dimension change
602
604
  invalidates the store so stale vectors are never served.</p></div>
@@ -0,0 +1,49 @@
1
+ ---
2
+ id: prerequisites-and-semantic-search-setup
3
+ board: code
4
+ section: docsite
5
+ status: shipped
6
+ category: Docs · Setup
7
+ complexity: M
8
+ impact: High
9
+ wow: 3
10
+ note: silent BM25-only is the default outcome
11
+ order: 58
12
+ owner: loop/semantic-search-setup
13
+ pr: 364
14
+ title: Nothing tells a user semantic search is off — not the README, not <code>search</code>, not <code>/mcp</code>
15
+ ---
16
+ <b>Shipped.</b> Dense retrieval needs things to line up — the <code>[rag]</code>
17
+ extra (<code>sqlite-vec</code> plus a bundled local model, so an embeddings key
18
+ is now a quality upgrade rather than the entry fee) <em>and</em> a built vector
19
+ store (<code>boost reindex --dense</code>) — and every one of them failed
20
+ <em>silently</em>: <code>rag.retrieve_any</code> floors to BM25 and returns, so a
21
+ user who installed the extra but never set a key, or set a key but never
22
+ reindexed, has no way to learn that the semantic search they think they enabled
23
+ had never once run. Three gaps, all closed:
24
+ <b>(1) README.</b> Prerequisites live in half a sentence (&ldquo;Needs Python 3.9+
25
+ and <code>git</code>&rdquo;) and the optional stack is buried in Install prose.
26
+ Give required vs. optional prerequisites a dedicated
27
+ <b>Configuring semantic search</b> section, and automate the optional install the
28
+ way <code>requirements/*.txt</code> already does for the toolchain, so it is one
29
+ command rather than three remembered ones.
30
+ <b>(2) Surfacing.</b> <code>cmd_search</code> printed which engine <em>ran</em> but
31
+ never that a better one was available — <code>embed.fallback_note()</code> exists
32
+ and is only wired into <code>reindex --dense</code>. Now said on search — including the
33
+ zero-results path, where a keyword engine finding nothing is exactly what a
34
+ semantic one is for — and silent when vectors already served or output is
35
+ <code>--json</code>. The remedy table moved out of <code>commands/quality.py</code>
36
+ into <code>core.dense.fix_hint</code>, so <code>doctor</code> and
37
+ <code>search</code> cannot give contradictory advice; it had no tests at all,
38
+ which is how its &ldquo;set an API key&rdquo; entry went stale. Engine state also
39
+ lands in the MCP <code>initialize</code> <code>instructions</code>, appended at
40
+ connect time, so an agent reading <code>/mcp</code> sees
41
+ &ldquo;BM25 keyword matching only&rdquo; instead of assuming vector search.
42
+ <b>(3) Stale docs.</b> <code>mcp-hub.html</code> advertised
43
+ <code>voyage-3</code> (1024-d) in the pipeline diagram and the Phase&nbsp;2
44
+ details block; <code>core/embed.py</code> has pinned <code>voyage-4</code> since
45
+ the complimentary-token change; the sweep also caught the diagram and prose
46
+ still calling a key mandatory, and the same claim in <code>CLAUDE.md</code>.
47
+ Three environment-dependent tests were fixed on the way: they asserted answers
48
+ that were only correct where the <code>[rag]</code> extra was <em>absent</em>,
49
+ so they were green on CI and red on any machine that had installed it.
@@ -4571,34 +4571,42 @@ pip/pipx installs and telling a PyPI user to clone the repo — is separate and
4571
4571
  </article>
4572
4572
 
4573
4573
  <article class="cap rcard" id="prerequisites-and-semantic-search-setup">
4574
- <div class="head"><span class="pill planned">Planned</span><span class="cat">Docs · Setup</span></div>
4574
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Docs · Setup</span></div>
4575
4575
  <h3>Nothing tells a user semantic search is off — not the README, not <code>search</code>, not <code>/mcp</code></h3>
4576
- <p>Dense retrieval needs three separate things to line up — the <code>[rag]</code>
4577
- extra (<code>sqlite-vec</code>), an embeddings key (<code>VOYAGE_API_KEY</code> or
4578
- <code>OPENAI_API_KEY</code>), <em>and</em> a built vector store
4579
- (<code>boost reindex --dense</code>) — and every one of them fails
4576
+ <p><b>Shipped.</b> Dense retrieval needs things to line up — the <code>[rag]</code>
4577
+ extra (<code>sqlite-vec</code> plus a bundled local model, so an embeddings key
4578
+ is now a quality upgrade rather than the entry fee) <em>and</em> a built vector
4579
+ store (<code>boost reindex --dense</code>) — and every one of them failed
4580
4580
  <em>silently</em>: <code>rag.retrieve_any</code> floors to BM25 and returns, so a
4581
4581
  user who installed the extra but never set a key, or set a key but never
4582
4582
  reindexed, has no way to learn that the semantic search they think they enabled
4583
- has never once run. Three gaps to close:
4583
+ had never once run. Three gaps, all closed:
4584
4584
  <b>(1) README.</b> Prerequisites live in half a sentence (&ldquo;Needs Python 3.9+
4585
4585
  and <code>git</code>&rdquo;) and the optional stack is buried in Install prose.
4586
4586
  Give required vs. optional prerequisites a dedicated
4587
4587
  <b>Configuring semantic search</b> section, and automate the optional install the
4588
4588
  way <code>requirements/*.txt</code> already does for the toolchain, so it is one
4589
4589
  command rather than three remembered ones.
4590
- <b>(2) Surfacing.</b> <code>cmd_search</code> prints which engine <em>ran</em> but
4591
- never that a better one is available — <code>embed.fallback_note()</code> exists
4592
- and is only wired into <code>reindex --dense</code>. Say it on search too, and
4593
- put engine state in the MCP <code>initialize</code> response
4594
- (<code>serverInfo</code>/<code>instructions</code>) so an agent reading
4595
- <code>/mcp</code> can see &ldquo;BM25 only — dense not configured&rdquo; instead of
4596
- assuming vector search.
4597
- <b>(3) Stale docs.</b> <code>mcp-hub.html</code> still advertises
4590
+ <b>(2) Surfacing.</b> <code>cmd_search</code> printed which engine <em>ran</em> but
4591
+ never that a better one was available — <code>embed.fallback_note()</code> exists
4592
+ and is only wired into <code>reindex --dense</code>. Now said on search — including the
4593
+ zero-results path, where a keyword engine finding nothing is exactly what a
4594
+ semantic one is for — and silent when vectors already served or output is
4595
+ <code>--json</code>. The remedy table moved out of <code>commands/quality.py</code>
4596
+ into <code>core.dense.fix_hint</code>, so <code>doctor</code> and
4597
+ <code>search</code> cannot give contradictory advice; it had no tests at all,
4598
+ which is how its &ldquo;set an API key&rdquo; entry went stale. Engine state also
4599
+ lands in the MCP <code>initialize</code> <code>instructions</code>, appended at
4600
+ connect time, so an agent reading <code>/mcp</code> sees
4601
+ &ldquo;BM25 keyword matching only&rdquo; instead of assuming vector search.
4602
+ <b>(3) Stale docs.</b> <code>mcp-hub.html</code> advertised
4598
4603
  <code>voyage-3</code> (1024-d) in the pipeline diagram and the Phase&nbsp;2
4599
4604
  details block; <code>core/embed.py</code> has pinned <code>voyage-4</code> since
4600
- the complimentary-token change. Same sweep should catch any other drifted model
4601
- or extra names across <code>docs/*.html</code>.</p>
4605
+ the complimentary-token change; the sweep also caught the diagram and prose
4606
+ still calling a key mandatory, and the same claim in <code>CLAUDE.md</code>.
4607
+ Three environment-dependent tests were fixed on the way: they asserted answers
4608
+ that were only correct where the <code>[rag]</code> extra was <em>absent</em>,
4609
+ so they were green on CI and red on any machine that had installed it.</p>
4602
4610
  <div class="meta">
4603
4611
  <span class="m">Complexity <b>M</b></span>
4604
4612
  <span class="m hi">Impact <b>High</b></span>
@@ -1084,7 +1084,15 @@ class TestReindex:
1084
1084
  r = boost("search", "brainstorming")
1085
1085
  assert "ranked by full-content BM25" in r.out
1086
1086
 
1087
- def test_dense_skipped_without_embeddings_key(self, boost, tapped):
1087
+ def test_dense_skipped_when_no_backend_at_all(self, boost, tapped, monkeypatch):
1088
+ """No key and no local model: BM25 still builds, dense says why it didn't.
1089
+
1090
+ `local_available` is forced off because the [rag] extra now ships a
1091
+ model — without this the command really does build a dense index here,
1092
+ and the assertion below was passing only where the extra was absent.
1093
+ """
1094
+ from boost_cli.core import embed
1095
+ monkeypatch.setattr(embed, "local_available", lambda: False)
1088
1096
  r = boost("reindex", "--dense")
1089
1097
  assert "indexed" in r.out # BM25 still builds
1090
1098
  assert "dense index skipped" in r.out
@@ -1162,3 +1170,59 @@ class TestReindex:
1162
1170
  assert "dense vector store is empty" in r.out
1163
1171
  assert "--force" in r.out
1164
1172
  assert dense.ready() is False
1173
+
1174
+
1175
+ class TestSearchSemanticHint:
1176
+ """`boost search` must say a better engine exists, not just which one ran.
1177
+
1178
+ The gap this closes: search reported "ranked by full-content BM25" and
1179
+ stopped. A user who installed the [rag] extra but never ran `boost reindex
1180
+ --dense` saw nothing to suggest the semantic search they think they enabled
1181
+ has never once run — `boost doctor` was the only surface that said so, and
1182
+ nobody runs doctor after a search that merely felt mediocre.
1183
+
1184
+ The hint is deliberately quiet, so these tests pin the *silences* as hard as
1185
+ the message: no hint when vectors already served, and none in --json.
1186
+ """
1187
+
1188
+ def test_bm25_only_search_says_semantic_is_off(self, boost, tapped):
1189
+ boost("reindex")
1190
+ r = boost("search", "brainstorming")
1191
+ assert "ranked by full-content BM25" in r.out # unchanged
1192
+ assert "semantic search is off" in r.out
1193
+
1194
+ def test_hint_names_the_one_next_action(self, boost, tapped):
1195
+ # Without the extra the remedy is the install; with it, the reindex.
1196
+ # Either way exactly one command is named, never the whole setup.
1197
+ #
1198
+ # Matched against the whole output with whitespace collapsed, because
1199
+ # the hint legitimately wraps across lines in a narrow pane — asserting
1200
+ # on a single line made this test fail at COLUMNS=40 for a layout the
1201
+ # code was getting right.
1202
+ boost("reindex")
1203
+ r = boost("search", "brainstorming")
1204
+ flat = " ".join(r.out.split())
1205
+ assert "semantic search is off" in flat
1206
+ assert "pip install" in flat or "boost reindex --dense" in flat
1207
+
1208
+ def test_zero_results_still_hints(self, boost, tapped):
1209
+ # The strongest case for the hint: a keyword engine finding nothing is
1210
+ # exactly the shape of query a semantic one exists to answer.
1211
+ r = boost("search", "zzzznotathinginanycatalog")
1212
+ assert "no matches" in r.out
1213
+ assert "semantic search is off" in r.out
1214
+
1215
+ def test_json_output_carries_no_hint(self, boost, tapped):
1216
+ # --json is parsed by other programs; a stray human line corrupts it.
1217
+ boost("reindex")
1218
+ r = boost("search", "brainstorming", "--json")
1219
+ assert "semantic search is off" not in r.out
1220
+ json.loads(r.out) # still valid JSON
1221
+
1222
+ def test_no_hint_once_dense_is_ready(self, boost, tapped, monkeypatch):
1223
+ # The inverse: a user who finished the setup must never be nagged.
1224
+ from boost_cli.core import dense
1225
+ monkeypatch.setattr(dense, "status", lambda: {"ready": True, "reason": None})
1226
+ boost("reindex")
1227
+ r = boost("search", "brainstorming")
1228
+ assert "semantic search is off" not in r.out