boost-skill-cli 1.2.16__tar.gz → 1.2.17__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 (740) hide show
  1. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/.vale/styles/config/vocabularies/boost/accept.txt +1 -0
  2. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/CLAUDE.md +41 -2
  3. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/PKG-INFO +1 -1
  4. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/_version.py +2 -2
  5. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/commands/discovery.py +14 -1
  6. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/commands/quality.py +14 -1
  7. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/dense.py +314 -37
  8. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  9. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_skill_cli.egg-info/SOURCES.txt +3 -0
  10. boost_skill_cli-1.2.17/docs/roadmap/items/dense-search-rescans-every-vector.md +94 -0
  11. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap.html +91 -1
  12. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/functional/test_cli_discovery.py +10 -10
  13. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_dense.py +7 -7
  14. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_dense_embed_dedupe.py +9 -9
  15. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_dense_fallback.py +7 -7
  16. boost_skill_cli-1.2.17/tests/unit/test_dense_quantized.py +376 -0
  17. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_dense_shards.py +56 -22
  18. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_dense_status.py +11 -2
  19. boost_skill_cli-1.2.17/tests/unit/test_dense_status_cheap.py +281 -0
  20. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/.gitattributes +0 -0
  21. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/.gitignore +0 -0
  22. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/.gitleaks.toml +0 -0
  23. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/.htmlvalidate.json +0 -0
  24. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/.lighthouserc.json +0 -0
  25. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/.lycheeignore +0 -0
  26. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/.markdownlint-cli2.jsonc +0 -0
  27. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/.pre-commit-config.yaml +0 -0
  28. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/.stylelintrc.json +0 -0
  29. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/.vale/styles/boost/Terminology.yml +0 -0
  30. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/.vale.ini +0 -0
  31. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/CODE_OF_CONDUCT.md +0 -0
  32. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/CONTRIBUTING.md +0 -0
  33. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/LICENSE +0 -0
  34. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/MANIFEST.in +0 -0
  35. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/Makefile +0 -0
  36. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/README.md +0 -0
  37. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/SECURITY.md +0 -0
  38. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost +0 -0
  39. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/__init__.py +0 -0
  40. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/__main__.py +0 -0
  41. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/cli.py +0 -0
  42. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/cliparse.py +0 -0
  43. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/commands/__init__.py +0 -0
  44. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/commands/_common.py +0 -0
  45. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/commands/bmad.py +0 -0
  46. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/commands/configuration.py +0 -0
  47. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/commands/hooks.py +0 -0
  48. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/commands/info.py +0 -0
  49. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/commands/intelligence.py +0 -0
  50. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/commands/pkg.py +0 -0
  51. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/commands/run.py +0 -0
  52. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/commands/safety.py +0 -0
  53. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/commands/taps.py +0 -0
  54. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/commands/team.py +0 -0
  55. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/__init__.py +0 -0
  56. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/adapters.py +0 -0
  57. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/agents.py +0 -0
  58. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/ai.py +0 -0
  59. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/bmad.py +0 -0
  60. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/bootstrap.py +0 -0
  61. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/browse.py +0 -0
  62. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/builtin.py +0 -0
  63. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/capabilities.py +0 -0
  64. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/catalog.py +0 -0
  65. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/catalogbundle.py +0 -0
  66. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/chat.py +0 -0
  67. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/claude_settings.py +0 -0
  68. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/complete.py +0 -0
  69. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/config.py +0 -0
  70. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/ed25519.py +0 -0
  71. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/embed.py +0 -0
  72. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/faithfulness.py +0 -0
  73. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/frontmatter.py +0 -0
  74. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/gitutil.py +0 -0
  75. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/imperative.py +0 -0
  76. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/injectscan.py +0 -0
  77. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/installscan.py +0 -0
  78. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/integrity.py +0 -0
  79. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/journal.py +0 -0
  80. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/localembed.py +0 -0
  81. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/lockfile.py +0 -0
  82. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/logs.py +0 -0
  83. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/mcp.py +0 -0
  84. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/mcpdecl.py +0 -0
  85. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/mcphost.py +0 -0
  86. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/minisign.py +0 -0
  87. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/nethttp.py +0 -0
  88. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/output.py +0 -0
  89. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/paths.py +0 -0
  90. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/policy.py +0 -0
  91. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/projectlock.py +0 -0
  92. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/provenance.py +0 -0
  93. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/rag.py +0 -0
  94. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/registry.py +0 -0
  95. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/resolve.py +0 -0
  96. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/rules.py +0 -0
  97. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/scopes.py +0 -0
  98. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/secretscan.py +0 -0
  99. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/selfupdate.py +0 -0
  100. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/serve.py +0 -0
  101. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/stackprobe.py +0 -0
  102. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/staleness.py +0 -0
  103. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/store.py +0 -0
  104. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/trustaudit.py +0 -0
  105. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/typosquat.py +0 -0
  106. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/updatediff.py +0 -0
  107. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/util.py +0 -0
  108. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/core/workflows.py +0 -0
  109. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/data/registries.json +0 -0
  110. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/data/rules/boost-first.mdc +0 -0
  111. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/errors.py +0 -0
  112. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_cli/spin.py +0 -0
  113. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_langchain/__init__.py +0 -0
  114. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_langchain/_compat.py +0 -0
  115. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_langchain/graph.py +0 -0
  116. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_langchain/loader.py +0 -0
  117. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_langchain/py.typed +0 -0
  118. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_langchain/retriever.py +0 -0
  119. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  120. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  121. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_skill_cli.egg-info/requires.txt +0 -0
  122. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/boost_skill_cli.egg-info/top_level.txt +0 -0
  123. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/codecov.yml +0 -0
  124. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/.claude/settings.local.json +0 -0
  125. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/DEBUGGING.md +0 -0
  126. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/adapters.html +0 -0
  127. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/architecture/README.md +0 -0
  128. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/architecture/c4-components-core.md +0 -0
  129. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/architecture/c4-containers.md +0 -0
  130. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/architecture/c4-context.md +0 -0
  131. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/architecture/c4-dynamic-install.md +0 -0
  132. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/carousel/gifs/distill.gif +0 -0
  133. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/carousel/gifs/doctor.gif +0 -0
  134. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/carousel/gifs/explain.gif +0 -0
  135. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/carousel/gifs/hooks.gif +0 -0
  136. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/carousel/gifs/install.gif +0 -0
  137. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/carousel/gifs/pulse.gif +0 -0
  138. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/carousel/gifs/search.gif +0 -0
  139. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/carousel/gifs/tap.gif +0 -0
  140. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/carousel/tapes/distill.tape +0 -0
  141. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/carousel/tapes/doctor.tape +0 -0
  142. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/carousel/tapes/explain.tape +0 -0
  143. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/carousel/tapes/hooks.tape +0 -0
  144. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/carousel/tapes/install.tape +0 -0
  145. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/carousel/tapes/pulse.tape +0 -0
  146. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/carousel/tapes/search.tape +0 -0
  147. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/carousel/tapes/tap.tape +0 -0
  148. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/carousel.html +0 -0
  149. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/chat.html +0 -0
  150. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/commands.html +0 -0
  151. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/demo-index.json +0 -0
  152. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/demo.gif +0 -0
  153. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/demo.html +0 -0
  154. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/demo.tape +0 -0
  155. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/design-roadmap.html +0 -0
  156. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/eval-latest.json +0 -0
  157. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/eval.html +0 -0
  158. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/index.html +0 -0
  159. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/langchain.html +0 -0
  160. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/mcp-hub.html +0 -0
  161. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/rag-architecture.md +0 -0
  162. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D01.md +0 -0
  163. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D02.md +0 -0
  164. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D03.md +0 -0
  165. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D04.md +0 -0
  166. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D05.md +0 -0
  167. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D06.md +0 -0
  168. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D07.md +0 -0
  169. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D08.md +0 -0
  170. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D09.md +0 -0
  171. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D10.md +0 -0
  172. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D11.md +0 -0
  173. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D12.md +0 -0
  174. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D13.md +0 -0
  175. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D14.md +0 -0
  176. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D15.md +0 -0
  177. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D16.md +0 -0
  178. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D17.md +0 -0
  179. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D18.md +0 -0
  180. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D19.md +0 -0
  181. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D20.md +0 -0
  182. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D21.md +0 -0
  183. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D22.md +0 -0
  184. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D23.md +0 -0
  185. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D24.md +0 -0
  186. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D25.md +0 -0
  187. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/BOOST-D26.md +0 -0
  188. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  189. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  190. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  191. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  192. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  193. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  194. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  195. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  196. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  197. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  198. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  199. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  200. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
  201. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/boost-first-rule.md +0 -0
  202. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  203. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  204. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  205. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  206. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
  207. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  208. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  209. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  210. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  211. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
  212. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  213. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  214. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  215. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  216. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  217. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  218. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  219. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  220. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
  221. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/command-carousel-page.md +0 -0
  222. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  223. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  224. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
  225. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  226. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  227. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  228. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  229. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  230. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  231. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
  232. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  233. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  234. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  235. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  236. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  237. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  238. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  239. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  240. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  241. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
  242. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  243. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  244. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  245. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  246. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  247. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  248. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  249. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  250. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  251. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  252. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  253. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  254. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  255. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  256. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  257. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  258. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  259. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  260. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  261. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  262. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  263. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  264. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  265. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  266. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  267. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  268. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/github-community-health-files.md +0 -0
  269. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  270. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  271. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  272. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  273. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  274. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  275. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  276. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  277. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  278. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  279. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  280. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  281. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  282. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  283. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  284. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  285. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  286. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  287. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  288. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  289. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  290. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  291. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  292. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  293. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  294. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  295. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  296. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  297. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  298. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  299. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  300. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  301. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  302. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  303. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  304. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  305. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  306. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  307. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  308. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  309. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  310. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  311. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  312. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  313. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  314. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  315. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  316. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  317. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  318. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  319. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  320. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  321. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  322. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  323. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  324. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  325. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  326. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  327. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  328. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  329. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  330. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  331. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  332. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  333. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  334. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  335. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  336. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  337. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  338. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  339. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  340. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  341. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  342. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  343. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
  344. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  345. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  346. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  347. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  348. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  349. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  350. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  351. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  352. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  353. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  354. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  355. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  356. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  357. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  358. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  359. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  360. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  361. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  362. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  363. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  364. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  365. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  366. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  367. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  368. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  369. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  370. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  371. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  372. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  373. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  374. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  375. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  376. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  377. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  378. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  379. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  380. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  381. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  382. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  383. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  384. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  385. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  386. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  387. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  388. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  389. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  390. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  391. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
  392. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  393. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  394. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  395. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  396. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  397. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  398. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
  399. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
  400. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
  401. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  402. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
  403. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
  404. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  405. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  406. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  407. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
  408. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  409. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  410. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  411. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  412. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  413. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  414. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
  415. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  416. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  417. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  418. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
  419. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  420. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
  421. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
  422. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
  423. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
  424. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  425. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
  426. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
  427. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
  428. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  429. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  430. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  431. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  432. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  433. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  434. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  435. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  436. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  437. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  438. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  439. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  440. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  441. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  442. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  443. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  444. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  445. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  446. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/workspace-scope-install.md +0 -0
  447. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/zip-strict-audit.md +0 -0
  448. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  449. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  450. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
  451. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/eslint.config.mjs +0 -0
  452. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/evals/README.md +0 -0
  453. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/evals/__init__.py +0 -0
  454. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/evals/baseline.json +0 -0
  455. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/evals/faithfulness.py +0 -0
  456. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/evals/golden_set.json +0 -0
  457. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/evals/make_corpus.py +0 -0
  458. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/evals/make_golden.py +0 -0
  459. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/evals/metrics.py +0 -0
  460. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/evals/publish_golden_dataset.py +0 -0
  461. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/evals/run_evals.py +0 -0
  462. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/examples/README.md +0 -0
  463. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/examples/adapt-demo.sh +0 -0
  464. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/examples/boost-run-prototype.sh +0 -0
  465. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/index.html +0 -0
  466. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/noxfile.py +0 -0
  467. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/pyproject.toml +0 -0
  468. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/requirements/coverage-tools.in +0 -0
  469. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/requirements/coverage-tools.txt +0 -0
  470. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/requirements/lint-tools.in +0 -0
  471. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/requirements/lint-tools.txt +0 -0
  472. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/requirements/mutation-tools.in +0 -0
  473. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/requirements/mutation-tools.txt +0 -0
  474. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/requirements/platform-pins.lock +0 -0
  475. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/requirements/release-tools.in +0 -0
  476. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/requirements/release-tools.txt +0 -0
  477. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/requirements/test-tools.in +0 -0
  478. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/requirements/test-tools.txt +0 -0
  479. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/a11y_check.py +0 -0
  480. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/bench_cli.sh +0 -0
  481. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/build_command_reference.py +0 -0
  482. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/build_demo_index.py +0 -0
  483. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/build_registries.py +0 -0
  484. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/build_roadmap.py +0 -0
  485. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/build_scale_corpus.py +0 -0
  486. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/check_anchors.py +0 -0
  487. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/check_licenses.py +0 -0
  488. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/check_required_checks.py +0 -0
  489. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/ensure_eval_corpus.sh +0 -0
  490. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/eval_corpus.py +0 -0
  491. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/eval_explain.py +0 -0
  492. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/eval_gate.py +0 -0
  493. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/eval_recommend.py +0 -0
  494. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/eval_retrieval.py +0 -0
  495. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/eval_stats_summary.py +0 -0
  496. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/import_budget.py +0 -0
  497. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/lock_toolchain.py +0 -0
  498. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/measure_registry.py +0 -0
  499. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/mutation_gate.py +0 -0
  500. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/mutation_shards.py +0 -0
  501. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/mutation_weights.json +0 -0
  502. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/page_budget.py +0 -0
  503. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/perf_gate.py +0 -0
  504. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/post_deploy_smoke.py +0 -0
  505. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/publish_eval_json.py +0 -0
  506. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/release_guard.py +0 -0
  507. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/release_preflight.py +0 -0
  508. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/scripts/serve_docs.py +0 -0
  509. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/setup.cfg +0 -0
  510. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/sonar-project.properties +0 -0
  511. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/style/README.md +0 -0
  512. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/style/boost.css +0 -0
  513. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/style/boost.js +0 -0
  514. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/style/demo.html +0 -0
  515. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/bdd/features/adapt.feature +0 -0
  516. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/bdd/features/browse.feature +0 -0
  517. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/bdd/features/count.feature +0 -0
  518. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/bdd/features/discover.feature +0 -0
  519. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/bdd/features/doctor.feature +0 -0
  520. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/bdd/features/environment.py +0 -0
  521. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/bdd/features/explain.feature +0 -0
  522. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/bdd/features/index.feature +0 -0
  523. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/bdd/features/install.feature +0 -0
  524. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/bdd/features/list.feature +0 -0
  525. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/bdd/features/mcp.feature +0 -0
  526. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/bdd/features/search.feature +0 -0
  527. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/bdd/features/steps/cli_steps.py +0 -0
  528. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/bdd/features/steps/discovery_steps.py +0 -0
  529. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/bdd/features/steps/mcp_steps.py +0 -0
  530. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/bdd/features/steps/quality_steps.py +0 -0
  531. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/conftest.py +0 -0
  532. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/eval/baseline.json +0 -0
  533. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/eval/explain.jsonl +0 -0
  534. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/eval/golden-natural.jsonl +0 -0
  535. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/eval/golden.jsonl +0 -0
  536. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/eval/recommend.jsonl +0 -0
  537. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/eval/taps-scale.txt +0 -0
  538. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/eval/taps.txt +0 -0
  539. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/functional/test_capabilities_policy.py +0 -0
  540. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/functional/test_cli_adapt.py +0 -0
  541. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/functional/test_cli_bmad.py +0 -0
  542. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/functional/test_cli_catalog.py +0 -0
  543. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/functional/test_cli_chat.py +0 -0
  544. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/functional/test_cli_configuration.py +0 -0
  545. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/functional/test_cli_hooks.py +0 -0
  546. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/functional/test_cli_info.py +0 -0
  547. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/functional/test_cli_intelligence.py +0 -0
  548. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/functional/test_cli_pkg.py +0 -0
  549. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/functional/test_cli_quality.py +0 -0
  550. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/functional/test_cli_taps.py +0 -0
  551. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/functional/test_cli_team.py +0 -0
  552. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/functional/test_everyday_loop.py +0 -0
  553. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/functional/test_integrity_enforce.py +0 -0
  554. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/functional/test_kind_conformance.py +0 -0
  555. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/functional/test_property_parsers.py +0 -0
  556. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/functional/test_run.py +0 -0
  557. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/functional/test_tap_signing.py +0 -0
  558. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/functional/test_workspace_scope.py +0 -0
  559. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/README.md +0 -0
  560. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  561. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  562. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  563. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  564. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  565. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  566. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  567. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  568. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  569. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  570. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  571. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  572. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  573. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  574. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  575. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  576. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  577. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  578. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  579. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  580. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
  581. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
  582. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
  583. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/fuzz_frontmatter.py +0 -0
  584. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/fuzz/fuzz_registry.py +0 -0
  585. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/langchain/conftest.py +0 -0
  586. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/langchain/test_graph.py +0 -0
  587. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/langchain/test_loader.py +0 -0
  588. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/langchain/test_retriever.py +0 -0
  589. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/make_fixture.py +0 -0
  590. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/perf/test_benchmarks.py +0 -0
  591. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/smoke.sh +0 -0
  592. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_a11y_check.py +0 -0
  593. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_action_pin_lockstep.py +0 -0
  594. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_adapters.py +0 -0
  595. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_adapters_multi.py +0 -0
  596. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_adapters_runner.py +0 -0
  597. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_agents.py +0 -0
  598. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_ai.py +0 -0
  599. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_bmad_core.py +0 -0
  600. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_boost_first_offer.py +0 -0
  601. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_bootstrap.py +0 -0
  602. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_browse.py +0 -0
  603. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_builtin.py +0 -0
  604. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_capabilities.py +0 -0
  605. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_catalog.py +0 -0
  606. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_catalogbundle.py +0 -0
  607. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_chat.py +0 -0
  608. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_check_anchors.py +0 -0
  609. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_check_licenses.py +0 -0
  610. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_claude_settings.py +0 -0
  611. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_clean_internal_cache.py +0 -0
  612. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_cliparse.py +0 -0
  613. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_codeql_analysis_key.py +0 -0
  614. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_command_reference_fresh.py +0 -0
  615. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_community_health_files.py +0 -0
  616. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_compact.py +0 -0
  617. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_complete.py +0 -0
  618. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_complete_rc_block.py +0 -0
  619. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_config.py +0 -0
  620. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_content_dedupe.py +0 -0
  621. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_content_identity.py +0 -0
  622. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_crash_redaction.py +0 -0
  623. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_dedup_trust.py +0 -0
  624. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_demo_index.py +0 -0
  625. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_dense_fix_hint.py +0 -0
  626. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_dense_ready_order.py +0 -0
  627. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_dense_shard_real_schema.py +0 -0
  628. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
  629. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_dependabot_config.py +0 -0
  630. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_docs_pages_linked.py +0 -0
  631. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_docsite_chrome.py +0 -0
  632. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_ed25519.py +0 -0
  633. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_embed.py +0 -0
  634. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_embed_local.py +0 -0
  635. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_embed_truncated_response.py +0 -0
  636. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_entry_key.py +0 -0
  637. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_errors_and_cli_table.py +0 -0
  638. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_eval_baseline.py +0 -0
  639. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_eval_corpus.py +0 -0
  640. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_eval_faithfulness.py +0 -0
  641. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_eval_gate.py +0 -0
  642. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_eval_grading.py +0 -0
  643. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_eval_metrics.py +0 -0
  644. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_eval_stats_summary.py +0 -0
  645. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  646. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_faithfulness.py +0 -0
  647. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_frontmatter.py +0 -0
  648. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_fuzz_targets.py +0 -0
  649. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  650. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_gitleaks_config.py +0 -0
  651. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_gitutil.py +0 -0
  652. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_gitutil_lfs.py +0 -0
  653. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_gitutil_sparse.py +0 -0
  654. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_imperative.py +0 -0
  655. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_import_budget.py +0 -0
  656. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_injectscan.py +0 -0
  657. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_install_permission_error.py +0 -0
  658. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_installscan.py +0 -0
  659. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_integrity.py +0 -0
  660. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_journal.py +0 -0
  661. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_langchain_packaging.py +0 -0
  662. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_link_ownership.py +0 -0
  663. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_localembed.py +0 -0
  664. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_localembed_e2e.py +0 -0
  665. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_lockfile.py +0 -0
  666. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_logs.py +0 -0
  667. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_marketing_counts.py +0 -0
  668. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_mcp.py +0 -0
  669. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_mcp_install_scan.py +0 -0
  670. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_mcpdecl.py +0 -0
  671. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_mcphost.py +0 -0
  672. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_measure_registry.py +0 -0
  673. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_minisign.py +0 -0
  674. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_mutation_hardening.py +0 -0
  675. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_mutation_shards.py +0 -0
  676. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_mutation_subfile_shards.py +0 -0
  677. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_mutmut_source_paths.py +0 -0
  678. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_nethttp.py +0 -0
  679. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_output.py +0 -0
  680. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_page_budget.py +0 -0
  681. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_paths.py +0 -0
  682. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_perf_gate.py +0 -0
  683. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_pkg_confusions.py +0 -0
  684. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_pkg_injection.py +0 -0
  685. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_pkg_secrets.py +0 -0
  686. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_platform_pins.py +0 -0
  687. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_policy.py +0 -0
  688. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_post_deploy_smoke.py +0 -0
  689. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_project_mcp_sidecar.py +0 -0
  690. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_projectlock.py +0 -0
  691. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_provenance.py +0 -0
  692. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_publish_golden_dataset.py +0 -0
  693. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_rag.py +0 -0
  694. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_rag_fastpath.py +0 -0
  695. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_rag_fusion.py +0 -0
  696. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_registries_fresh.py +0 -0
  697. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_registry.py +0 -0
  698. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_registry_categories.py +0 -0
  699. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_registry_control_chars.py +0 -0
  700. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_release_guard.py +0 -0
  701. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_release_preflight.py +0 -0
  702. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_required_checks.py +0 -0
  703. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_rerank_cache.py +0 -0
  704. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_resolve.py +0 -0
  705. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_roadmap_fresh.py +0 -0
  706. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_rules.py +0 -0
  707. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_scale_corpus.py +0 -0
  708. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_scopes.py +0 -0
  709. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_secretscan.py +0 -0
  710. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_selfupdate.py +0 -0
  711. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_serve.py +0 -0
  712. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_serve_docs.py +0 -0
  713. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_shards_matrix.py +0 -0
  714. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_smoke_covers_every_command.py +0 -0
  715. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_spin.py +0 -0
  716. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_stackprobe.py +0 -0
  717. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_staleness.py +0 -0
  718. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_store.py +0 -0
  719. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_store_materialize.py +0 -0
  720. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_sync_blocked_links.py +0 -0
  721. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  722. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_token_parity.py +0 -0
  723. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_toolchain_lock.py +0 -0
  724. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_trustaudit.py +0 -0
  725. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_typosquat.py +0 -0
  726. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_updatediff.py +0 -0
  727. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_util.py +0 -0
  728. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_version.py +0 -0
  729. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_visual_harness_flags.py +0 -0
  730. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_workflow_concurrency.py +0 -0
  731. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  732. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  733. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_workflow_timeouts.py +0 -0
  734. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_workflows.py +0 -0
  735. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  736. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/visual/a11y_check.mjs +0 -0
  737. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/visual/console_check.mjs +0 -0
  738. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/visual/package-lock.json +0 -0
  739. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/visual/package.json +0 -0
  740. {boost_skill_cli-1.2.16 → boost_skill_cli-1.2.17}/tests/visual/visual_check.mjs +0 -0
@@ -45,6 +45,7 @@ jonnyeclectic's
45
45
  Kotlin
46
46
  langchain
47
47
  Langfuse
48
+ lookups
48
49
  lowercasing
49
50
  Magento
50
51
  mcp
@@ -350,8 +350,47 @@ reports `hybrid RRF`; it degrades to whichever single engine is ready, and to
350
350
  BM25 alone otherwise. `dense.status()` names which of the three links (extra,
351
351
  backend, built store) is missing, and `dense.fix_hint()` maps that to the one
352
352
  next action — both `boost doctor` and `boost search` read that same table, so
353
- they can't give contradictory advice. `core/ai.py` wraps the
354
- opt-in LLM-assisted paths (`search --smart`, `explain`, `distill`, `infer`,
353
+ they can't give contradictory advice.
354
+
355
+ **The dense store ranks twice, and `vec0` is why.** `sqlite-vec` has no ANN
356
+ index: a float32 `MATCH` scores *every* vector in the store, which on a real
357
+ 750,416-chunk / 1024-d install is 3.08 GB and **28.2 s per query** — it was ~85%
358
+ of a 33.9 s `boost search`. So a query runs a coarse pass over
359
+ `vec_chunks_bin` (binary-quantized, one bit per dimension — 114 MB, Hamming) and
360
+ re-ranks the top `RESCORE_POOL` (2048) on their exact float32 vectors from
361
+ `vec_raw`. Measured: **28.2 s → 1.05 s at recall@60 = 1.000** — the same rows in
362
+ the same order. Both stages are required: the binary pass alone recovers 0.667
363
+ of the true top 60, so deleting the rescore as an "optimization" is a quality
364
+ regression, and `tests/unit/test_dense_quantized.py` fails if it goes.
365
+ `vec_raw` is an ordinary rowid-keyed table on purpose — `id IN (...)` against a
366
+ vec0 table plans as a full scan (256 point lookups measured 3.2 s), so the
367
+ rescore would cost more than the thing it replaced.
368
+
369
+ Consequences for code you write here:
370
+
371
+ - **`dim` must be a multiple of 8** for `bit[N]`, so `_quantizable()` gates the
372
+ layout and a non-conforming width keeps the old float32 `vec_chunks`. The
373
+ toy 3-d fixtures elsewhere in the suite are what keep that fallback covered;
374
+ `tests/unit/test_dense_quantized.py` uses 8-d.
375
+ - **`dense.quantize()` migrates in place and re-embeds nothing** — it re-encodes
376
+ vectors already on disk. It counts rows into `vec_raw` and refuses to drop
377
+ `vec_chunks` unless the copy is complete, because re-embedding 750k chunks is
378
+ a bill, not an inconvenience. `boost reindex --dense` runs it; `boost doctor`
379
+ names a ready-but-unquantized store. **It costs disk**: a plain table pays
380
+ overflow-page overhead on 4 KB blobs that vec0's packed storage does not, so
381
+ the measured trade is **3.40 GB → 3.87 GB (+14%), in 1360 s**, peaking at
382
+ ~2× while both copies coexist. Don't describe it as size-neutral — an earlier
383
+ draft of this section did, from prediction rather than measurement.
384
+ - **Nothing on the search path may count `chunks`.** `SELECT COUNT(*)` scans the
385
+ `chunks_tap` covering index — 8,419 pages / 34.5 MB, measured 1.94 s — and
386
+ both `ready()` and `status()` did it on every search, the latter only to word
387
+ one muted hint. The total now comes from `meta["chunks"]`, emptiness from a
388
+ `LIMIT 1` probe, and the scan only when `status(count=True)` asks. A store
389
+ that never recorded a total reports `chunks: None`, **not 0**: `fix_hint`
390
+ reads a zero as an unfinished install and would send that user to the one
391
+ remedy that re-embeds everything.
392
+
393
+ `core/ai.py` wraps the opt-in LLM-assisted paths (`search --smart`, `explain`, `distill`, `infer`,
355
394
  `absorb`, `evolve`, `simulate`, …), shelling out to the `claude` CLI or
356
395
  `ANTHROPIC_API_KEY` when available and degrading to heuristics when not.
357
396
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.16
3
+ Version: 1.2.17
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -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.2.16'
22
- __version_tuple__ = version_tuple = (1, 2, 16)
21
+ __version__ = version = '1.2.17'
22
+ __version_tuple__ = version_tuple = (1, 2, 17)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -316,6 +316,10 @@ def cmd_reindex(argv):
316
316
  else:
317
317
  out.ok("embedded %d passages (%s) into the dense vector store"
318
318
  % (dense_stats["chunks"], dense_stats["provider"]))
319
+ if dense_stats.get("quantized"):
320
+ out.ok("quantized %d existing vectors — dense search no longer "
321
+ "scans the whole store on every query"
322
+ % dense_stats["quantized"])
319
323
  journal.log("reindex", "%d passages" % stats["docs"],
320
324
  entries=stats["entries"])
321
325
  return 0
@@ -328,7 +332,16 @@ def _reindex_dense(force):
328
332
  from ..core import dense, embed
329
333
  if not dense.have_backend() or not embed.available():
330
334
  return None
331
- return dense.build(force=force)
335
+ # Convert a pre-quantization store first, so a user who reindexes gets the
336
+ # speedup without having to know the word "quantize". It re-encodes vectors
337
+ # already on disk — no provider call, no cost — and `build` below then adds
338
+ # only what changed. Doing it after would quantize, then write float32 rows
339
+ # into a store that no longer has a float32 table.
340
+ migrated = dense.quantize()
341
+ stats = dense.build(force=force)
342
+ if migrated and isinstance(stats, dict):
343
+ stats = stats | {"quantized": migrated["chunks"]}
344
+ return stats
332
345
 
333
346
 
334
347
  def cmd_index(argv):
@@ -599,12 +599,25 @@ def _report_search_engine(bad) -> None:
599
599
  # Local import: the dense/embedding engines are opt-in and stay out of
600
600
  # startup for every other command (scripts/import_budget.py enforces it).
601
601
  from ..core import dense
602
- st = dense.status()
602
+ # count=True: doctor prints the chunk total, and a health check is the one
603
+ # caller that can afford the scan when a legacy store never recorded it.
604
+ # `boost search`'s hint deliberately does not (see `dense._chunk_total`).
605
+ st = dense.status(count=True)
603
606
 
604
607
  if st["ready"]:
605
608
  out.ok("semantic search active — %s %s (%d-d), %d chunk%s across %d tap%s"
606
609
  % (st["provider"], st["model"], st["dim"] or 0,
607
610
  st["chunks"], _s(st["chunks"]), st["taps"], _s(st["taps"])))
611
+ if not st["quantized"]:
612
+ # Ready but slow, which no other line here would say. `vec0` has no
613
+ # ANN index, so an unquantized store re-scans every vector on every
614
+ # query — 28.2 s measured at 750,416 chunks. The remedy costs no
615
+ # embedding calls, so it is worth naming rather than leaving the
616
+ # user to wonder why the search they enabled feels broken.
617
+ out.warn("the vector store predates binary quantization, so every "
618
+ "query scans all %d vectors — `boost reindex --dense` "
619
+ "converts it offline (no re-embedding, no API cost)"
620
+ % st["chunks"])
608
621
  return
609
622
 
610
623
  fix = dense.fix_hint(st["reason"], st)
@@ -62,15 +62,105 @@ def _connect() -> sqlite3.Connection | None:
62
62
  return con
63
63
 
64
64
 
65
+ # How many binary candidates the exact rescore re-ranks. `vec0` has no ANN
66
+ # index — a `MATCH` is a full scan — so this is the only knob that decides how
67
+ # much of the store a query touches.
68
+ #
69
+ # Measured on a real 750,416-chunk / 1024-d store: 2048 gives recall@60 of
70
+ # 1.000 against a full float32 scan, for 0.35 s of rescore. 4096 costs 0.57 s
71
+ # and returns the same 60 rows, so the extra candidates are pure overhead.
72
+ RESCORE_POOL = 2048
73
+
74
+
75
+ def _quantizable(dim: int) -> bool:
76
+ """Whether ``dim`` can be binary-quantized at all.
77
+
78
+ `bit[N]` packs eight dimensions per byte, so sqlite-vec rejects any N that
79
+ is not a multiple of 8. Every real embedding width is (384, 768, 1024,
80
+ 1536); the toy 3-d vectors in the unit suite are not, which is what keeps
81
+ the float32 path exercised rather than dead.
82
+ """
83
+ return bool(dim) and dim % 8 == 0
84
+
85
+
86
+ def _has_table(con: sqlite3.Connection, name: str) -> bool:
87
+ try:
88
+ return con.execute("SELECT 1 FROM sqlite_master WHERE name = ? LIMIT 1",
89
+ (name,)).fetchone() is not None
90
+ except sqlite3.DatabaseError:
91
+ return False
92
+
93
+
94
+ def quantized(con: sqlite3.Connection) -> bool:
95
+ """True when this store holds the two-stage (binary + exact) layout.
96
+
97
+ Both halves are required and neither is useful alone: `vec_chunks_bin`
98
+ ranks, `vec_raw` re-ranks. A store carrying only one is a half-finished
99
+ migration, and answering True for it would route queries into a rescore
100
+ with nothing to rescore against.
101
+ """
102
+ return _has_table(con, "vec_chunks_bin") and _has_table(con, "vec_raw")
103
+
104
+
65
105
  def _ensure_schema(con: sqlite3.Connection, dim: int) -> None:
66
106
  con.execute(
67
107
  "CREATE TABLE IF NOT EXISTS chunks (id INTEGER PRIMARY KEY AUTOINCREMENT,"
68
108
  " name TEXT, tap TEXT, path TEXT, kind TEXT, cix INTEGER, snip TEXT)")
69
109
  con.execute("CREATE INDEX IF NOT EXISTS chunks_tap ON chunks(tap)")
70
110
  con.execute("CREATE TABLE IF NOT EXISTS meta (k TEXT PRIMARY KEY, v TEXT)")
71
- con.execute(
72
- "CREATE VIRTUAL TABLE IF NOT EXISTS vec_chunks USING "
73
- "vec0(embedding float[%d] distance_metric=cosine)" % dim)
111
+ if _quantizable(dim):
112
+ # Two relations, because one cannot do both jobs. `vec0` is the only
113
+ # thing that can run a KNN, and it cannot fetch a row by rowid: an
114
+ # `id IN (...)` against it plans as `SCAN ... VIRTUAL TABLE`, and 256
115
+ # single-row lookups measured 3.2 s. A plain rowid-keyed table is the
116
+ # opposite — useless for KNN, O(log n) per row — so the coarse pass
117
+ # lives in `vec_chunks_bin` and the exact rescore reads `vec_raw`.
118
+ con.execute("CREATE VIRTUAL TABLE IF NOT EXISTS vec_chunks_bin USING "
119
+ "vec0(embedding bit[%d])" % dim)
120
+ con.execute("CREATE TABLE IF NOT EXISTS vec_raw "
121
+ "(id INTEGER PRIMARY KEY, embedding BLOB)")
122
+ else:
123
+ con.execute(
124
+ "CREATE VIRTUAL TABLE IF NOT EXISTS vec_chunks USING "
125
+ "vec0(embedding float[%d] distance_metric=cosine)" % dim)
126
+
127
+
128
+ def _store_vector(con: sqlite3.Connection, rowid: int | None,
129
+ blob: bytes) -> None:
130
+ """Write one chunk's vector into whichever layout this store uses.
131
+
132
+ Quantization happens in SQL rather than in Python: `vec_quantize_binary`
133
+ is the same function the query side calls on the query vector, so the two
134
+ can never disagree about how a float becomes a bit.
135
+
136
+ ``rowid`` is a caller's ``cursor.lastrowid``, which sqlite3 types as
137
+ optional. It is None only if the INSERT that produced it did not happen, so
138
+ this refuses rather than storing a vector nothing can join back to — an
139
+ orphan in `vec_raw` outlives every tap deletion, since those are scoped
140
+ through `chunks.tap`.
141
+ """
142
+ if rowid is None:
143
+ raise BoostError("vector store insert produced no row id")
144
+ if quantized(con):
145
+ con.execute("INSERT INTO vec_chunks_bin (rowid, embedding) "
146
+ "VALUES (?, vec_quantize_binary(vec_f32(?)))", (rowid, blob))
147
+ con.execute("INSERT INTO vec_raw (id, embedding) VALUES (?, ?)",
148
+ (rowid, blob))
149
+ else:
150
+ con.execute("INSERT INTO vec_chunks (rowid, embedding) VALUES (?, ?)",
151
+ (rowid, blob))
152
+
153
+
154
+ def _drop_vectors(con: sqlite3.Connection, ids: list[int]) -> None:
155
+ """Remove these chunk ids from every vector relation the store has."""
156
+ for i in ids:
157
+ # vec0 deletes one rowid at a time; the plain table takes a set.
158
+ for tbl in ("vec_chunks", "vec_chunks_bin"):
159
+ if _has_table(con, tbl):
160
+ con.execute("DELETE FROM %s WHERE rowid = ?" % tbl, (i,)) # noqa: S608 table name from a literal tuple
161
+ if ids and _has_table(con, "vec_raw"):
162
+ con.execute("DELETE FROM vec_raw WHERE id IN (%s)" # noqa: S608 interpolates only `?` placeholders
163
+ % ",".join("?" * len(ids)), ids)
74
164
 
75
165
 
76
166
  def _read_meta(con: sqlite3.Connection) -> dict[str, object]:
@@ -95,6 +185,10 @@ def _write_meta(con: sqlite3.Connection, meta: dict[str, object]) -> None:
95
185
  def _wipe(con: sqlite3.Connection) -> None:
96
186
  con.execute("DROP TABLE IF EXISTS chunks")
97
187
  con.execute("DROP TABLE IF EXISTS vec_chunks")
188
+ # Both halves of the quantized layout, or a --force rebuild leaves the old
189
+ # vectors behind to be merged with the new ones under reused rowids.
190
+ con.execute("DROP TABLE IF EXISTS vec_chunks_bin")
191
+ con.execute("DROP TABLE IF EXISTS vec_raw")
98
192
 
99
193
 
100
194
  def _chunk_texts(entry: dict, tap_paths: dict[str, Path] | None
@@ -103,7 +197,51 @@ def _chunk_texts(entry: dict, tap_paths: dict[str, Path] | None
103
197
  return chunk(body) or [body]
104
198
 
105
199
 
106
- def _recorded_meta() -> dict:
200
+ def _chunk_total(con: sqlite3.Connection, meta: dict,
201
+ *, exact: bool) -> tuple[int | None, bool]:
202
+ """``(count-or-None, has-any-rows)`` — O(1) unless ``exact`` is asked for.
203
+
204
+ Counting `chunks` was the single most expensive thing a `boost search` did.
205
+ Every BM25-only search ends in a hint that calls :func:`status`, and
206
+ `SELECT COUNT(*) FROM chunks` scans the whole `chunks_tap` covering index:
207
+ measured on a real 445-tap store, 8,419 pages / 34.5 MB inside a 3.4 GB
208
+ file, 1.94 s with those pages already warm and the dominant term in a
209
+ 33.9 s cold search — about 79% of a warm one, to choose the wording of a
210
+ single muted line.
211
+
212
+ The hot path never actually needed the number. It needs to know whether the
213
+ store has *any* rows, which is one indexed probe, and one `fix_hint` branch
214
+ wants the total, which a store built after this change records in `meta` —
215
+ 9 pages, read anyway.
216
+
217
+ Three sources, cheapest first:
218
+
219
+ * ``meta["chunks"]``, stamped by :func:`build` and :func:`import_shard`;
220
+ * a ``LIMIT 1`` existence probe, which answers the `empty` reason exactly
221
+ and leaves the total unknown;
222
+ * the full scan, only when a caller says it can afford one (`boost doctor`).
223
+
224
+ Returning ``None`` for "not recorded" rather than ``0`` is the load-bearing
225
+ part: a legacy store has vectors the user paid to embed, and reporting zero
226
+ would route it to advice that re-embeds all of them.
227
+ """
228
+ recorded = meta.get("chunks")
229
+ if isinstance(recorded, int) and not isinstance(recorded, bool) and recorded >= 0:
230
+ return recorded, recorded > 0
231
+ try:
232
+ if exact:
233
+ n = int(con.execute("SELECT COUNT(*) FROM chunks").fetchone()[0])
234
+ return n, n > 0
235
+ # Stops at the first row: a b-tree descent, not a walk.
236
+ row = con.execute("SELECT 1 FROM chunks LIMIT 1").fetchone()
237
+ except sqlite3.DatabaseError:
238
+ # No `chunks` table at all — nothing built, which is the ordinary
239
+ # empty case rather than the corrupt one. Exact by definition.
240
+ return 0, False
241
+ return None, row is not None
242
+
243
+
244
+ def _recorded_meta(*, count: bool = False) -> dict:
107
245
  """What an existing store says it was built with, read WITHOUT sqlite-vec.
108
246
 
109
247
  Deliberately not routed through :func:`_connect`, which loads the extension
@@ -121,11 +259,8 @@ def _recorded_meta() -> dict:
121
259
  return {}
122
260
  try:
123
261
  meta = _read_meta(con)
124
- try:
125
- meta["_chunks"] = con.execute(
126
- "SELECT COUNT(*) FROM chunks").fetchone()[0]
127
- except sqlite3.DatabaseError:
128
- meta["_chunks"] = 0
262
+ meta["_chunks"], meta["_nonempty"] = _chunk_total(con, meta, exact=count)
263
+ meta["_quantized"] = quantized(con)
129
264
  return meta
130
265
  except sqlite3.DatabaseError:
131
266
  # A truncated or non-sqlite file: report "no store", never raise into
@@ -186,17 +321,33 @@ def fix_hint(reason: str, status: dict | None = None) -> str:
186
321
  # there is nothing a key would revive, and "build it" is the real next
187
322
  # step. A store built by the local model has no env var and correctly
188
323
  # falls through — that user does need the package back.
189
- if env and status.get("chunks"):
324
+ count = status.get("chunks")
325
+ # `None` is "a store is here and never recorded its total" — a legacy
326
+ # store, not an unfinished one. Only a *known* zero means there are no
327
+ # vectors to revive; reading unknown as zero would send exactly the
328
+ # user this branch exists to protect to the re-embed-everything answer.
329
+ if env and (count is None or count > 0):
330
+ n = f"{int(count):,} vectors" if count else "vectors"
190
331
  return ("set the key it was built with: `export %s=...` — "
191
332
  "reinstalling the extra swaps in the local model and "
192
- "forces all %s vectors to be re-embedded"
193
- % (env, "{:,}".format(int(status["chunks"]))))
333
+ "forces all %s to be re-embedded" % (env, n))
194
334
  return _FIX.get(reason, "see `boost reindex --dense`")
195
335
 
196
336
 
197
- def status() -> dict:
337
+ def status(*, count: bool = False) -> dict:
198
338
  """Why dense retrieval is, or is not, serving queries.
199
339
 
340
+ ``count`` buys an exact ``chunks`` total at the price of scanning the store
341
+ (see :func:`_chunk_total`). It is off by default because the caller that
342
+ runs on every single search — `boost search`'s one-line hint — does not use
343
+ the number, while paying for it made that scan ~79% of a warm search and
344
+ the bulk of a cold one. `boost doctor` prints the total, so it asks.
345
+
346
+ With ``count=True`` the total is always an int. Without it, ``chunks`` is
347
+ ``None`` whenever a pre-existing store never recorded its own total;
348
+ ``chunks_exact`` says which you got, and ``reason`` is still exact either
349
+ way — emptiness comes from a cheap probe, not from the count.
350
+
200
351
  Pure inspection — never builds, never embeds, never needs the extra. Three
201
352
  independent things must line up (the ``[rag]`` extra, an embeddings key, a
202
353
  built store whose space matches the live one) and every one of them fails
@@ -210,13 +361,17 @@ def status() -> dict:
210
361
  """
211
362
  have_be = have_backend()
212
363
  prov, mdl, dim = embed.provider(), embed.model(), embed.dimension()
213
- meta = _recorded_meta()
364
+ meta = _recorded_meta(count=count)
214
365
  b_prov = meta.get("provider")
215
366
  b_mdl = meta.get("model")
216
367
  b_dim = meta.get("dim")
217
368
  b_ver = meta.get("version")
218
369
  commits = meta.get("commits")
219
- chunks = int(meta.get("_chunks") or 0)
370
+ raw_chunks = meta.get("_chunks")
371
+ chunks = int(raw_chunks) if isinstance(raw_chunks, int) else None
372
+ # Emptiness is answered by the probe, never by the count — that is what
373
+ # lets the count stay unknown without any reason becoming a guess.
374
+ nonempty = bool(meta.get("_nonempty"))
220
375
  store_exists = bool(meta)
221
376
 
222
377
  # Order matters: report the *first* missing link, so the message names the
@@ -235,7 +390,7 @@ def status() -> dict:
235
390
  reason = "model-changed"
236
391
  elif b_dim != dim:
237
392
  reason = "dim-changed"
238
- elif chunks <= 0:
393
+ elif not nonempty:
239
394
  reason = "empty"
240
395
  else:
241
396
  reason = None
@@ -255,6 +410,11 @@ def status() -> dict:
255
410
  "built_provider": b_prov, "built_model": b_mdl,
256
411
  "built_dim": b_dim, "built_version": b_ver,
257
412
  "chunks": chunks,
413
+ "chunks_exact": chunks is not None,
414
+ # Ready-but-unquantized is a real state and the only one that is fast
415
+ # to fix and expensive to leave: correct answers, at a full scan per
416
+ # query. Nothing else in this dict distinguishes it.
417
+ "quantized": bool(meta.get("_quantized")),
258
418
  "taps": len(commits) if isinstance(commits, dict) else 0,
259
419
  "ready": reason is None,
260
420
  "reason": reason,
@@ -291,11 +451,11 @@ def ready() -> bool:
291
451
  return False
292
452
  if meta.get("dim") != embed.dimension():
293
453
  return False
294
- try:
295
- rows = con.execute("SELECT COUNT(*) FROM chunks").fetchone()[0]
296
- except sqlite3.OperationalError:
297
- return False
298
- return rows > 0
454
+ # Existence, not a total: this runs on every search that has a store to
455
+ # consult, and counting `chunks` walks its whole covering index — 34.5
456
+ # MB on a real 445-tap store — to answer a yes/no question. `LIMIT 1`
457
+ # stops at the first row. See `_chunk_total` for the measurements.
458
+ return _chunk_total(con, meta, exact=False)[1]
299
459
  finally:
300
460
  con.close()
301
461
 
@@ -363,10 +523,14 @@ def build(entries: list[dict] | None = None,
363
523
  failed_safe = {t.replace("/", "__") for t in failed_taps}
364
524
  recorded = {safe: c for safe, c in commits.items()
365
525
  if safe not in failed_safe}
526
+ # Counted before the meta write, not after, so the total can be stamped
527
+ # into `meta` — that is what lets every later `status()` skip the scan
528
+ # (see `_chunk_total`). The build already paid for this count.
529
+ total = con.execute("SELECT COUNT(*) FROM chunks").fetchone()[0]
366
530
  _write_meta(con, {"version": INDEX_VERSION, "provider": prov,
367
- "model": mdl, "dim": dim, "commits": recorded})
531
+ "model": mdl, "dim": dim, "commits": recorded,
532
+ "chunks": total})
368
533
  con.commit()
369
- total = con.execute("SELECT COUNT(*) FROM chunks").fetchone()[0]
370
534
  return {
371
535
  "entries": len({entry_key(e) for e in entries}),
372
536
  "chunks": total,
@@ -428,10 +592,15 @@ def export_shard(tap: str) -> dict:
428
592
  expected = _tap_chunk_count(con, tap)
429
593
  chunks = []
430
594
  try:
595
+ # `vec_raw` on a quantized store is an ordinary table, so this
596
+ # join needs no extension at all — which is the failure this
597
+ # function's docstring describes, gone rather than worked around.
598
+ vt = "vec_raw v ON v.id = c.id" if quantized(con) \
599
+ else "vec_chunks v ON v.rowid = c.id"
431
600
  rows = con.execute(
432
- "SELECT c.name, c.tap, c.path, c.kind, c.cix, c.snip, v.embedding "
433
- "FROM chunks c JOIN vec_chunks v ON v.rowid = c.id "
434
- "WHERE c.tap = ? ORDER BY c.id", (tap,)).fetchall()
601
+ "SELECT c.name, c.tap, c.path, c.kind, c.cix, c.snip, v.embedding " # noqa: S608 relation name from a literal pair
602
+ "FROM chunks c JOIN %s WHERE c.tap = ? ORDER BY c.id" % vt,
603
+ (tap,)).fetchall()
435
604
  except sqlite3.Error as exc:
436
605
  # Only a tap that HAS chunks can have unreadable ones. With none,
437
606
  # the vector relation not resolving says nothing about this tap —
@@ -534,15 +703,18 @@ def import_shard(shard: dict, commit: str) -> tuple[bool, str]:
534
703
  (c.get("name"), c.get("tap"), c.get("path"), c.get("kind"),
535
704
  c.get("cix"), c.get("snip")))
536
705
  blob = base64.b64decode(c["embedding"])
537
- con.execute("INSERT INTO vec_chunks (rowid, embedding) VALUES (?, ?)",
538
- (cur.lastrowid, blob))
706
+ _store_vector(con, cur.lastrowid, blob)
539
707
  commits = meta.get("commits")
540
708
  commits = dict(commits) if isinstance(commits, dict) else {}
541
709
  commits[str(shard.get("tap") or "").replace("/", "__")] = commit
542
710
  _write_meta(con, {"version": INDEX_VERSION,
543
711
  "provider": shard.get("provider"),
544
712
  "model": shard.get("model"), "dim": dim,
545
- "commits": commits})
713
+ "commits": commits,
714
+ # Keep the recorded total true after a merge, or the
715
+ # next `status()` serves a stale number forever.
716
+ "chunks": con.execute(
717
+ "SELECT COUNT(*) FROM chunks").fetchone()[0]})
546
718
  con.commit()
547
719
  _ = mod # extension loaded by _connect; kept for symmetry
548
720
  return True, "imported %d chunks" % len(shard.get("chunks") or [])
@@ -564,8 +736,7 @@ def _delete_taps(con: sqlite3.Connection, taps: list[str]) -> None:
564
736
  for tap in taps:
565
737
  ids = [r[0] for r in
566
738
  con.execute("SELECT id FROM chunks WHERE tap = ?", (tap,))]
567
- for i in ids:
568
- con.execute("DELETE FROM vec_chunks WHERE rowid = ?", (i,))
739
+ _drop_vectors(con, ids)
569
740
  con.execute("DELETE FROM chunks WHERE tap = ?", (tap,))
570
741
 
571
742
 
@@ -626,12 +797,121 @@ def _embed_and_store(con: sqlite3.Connection, entries: list[dict],
626
797
  "VALUES (?, ?, ?, ?, ?, ?)",
627
798
  (e["name"], e["tap"], e["skill_md"],
628
799
  e.get("kind", "skill"), ci, text[:200].strip()))
629
- con.execute("INSERT INTO vec_chunks (rowid, embedding) VALUES (?, ?)",
630
- (cur.lastrowid, mod.serialize_float32(vec)))
800
+ _store_vector(con, cur.lastrowid, mod.serialize_float32(vec))
631
801
  added += 1
632
802
  return added, failed_taps
633
803
 
634
804
 
805
+ def quantize() -> dict | None:
806
+ """Convert an existing float32 store to the two-stage layout, in place.
807
+
808
+ Offline and free: it re-reads vectors the user already paid to embed and
809
+ re-encodes them locally. No provider is called, no text is re-chunked, and
810
+ nothing is lost — `vec_raw` receives the *same* float32 blobs `vec_chunks`
811
+ held, so dropping `vec_chunks` relocates the data rather than discarding it.
812
+
813
+ It costs disk, in two ways worth stating plainly. While it runs the copy
814
+ sits beside the original, so the file grows to roughly twice the store
815
+ before the ``DROP`` and ``VACUUM``. And it does not come all the way back:
816
+ an ordinary table pays overflow-page overhead on 4 KB blobs that vec0's
817
+ packed storage does not, so `vec_raw` lands ~12% larger than the
818
+ `vec_chunks` it replaces, and the binary index adds its own 114 MB.
819
+ Measured end to end on a real 750,416-chunk store: **3.40 GB -> 3.87 GB**,
820
+ a 14% permanent increase, in 1360 s. That is the price of the 19-27x query
821
+ speedup, and it is a trade rather than a free win.
822
+
823
+ Returns None when there is nothing to do (no store, no backend, a
824
+ non-quantizable width, or a store already converted).
825
+ """
826
+ if not db_path().exists():
827
+ return None
828
+ con = _connect()
829
+ if con is None:
830
+ return None
831
+ try:
832
+ meta = _read_meta(con)
833
+ dim = meta.get("dim")
834
+ if not isinstance(dim, int) or not _quantizable(dim):
835
+ return None
836
+ if quantized(con) or not _has_table(con, "vec_chunks"):
837
+ return None
838
+ before = _chunk_total(con, {}, exact=True)[0] or 0
839
+ _ensure_schema(con, dim)
840
+ con.execute("INSERT INTO vec_raw (id, embedding) "
841
+ "SELECT rowid, embedding FROM vec_chunks")
842
+ con.execute("INSERT INTO vec_chunks_bin (rowid, embedding) "
843
+ "SELECT rowid, vec_quantize_binary(vec_f32(embedding)) "
844
+ "FROM vec_chunks")
845
+ moved = con.execute("SELECT COUNT(*) FROM vec_raw").fetchone()[0]
846
+ # Verify before destroying. A short copy means the drop below would be
847
+ # the one step in this function that loses vectors, and re-embedding
848
+ # 750,416 chunks is a bill, not an inconvenience.
849
+ if moved != before:
850
+ con.rollback()
851
+ raise BoostError(
852
+ "quantize copied %d of %d vectors — store left unchanged"
853
+ % (moved, before),
854
+ hint="rebuild instead: `boost reindex --dense --force`")
855
+ con.execute("DROP TABLE IF EXISTS vec_chunks")
856
+ _write_meta(con, {"chunks": before})
857
+ con.commit()
858
+ finally:
859
+ con.close()
860
+ # Outside the transaction: VACUUM cannot run inside one, and without it the
861
+ # freed float32 pages stay allocated to the file.
862
+ con2 = _connect()
863
+ if con2 is not None:
864
+ try:
865
+ con2.execute("VACUUM")
866
+ except sqlite3.DatabaseError:
867
+ pass # a bigger file is a cosmetic loss, not a failure
868
+ finally:
869
+ con2.close()
870
+ return {"chunks": before, "bytes": db_path().stat().st_size}
871
+
872
+
873
+ def _knn(con: sqlite3.Connection, qblob: bytes,
874
+ pool: int) -> list[tuple[int, float]]:
875
+ """``(chunk_id, cosine_distance)`` for the ``pool`` nearest chunks.
876
+
877
+ Two-stage on a quantized store, one stage on a legacy one, and the answer
878
+ is the same either way — which is the whole point. `vec0` has no ANN index,
879
+ so a float32 `MATCH` computes a distance against every vector in the store:
880
+ on a real 750,416-chunk / 1024-d install that is 3.08 GB read and 28.2 s of
881
+ arithmetic **per query**, and it was ~85% of a 33.9 s `boost search`.
882
+
883
+ Binary quantization makes the same comparison 32x smaller — one bit per
884
+ dimension, 128 bytes instead of 4096, 114 MB instead of 3.08 GB — and
885
+ Hamming distance over it is a popcount. That pass alone takes 0.70 s, but
886
+ it is an *approximation*: measured against a full float32 scan it recovers
887
+ only 0.667 of the true top 60, which is a quality regression no amount of
888
+ speed pays for.
889
+
890
+ So it is a filter, not an answer. The 2048 nearest binary candidates are
891
+ re-ranked on their exact float32 vectors, which restores the true ordering
892
+ — measured recall@60 of **1.000**, the same rows in the same order — for
893
+ 0.35 s more. Together: 28.2 s -> 1.05 s, 27x, with identical results.
894
+ """
895
+ if quantized(con):
896
+ cand = [r[0] for r in con.execute(
897
+ "SELECT rowid FROM vec_chunks_bin "
898
+ "WHERE embedding MATCH vec_quantize_binary(vec_f32(?)) "
899
+ "ORDER BY distance LIMIT ?", (qblob, max(pool, RESCORE_POOL)))]
900
+ if not cand:
901
+ return []
902
+ # Exact cosine over the candidates only. `vec_raw` is an ordinary
903
+ # rowid-keyed table precisely so this `IN` is an index lookup; the same
904
+ # clause against a vec0 table plans as a full scan (see _ensure_schema).
905
+ return con.execute(
906
+ "SELECT id, vec_distance_cosine(embedding, ?) AS d FROM vec_raw " # noqa: S608 interpolates only `?` placeholders
907
+ "WHERE id IN (%s) ORDER BY d LIMIT ?"
908
+ % ",".join("?" * len(cand)), (qblob, *cand, pool)).fetchall()
909
+ return con.execute(
910
+ "SELECT rowid, distance FROM vec_chunks "
911
+ "WHERE embedding MATCH ? ORDER BY distance LIMIT ?",
912
+ (qblob, pool)).fetchall()
913
+
914
+
635
915
  def retrieve(query: str, k: int = 60, kind: str | None = None,
636
916
  entries: list[dict] | None = None) -> list[Hit] | None:
637
917
  """Top-k dense hits for ``query``, or None to signal 'fall back to BM25'."""
@@ -647,10 +927,7 @@ def retrieve(query: str, k: int = 60, kind: str | None = None,
647
927
  try:
648
928
  pool = max(k * _POOL, 200)
649
929
  try:
650
- knn = con.execute(
651
- "SELECT rowid, distance FROM vec_chunks "
652
- "WHERE embedding MATCH ? ORDER BY distance LIMIT ?",
653
- (mod.serialize_float32(qv[0]), pool)).fetchall()
930
+ knn = _knn(con, mod.serialize_float32(qv[0]), pool)
654
931
  except sqlite3.OperationalError:
655
932
  # Some sqlite3/sqlite-vec combinations (observed on Windows)
656
933
  # reject this exact query shape ("a LIMIT or 'k = ?' constraint
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.16
3
+ Version: 1.2.17
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -229,6 +229,7 @@ docs/roadmap/items/demo-cannot-open-its-own-pr.md
229
229
  docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md
230
230
  docs/roadmap/items/demo-workflow-cancels-other-prs.md
231
231
  docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md
232
+ docs/roadmap/items/dense-search-rescans-every-vector.md
232
233
  docs/roadmap/items/dependabot-missing-pip-ecosystem.md
233
234
  docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md
234
235
  docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md
@@ -617,11 +618,13 @@ tests/unit/test_dense.py
617
618
  tests/unit/test_dense_embed_dedupe.py
618
619
  tests/unit/test_dense_fallback.py
619
620
  tests/unit/test_dense_fix_hint.py
621
+ tests/unit/test_dense_quantized.py
620
622
  tests/unit/test_dense_ready_order.py
621
623
  tests/unit/test_dense_shard_real_schema.py
622
624
  tests/unit/test_dense_shard_unreadable_vectors.py
623
625
  tests/unit/test_dense_shards.py
624
626
  tests/unit/test_dense_status.py
627
+ tests/unit/test_dense_status_cheap.py
625
628
  tests/unit/test_dependabot_config.py
626
629
  tests/unit/test_docs_pages_linked.py
627
630
  tests/unit/test_docsite_chrome.py