boost-skill-cli 1.0.290__tar.gz → 1.0.291__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 (541) hide show
  1. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/commands/discovery.py +31 -5
  4. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/dense.py +34 -6
  5. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/embed.py +4 -1
  6. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/rag.py +8 -4
  7. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  8. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/functional/test_cli_discovery.py +51 -0
  9. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_dense.py +21 -0
  10. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_dense_fallback.py +59 -1
  11. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_embed.py +13 -0
  12. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/.gitattributes +0 -0
  13. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/.gitignore +0 -0
  14. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/.gitleaks.toml +0 -0
  15. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/.htmlvalidate.json +0 -0
  16. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/.lighthouserc.json +0 -0
  17. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/.lycheeignore +0 -0
  18. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/.markdownlint-cli2.jsonc +0 -0
  19. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/.pre-commit-config.yaml +0 -0
  20. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/.stylelintrc.json +0 -0
  21. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/.vale/styles/boost/Terminology.yml +0 -0
  22. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  23. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/.vale.ini +0 -0
  24. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/CLAUDE.md +0 -0
  25. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/CODE_OF_CONDUCT.md +0 -0
  26. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/CONTRIBUTING.md +0 -0
  27. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/LICENSE +0 -0
  28. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/MANIFEST.in +0 -0
  29. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/Makefile +0 -0
  30. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/README.md +0 -0
  31. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/SECURITY.md +0 -0
  32. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost +0 -0
  33. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/__init__.py +0 -0
  34. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/__main__.py +0 -0
  35. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/cli.py +0 -0
  36. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/cliparse.py +0 -0
  37. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/commands/__init__.py +0 -0
  38. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/commands/_common.py +0 -0
  39. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/commands/bmad.py +0 -0
  40. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/commands/configuration.py +0 -0
  41. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/commands/hooks.py +0 -0
  42. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/commands/info.py +0 -0
  43. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/commands/intelligence.py +0 -0
  44. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/commands/pkg.py +0 -0
  45. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/commands/quality.py +0 -0
  46. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/commands/run.py +0 -0
  47. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/commands/safety.py +0 -0
  48. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/commands/taps.py +0 -0
  49. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/commands/team.py +0 -0
  50. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/__init__.py +0 -0
  51. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/adapters.py +0 -0
  52. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/agents.py +0 -0
  53. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/ai.py +0 -0
  54. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/capabilities.py +0 -0
  55. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/catalog.py +0 -0
  56. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/claude_settings.py +0 -0
  57. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/config.py +0 -0
  58. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/ed25519.py +0 -0
  59. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/faithfulness.py +0 -0
  60. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/frontmatter.py +0 -0
  61. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/gitutil.py +0 -0
  62. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/imperative.py +0 -0
  63. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/injectscan.py +0 -0
  64. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/installscan.py +0 -0
  65. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/integrity.py +0 -0
  66. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/journal.py +0 -0
  67. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/lockfile.py +0 -0
  68. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/logs.py +0 -0
  69. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/mcp.py +0 -0
  70. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/mcpdecl.py +0 -0
  71. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/minisign.py +0 -0
  72. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/nethttp.py +0 -0
  73. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/output.py +0 -0
  74. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/paths.py +0 -0
  75. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/policy.py +0 -0
  76. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/projectlock.py +0 -0
  77. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/provenance.py +0 -0
  78. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/registry.py +0 -0
  79. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/resolve.py +0 -0
  80. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/rules.py +0 -0
  81. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/scopes.py +0 -0
  82. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/secretscan.py +0 -0
  83. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/selfupdate.py +0 -0
  84. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/serve.py +0 -0
  85. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/stackprobe.py +0 -0
  86. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/staleness.py +0 -0
  87. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/store.py +0 -0
  88. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/trustaudit.py +0 -0
  89. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/typosquat.py +0 -0
  90. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/updatediff.py +0 -0
  91. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/util.py +0 -0
  92. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/core/workflows.py +0 -0
  93. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/data/registries.json +0 -0
  94. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/errors.py +0 -0
  95. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_cli/spin.py +0 -0
  96. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_skill_cli.egg-info/SOURCES.txt +0 -0
  97. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  98. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  99. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_skill_cli.egg-info/requires.txt +0 -0
  100. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/boost_skill_cli.egg-info/top_level.txt +0 -0
  101. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/codecov.yml +0 -0
  102. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/.claude/settings.local.json +0 -0
  103. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/DEBUGGING.md +0 -0
  104. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/adapters.html +0 -0
  105. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/carousel/gifs/distill.gif +0 -0
  106. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/carousel/gifs/doctor.gif +0 -0
  107. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/carousel/gifs/explain.gif +0 -0
  108. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/carousel/gifs/hooks.gif +0 -0
  109. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/carousel/gifs/install.gif +0 -0
  110. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/carousel/gifs/pulse.gif +0 -0
  111. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/carousel/gifs/search.gif +0 -0
  112. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/carousel/gifs/tap.gif +0 -0
  113. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/carousel/tapes/distill.tape +0 -0
  114. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/carousel/tapes/doctor.tape +0 -0
  115. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/carousel/tapes/explain.tape +0 -0
  116. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/carousel/tapes/hooks.tape +0 -0
  117. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/carousel/tapes/install.tape +0 -0
  118. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/carousel/tapes/pulse.tape +0 -0
  119. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/carousel/tapes/search.tape +0 -0
  120. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/carousel/tapes/tap.tape +0 -0
  121. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/carousel.html +0 -0
  122. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/commands.html +0 -0
  123. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/demo.gif +0 -0
  124. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/demo.tape +0 -0
  125. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/design-roadmap.html +0 -0
  126. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/eval.html +0 -0
  127. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/index.html +0 -0
  128. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/mcp-hub.html +0 -0
  129. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/rag-architecture.md +0 -0
  130. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D01.md +0 -0
  131. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D02.md +0 -0
  132. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D03.md +0 -0
  133. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D04.md +0 -0
  134. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D05.md +0 -0
  135. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D06.md +0 -0
  136. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D07.md +0 -0
  137. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D08.md +0 -0
  138. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D09.md +0 -0
  139. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D10.md +0 -0
  140. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D11.md +0 -0
  141. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D12.md +0 -0
  142. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D13.md +0 -0
  143. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D14.md +0 -0
  144. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D15.md +0 -0
  145. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D16.md +0 -0
  146. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D17.md +0 -0
  147. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D18.md +0 -0
  148. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D19.md +0 -0
  149. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D20.md +0 -0
  150. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D21.md +0 -0
  151. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D22.md +0 -0
  152. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D23.md +0 -0
  153. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D24.md +0 -0
  154. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D25.md +0 -0
  155. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/BOOST-D26.md +0 -0
  156. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  157. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  158. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  159. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  160. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  161. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  162. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  163. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  164. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  165. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  166. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  167. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  168. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  169. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  170. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  171. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  172. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  173. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  174. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  175. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  176. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  177. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/command-carousel-page.md +0 -0
  178. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  179. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  180. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  181. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  182. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  183. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  184. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  185. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  186. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  187. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  188. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  189. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  190. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  191. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  192. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  193. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  194. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  195. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  196. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  197. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  198. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  199. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  200. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  201. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  202. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  203. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  204. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  205. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/github-community-health-files.md +0 -0
  206. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  207. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  208. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  209. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  210. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  211. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  212. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  213. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  214. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  215. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  216. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  217. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  218. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  219. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  220. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  221. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  222. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  223. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  224. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  225. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  226. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  227. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  228. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  229. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  230. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  231. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  232. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  233. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  234. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  235. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  236. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  237. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  238. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  239. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  240. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  241. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  242. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  243. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  244. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  245. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  246. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  247. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  248. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  249. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  250. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  251. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  252. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  253. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  254. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  255. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  256. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  257. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  258. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  259. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  260. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  261. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  262. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  263. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  264. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  265. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  266. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  267. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  268. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  269. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  270. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  271. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  272. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  273. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  274. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  275. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  276. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  277. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  278. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  279. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  280. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  281. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  282. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  283. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  284. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  285. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  286. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  287. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  288. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  289. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  290. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  291. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  292. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  293. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  294. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  295. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  296. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  297. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  298. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  299. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  300. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  301. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  302. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  303. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  304. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  305. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  306. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  307. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  308. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  309. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  310. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  311. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  312. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  313. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  314. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  315. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  316. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  317. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  318. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  319. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  320. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  321. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  322. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  323. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  324. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  325. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  326. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  327. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  328. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  329. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  330. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  331. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/workspace-scope-install.md +0 -0
  332. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  333. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/docs/roadmap.html +0 -0
  334. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/eslint.config.mjs +0 -0
  335. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/evals/README.md +0 -0
  336. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/evals/__init__.py +0 -0
  337. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/evals/baseline.json +0 -0
  338. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/evals/faithfulness.py +0 -0
  339. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/evals/golden_set.json +0 -0
  340. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/evals/make_corpus.py +0 -0
  341. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/evals/make_golden.py +0 -0
  342. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/evals/metrics.py +0 -0
  343. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/evals/run_evals.py +0 -0
  344. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/examples/README.md +0 -0
  345. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/examples/adapt-demo.sh +0 -0
  346. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/examples/boost-run-prototype.sh +0 -0
  347. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/index.html +0 -0
  348. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/noxfile.py +0 -0
  349. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/pyproject.toml +0 -0
  350. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/requirements/coverage-tools.in +0 -0
  351. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/requirements/coverage-tools.txt +0 -0
  352. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/requirements/lint-tools.in +0 -0
  353. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/requirements/lint-tools.txt +0 -0
  354. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/requirements/mutation-tools.in +0 -0
  355. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/requirements/mutation-tools.txt +0 -0
  356. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/requirements/release-tools.in +0 -0
  357. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/requirements/release-tools.txt +0 -0
  358. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/requirements/test-tools.in +0 -0
  359. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/requirements/test-tools.txt +0 -0
  360. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/a11y_check.py +0 -0
  361. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/bench_cli.sh +0 -0
  362. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/build_command_reference.py +0 -0
  363. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/build_registries.py +0 -0
  364. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/build_roadmap.py +0 -0
  365. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/check_anchors.py +0 -0
  366. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/check_licenses.py +0 -0
  367. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/check_required_checks.py +0 -0
  368. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/ensure_eval_corpus.sh +0 -0
  369. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/eval_explain.py +0 -0
  370. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/eval_gate.py +0 -0
  371. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/eval_recommend.py +0 -0
  372. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/eval_retrieval.py +0 -0
  373. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/eval_stats_summary.py +0 -0
  374. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/import_budget.py +0 -0
  375. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/lock_toolchain.py +0 -0
  376. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/mutation_gate.py +0 -0
  377. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/mutation_shards.py +0 -0
  378. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/mutation_weights.json +0 -0
  379. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/perf_gate.py +0 -0
  380. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/post_deploy_smoke.py +0 -0
  381. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/release_guard.py +0 -0
  382. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/scripts/release_preflight.py +0 -0
  383. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/setup.cfg +0 -0
  384. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/sonar-project.properties +0 -0
  385. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/style/README.md +0 -0
  386. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/style/boost.css +0 -0
  387. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/style/boost.js +0 -0
  388. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/style/demo.html +0 -0
  389. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/bdd/features/adapt.feature +0 -0
  390. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/bdd/features/browse.feature +0 -0
  391. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/bdd/features/count.feature +0 -0
  392. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/bdd/features/discover.feature +0 -0
  393. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/bdd/features/doctor.feature +0 -0
  394. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/bdd/features/environment.py +0 -0
  395. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/bdd/features/explain.feature +0 -0
  396. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/bdd/features/index.feature +0 -0
  397. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/bdd/features/install.feature +0 -0
  398. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/bdd/features/list.feature +0 -0
  399. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/bdd/features/mcp.feature +0 -0
  400. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/bdd/features/search.feature +0 -0
  401. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/bdd/features/steps/cli_steps.py +0 -0
  402. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/bdd/features/steps/discovery_steps.py +0 -0
  403. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/bdd/features/steps/mcp_steps.py +0 -0
  404. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/bdd/features/steps/quality_steps.py +0 -0
  405. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/conftest.py +0 -0
  406. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/eval/baseline.json +0 -0
  407. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/eval/explain.jsonl +0 -0
  408. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/eval/golden.jsonl +0 -0
  409. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/eval/recommend.jsonl +0 -0
  410. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/eval/taps.txt +0 -0
  411. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/functional/test_capabilities_policy.py +0 -0
  412. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/functional/test_cli_adapt.py +0 -0
  413. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/functional/test_cli_bmad.py +0 -0
  414. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/functional/test_cli_configuration.py +0 -0
  415. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/functional/test_cli_hooks.py +0 -0
  416. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/functional/test_cli_info.py +0 -0
  417. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/functional/test_cli_intelligence.py +0 -0
  418. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/functional/test_cli_pkg.py +0 -0
  419. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/functional/test_cli_quality.py +0 -0
  420. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/functional/test_cli_taps.py +0 -0
  421. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/functional/test_cli_team.py +0 -0
  422. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/functional/test_everyday_loop.py +0 -0
  423. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/functional/test_integrity_enforce.py +0 -0
  424. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/functional/test_property_parsers.py +0 -0
  425. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/functional/test_run.py +0 -0
  426. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/functional/test_tap_signing.py +0 -0
  427. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/functional/test_workspace_scope.py +0 -0
  428. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/README.md +0 -0
  429. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  430. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  431. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  432. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  433. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  434. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  435. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  436. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  437. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  438. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  439. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  440. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  441. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  442. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  443. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  444. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  445. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  446. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  447. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  448. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  449. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/fuzz_frontmatter.py +0 -0
  450. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/fuzz/fuzz_registry.py +0 -0
  451. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/make_fixture.py +0 -0
  452. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/perf/test_benchmarks.py +0 -0
  453. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/smoke.sh +0 -0
  454. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_a11y_check.py +0 -0
  455. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_adapters.py +0 -0
  456. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_adapters_multi.py +0 -0
  457. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_adapters_runner.py +0 -0
  458. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_agents.py +0 -0
  459. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_ai.py +0 -0
  460. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_capabilities.py +0 -0
  461. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_catalog.py +0 -0
  462. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_check_anchors.py +0 -0
  463. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_check_licenses.py +0 -0
  464. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_claude_settings.py +0 -0
  465. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_cliparse.py +0 -0
  466. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_codeql_analysis_key.py +0 -0
  467. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_command_reference_fresh.py +0 -0
  468. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_community_health_files.py +0 -0
  469. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_config.py +0 -0
  470. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_dependabot_config.py +0 -0
  471. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_docs_pages_linked.py +0 -0
  472. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_docsite_chrome.py +0 -0
  473. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_ed25519.py +0 -0
  474. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_errors_and_cli_table.py +0 -0
  475. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_eval_faithfulness.py +0 -0
  476. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_eval_gate.py +0 -0
  477. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_eval_metrics.py +0 -0
  478. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_eval_stats_summary.py +0 -0
  479. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_faithfulness.py +0 -0
  480. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_frontmatter.py +0 -0
  481. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_fuzz_targets.py +0 -0
  482. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_gitleaks_config.py +0 -0
  483. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_gitutil.py +0 -0
  484. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_imperative.py +0 -0
  485. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_import_budget.py +0 -0
  486. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_injectscan.py +0 -0
  487. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_installscan.py +0 -0
  488. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_integrity.py +0 -0
  489. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_journal.py +0 -0
  490. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_lockfile.py +0 -0
  491. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_logs.py +0 -0
  492. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_marketing_counts.py +0 -0
  493. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_mcp.py +0 -0
  494. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_mcp_install_scan.py +0 -0
  495. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_mcpdecl.py +0 -0
  496. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_minisign.py +0 -0
  497. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_mutation_hardening.py +0 -0
  498. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_mutation_shards.py +0 -0
  499. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_mutmut_source_paths.py +0 -0
  500. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_nethttp.py +0 -0
  501. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_output.py +0 -0
  502. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_paths.py +0 -0
  503. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_perf_gate.py +0 -0
  504. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_pkg_confusions.py +0 -0
  505. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_pkg_injection.py +0 -0
  506. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_pkg_secrets.py +0 -0
  507. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_policy.py +0 -0
  508. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_post_deploy_smoke.py +0 -0
  509. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_projectlock.py +0 -0
  510. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_provenance.py +0 -0
  511. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_rag.py +0 -0
  512. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_registries_fresh.py +0 -0
  513. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_registry.py +0 -0
  514. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_release_guard.py +0 -0
  515. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_release_preflight.py +0 -0
  516. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_required_checks.py +0 -0
  517. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_resolve.py +0 -0
  518. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_roadmap_fresh.py +0 -0
  519. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_rules.py +0 -0
  520. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_scopes.py +0 -0
  521. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_secretscan.py +0 -0
  522. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_selfupdate.py +0 -0
  523. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_serve.py +0 -0
  524. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_spin.py +0 -0
  525. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_stackprobe.py +0 -0
  526. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_staleness.py +0 -0
  527. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_store.py +0 -0
  528. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_token_parity.py +0 -0
  529. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_toolchain_lock.py +0 -0
  530. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_trustaudit.py +0 -0
  531. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_typosquat.py +0 -0
  532. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_updatediff.py +0 -0
  533. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_util.py +0 -0
  534. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_version.py +0 -0
  535. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_workflow_timeouts.py +0 -0
  536. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/unit/test_workflows.py +0 -0
  537. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/visual/a11y_check.mjs +0 -0
  538. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/visual/console_check.mjs +0 -0
  539. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/visual/package-lock.json +0 -0
  540. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/visual/package.json +0 -0
  541. {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.291}/tests/visual/visual_check.mjs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.290
3
+ Version: 1.0.291
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.0.290'
22
- __version_tuple__ = version_tuple = (1, 0, 290)
21
+ __version__ = version = '1.0.291'
22
+ __version_tuple__ = version_tuple = (1, 0, 291)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -79,6 +79,9 @@ def _ai_rank(query: str, scored):
79
79
  return [by_name[n] for n in names] + rest
80
80
 
81
81
 
82
+ _ENGINE_LABEL = {"BM25 full-content": "full-content BM25"}
83
+
84
+
82
85
  def cmd_search(argv):
83
86
  """Search the tap catalogs, optionally AI-reranked with --smart."""
84
87
  p = cliparse.parser(
@@ -104,9 +107,13 @@ def cmd_search(argv):
104
107
  if not use_rag:
105
108
  with spin.Spinner("building the search index (first run)"):
106
109
  use_rag = rag.ensure()
110
+ engine = ""
107
111
  if use_rag:
108
- scored = [(h["entry"], h["score"])
109
- for h in rag.retrieve(query, k=max(60, args.limit * 4))]
112
+ # retrieve_any, not retrieve: this picks the dense backend when one is
113
+ # built and floors to BM25 otherwise, so the CLI and the MCP server
114
+ # answer from the same engine instead of the CLI being BM25-only.
115
+ hits, engine = rag.retrieve_any(query, k=max(60, args.limit * 4))
116
+ scored = [(h["entry"], h["score"]) for h in (hits or [])]
110
117
  else:
111
118
  scored = catalog.search(query)
112
119
  if args.as_json:
@@ -116,7 +123,10 @@ def cmd_search(argv):
116
123
  out.info("no matches for %r" % query)
117
124
  out.info(out.role("try `boost discover %s` to search all of GitHub" % query, "muted"))
118
125
  return 0
119
- ranker = "full-content BM25" if use_rag else "heuristic relevance"
126
+ # The CLI's long-standing wording for the BM25 engine differs from the label
127
+ # rag/eval use ("BM25 full-content"), and both are load-bearing: the latter
128
+ # is pinned in tests/eval/baseline.json. Map instead of moving either.
129
+ ranker = _ENGINE_LABEL.get(engine, engine) if use_rag else "heuristic relevance"
120
130
  if args.smart:
121
131
  if ai.available():
122
132
  with spin.Spinner("ranking %d matches with Claude" % len(scored)):
@@ -190,8 +200,24 @@ def cmd_reindex(argv):
190
200
  if dense_stats is None:
191
201
  out.warn("dense index skipped — %s" % embed.fallback_note())
192
202
  else:
193
- out.ok("embedded %d passages (%s) into the dense vector store"
194
- % (dense_stats["chunks"], dense_stats["provider"]))
203
+ failed = dense_stats.get("failed") or []
204
+ if failed:
205
+ out.warn("embedding failed for %d tap(s) — %d passages stored. "
206
+ "The provider rejected those batches (rate limit, "
207
+ "quota, or oversized input); their commits were not "
208
+ "recorded, so a rerun retries them."
209
+ % (len(failed), dense_stats["chunks"]))
210
+ elif not dense_stats["chunks"]:
211
+ # Reporting success with an empty store sent a real user chasing
212
+ # the wrong cause: a stale run can mark every tap "built", so the
213
+ # reuse path skips everything and stores nothing.
214
+ out.warn("the dense vector store is empty — %d tap(s) were "
215
+ "reused as already-built. Rebuild with "
216
+ "`boost reindex --dense --force`."
217
+ % len(dense_stats["reused"]))
218
+ else:
219
+ out.ok("embedded %d passages (%s) into the dense vector store"
220
+ % (dense_stats["chunks"], dense_stats["provider"]))
195
221
  journal.log("reindex", "%d passages" % stats["docs"],
196
222
  entries=stats["entries"])
197
223
  return 0
@@ -115,6 +115,12 @@ def ready() -> bool:
115
115
  return False
116
116
  if meta.get("provider") != embed.provider():
117
117
  return False
118
+ # Model, not just provider+dim: two models from one provider can share
119
+ # a dimension and still be different embedding spaces (voyage-3 and
120
+ # voyage-4 are both 1024-d), so serving stale vectors would silently
121
+ # mix spaces rather than fail loudly.
122
+ if meta.get("model") != embed.model():
123
+ return False
118
124
  if meta.get("dim") != embed.dimension():
119
125
  return False
120
126
  try:
@@ -147,7 +153,9 @@ def build(entries: Optional[List[dict]] = None,
147
153
  return None
148
154
  try:
149
155
  meta = _read_meta(con)
150
- same_backend = (meta.get("provider") == prov and meta.get("dim") == dim)
156
+ same_backend = (meta.get("provider") == prov
157
+ and meta.get("model") == mdl
158
+ and meta.get("dim") == dim)
151
159
  if force or not same_backend:
152
160
  _wipe(con)
153
161
  _ensure_schema(con, dim)
@@ -172,9 +180,16 @@ def build(entries: Optional[List[dict]] = None,
172
180
  removed_taps = sorted(_indexed_taps(con) - {e["tap"] for e in entries})
173
181
  _delete_taps(con, changed_taps + removed_taps)
174
182
 
175
- added = _embed_and_store(con, fresh, tap_paths)
183
+ added, failed_taps = _embed_and_store(con, fresh, tap_paths)
184
+ # Only record a commit for a tap whose chunks actually landed. Recording
185
+ # one for a tap that stored nothing makes every later non-forced run
186
+ # treat it as already built and skip it — one transient rate limit would
187
+ # otherwise leave the store permanently empty until `--force`.
188
+ failed_safe = {t.replace("/", "__") for t in failed_taps}
189
+ recorded = {safe: c for safe, c in commits.items()
190
+ if safe not in failed_safe}
176
191
  _write_meta(con, {"version": INDEX_VERSION, "provider": prov,
177
- "model": mdl, "dim": dim, "commits": commits})
192
+ "model": mdl, "dim": dim, "commits": recorded})
178
193
  con.commit()
179
194
  total = con.execute("SELECT COUNT(*) FROM chunks").fetchone()[0]
180
195
  return {
@@ -185,6 +200,7 @@ def build(entries: Optional[List[dict]] = None,
185
200
  "reindexed": changed_taps,
186
201
  "pruned": removed_taps,
187
202
  "reused": sorted(reused),
203
+ "failed": sorted(failed_taps),
188
204
  "provider": prov,
189
205
  "model": mdl,
190
206
  }
@@ -210,19 +226,31 @@ def _delete_taps(con: sqlite3.Connection, taps: List[str]) -> None:
210
226
 
211
227
 
212
228
  def _embed_and_store(con: sqlite3.Connection, entries: List[dict],
213
- tap_paths: Optional[Dict[str, Path]]) -> int:
229
+ tap_paths: Optional[Dict[str, Path]]
230
+ ) -> Tuple[int, set]:
231
+ """Embed every chunk of ``entries``; returns ``(added, failed_taps)``.
232
+
233
+ A batch the provider rejects (rate limit, quota, oversized input) yields no
234
+ vectors. Its taps are reported back rather than silently dropped, so the
235
+ caller can avoid recording a commit for a tap that stored nothing.
236
+ """
214
237
  mod = _load()
215
238
  if mod is None: # [rag] extra absent — nothing to serialize into
216
- return 0 # (callers fall back to BM25; see module docstring)
239
+ # Report every tap as failed so the caller records no commits: marking
240
+ # them built with zero vectors stored is what leaves the store
241
+ # permanently empty. (callers fall back to BM25; see module docstring)
242
+ return 0, {e["tap"] for e in entries}
217
243
  rows: List[Tuple[dict, int, str]] = [] # (entry, chunk_ix, text)
218
244
  for e in entries:
219
245
  for ci, text in enumerate(_chunk_texts(e, tap_paths)):
220
246
  rows.append((e, ci, text))
221
247
  added = 0
248
+ failed_taps: set = set()
222
249
  for start in range(0, len(rows), _BATCH):
223
250
  batch = rows[start:start + _BATCH]
224
251
  vecs = embed.embed([t for _e, _c, t in batch], input_type="document")
225
252
  if not vecs or len(vecs) != len(batch):
253
+ failed_taps.update(e["tap"] for e, _c, _t in batch)
226
254
  continue
227
255
  for (e, ci, text), vec in zip(batch, vecs):
228
256
  cur = con.execute(
@@ -233,7 +261,7 @@ def _embed_and_store(con: sqlite3.Connection, entries: List[dict],
233
261
  con.execute("INSERT INTO vec_chunks (rowid, embedding) VALUES (?, ?)",
234
262
  (cur.lastrowid, mod.serialize_float32(vec)))
235
263
  added += 1
236
- return added
264
+ return added, failed_taps
237
265
 
238
266
 
239
267
  def retrieve(query: str, k: int = 60, kind: Optional[str] = None,
@@ -23,7 +23,10 @@ OPENAI_URL = "https://api.openai.com/v1/embeddings"
23
23
 
24
24
  # model -> output dimension. Stored in the vector index so a provider/model
25
25
  # switch is detected and forces a clean rebuild instead of mixing spaces.
26
- VOYAGE_MODEL = "voyage-3"
26
+ # voyage-4 over voyage-3: same 1024-d default and same $/token, but the
27
+ # voyage-4 generation carries a 200M-token complimentary allowance where
28
+ # voyage-3 has none — so a full index build of a large corpus is free.
29
+ VOYAGE_MODEL = "voyage-4"
27
30
  OPENAI_MODEL = "text-embedding-3-small"
28
31
  _DIMS = {VOYAGE_MODEL: 1024, OPENAI_MODEL: 1536}
29
32
 
@@ -421,13 +421,17 @@ def rerank(query: str, hits: List[Hit], limit: int = 10) -> Tuple[List[Hit], str
421
421
  return (picked + rest)[:limit], "Claude relevance"
422
422
 
423
423
 
424
- def _retrieve_any(query: str, k: int, kind: Optional[str],
425
- entries: Optional[List[dict]]
426
- ) -> Tuple[Optional[List[Hit]], str]:
424
+ def retrieve_any(query: str, k: int = 60, kind: Optional[str] = None,
425
+ entries: Optional[List[dict]] = None
426
+ ) -> Tuple[Optional[List[Hit]], str]:
427
427
  """Prefer the opt-in dense backend, floor to BM25.
428
428
 
429
429
  Returns ``(hits, engine_label)``; ``hits`` is ``None`` only when no index of
430
430
  any kind exists so the caller can fall back to ``catalog.search``.
431
+
432
+ Public because every retrieval entry point must make the same engine
433
+ choice: `cmd_search` calling ``retrieve`` directly meant the CLI could
434
+ never use a built dense index, while the MCP path could.
431
435
  """
432
436
  from . import dense
433
437
  if dense.ready():
@@ -454,7 +458,7 @@ def search(query: str, limit: int = 10, kind: Optional[str] = None,
454
458
  Returns ``(hits, ranker_label)``, or ``None`` when no index exists yet so
455
459
  the caller can fall back to ``catalog.search``.
456
460
  """
457
- hits, engine = _retrieve_any(query, max(60, limit * 4), kind, entries)
461
+ hits, engine = retrieve_any(query, max(60, limit * 4), kind, entries)
458
462
  if hits is None:
459
463
  return None
460
464
  if smart:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.290
3
+ Version: 1.0.291
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -1106,3 +1106,54 @@ class TestReindex:
1106
1106
  assert data["dense"]["chunks"] >= 1
1107
1107
  assert data["dense"]["provider"] == "openai"
1108
1108
  assert dense.ready() is True
1109
+
1110
+ def test_cli_search_uses_dense_when_the_vector_store_is_built(
1111
+ self, boost, tapped, monkeypatch):
1112
+ """`boost search` must answer from the same engine the MCP server does.
1113
+
1114
+ It previously called ``rag.retrieve`` directly, so a built dense index
1115
+ served the MCP path while the CLI stayed BM25-only.
1116
+ """
1117
+ if not _vec_loadable():
1118
+ pytest.skip("sqlite-vec extension not loadable here")
1119
+ from boost_cli.core import dense, embed
1120
+
1121
+ def toy(texts, input_type=None, timeout=60):
1122
+ return [[1.0, 2.0, 3.0] for _ in texts]
1123
+ monkeypatch.setattr(embed, "embed", toy)
1124
+ monkeypatch.setattr(embed, "available", lambda: True)
1125
+ monkeypatch.setattr(embed, "provider", lambda: "openai")
1126
+ monkeypatch.setattr(embed, "model", lambda: "toy-3")
1127
+ monkeypatch.setattr(embed, "dimension", lambda: 3)
1128
+ boost("reindex", "--dense")
1129
+ assert dense.ready() is True
1130
+ r = boost("search", "brainstorming")
1131
+ assert "ranked by dense vectors" in r.out
1132
+ assert "full-content BM25" not in r.out
1133
+
1134
+ def test_empty_store_warns_instead_of_reporting_success(
1135
+ self, boost, tapped, monkeypatch):
1136
+ """A store left empty by an earlier run must not print a green check.
1137
+
1138
+ Reporting success on an empty store cost a real user a long debugging
1139
+ detour: every tap reads as already-built, so the reuse path skips
1140
+ everything and stores nothing.
1141
+ """
1142
+ if not _vec_loadable():
1143
+ pytest.skip("sqlite-vec extension not loadable here")
1144
+ from boost_cli.core import dense, embed
1145
+
1146
+ def toy(texts, input_type=None, timeout=60):
1147
+ return [[1.0, 2.0, 3.0] for _ in texts]
1148
+ monkeypatch.setattr(embed, "embed", toy)
1149
+ monkeypatch.setattr(embed, "available", lambda: True)
1150
+ monkeypatch.setattr(embed, "provider", lambda: "openai")
1151
+ monkeypatch.setattr(embed, "model", lambda: "toy-3")
1152
+ monkeypatch.setattr(embed, "dimension", lambda: 3)
1153
+ # Records every tap commit while storing nothing — the exact state a
1154
+ # rate-limited pre-fix run left behind.
1155
+ dense.build(entries=[], force=True)
1156
+ r = boost("reindex", "--dense")
1157
+ assert "dense vector store is empty" in r.out
1158
+ assert "--force" in r.out
1159
+ assert dense.ready() is False
@@ -203,6 +203,27 @@ class TestIncremental:
203
203
  monkeypatch.setattr(embed, "dimension", lambda: 4)
204
204
  assert dense.ready() is False
205
205
 
206
+ def test_model_switch_invalidates(self, dense_env, monkeypatch):
207
+ # Same provider, same dimension, different model — voyage-3 -> voyage-4
208
+ # is exactly this shape. provider+dim alone cannot catch it.
209
+ dense.build(entries=_ENTRIES, force=True)
210
+ assert dense.ready() is True
211
+ monkeypatch.setattr(embed, "model", lambda: "toy-4")
212
+ assert dense.ready() is False
213
+
214
+ def test_model_switch_reembeds_instead_of_reusing(self, dense_env,
215
+ monkeypatch):
216
+ # The tap commit is unchanged, so only the model check can stop the
217
+ # reuse path from serving vectors from the previous embedding space.
218
+ dense.build(entries=_ENTRIES, force=True)
219
+ monkeypatch.setattr(embed, "model", lambda: "toy-4")
220
+ stats = dense.build(entries=_ENTRIES)
221
+ assert stats["reused"] == []
222
+ assert stats["model"] == "toy-4"
223
+ assert stats["added"] == len(_ENTRIES)
224
+ assert stats["chunks"] == len(_ENTRIES) # wiped, not appended
225
+ assert dense.ready() is True
226
+
206
227
  def test_added_and_chunks_on_reindex(self, dense_env, monkeypatch):
207
228
  dense.build(entries=_ENTRIES, force=True)
208
229
  monkeypatch.setattr(rag, "_tap_commits", lambda: {"acme__skills": "c2"})
@@ -150,13 +150,15 @@ class TestReadyGuards:
150
150
  monkeypatch.setattr(dense, "db_path", lambda: dbfile)
151
151
  monkeypatch.setattr(embed, "available", lambda: True)
152
152
  monkeypatch.setattr(embed, "provider", lambda: "openai")
153
+ monkeypatch.setattr(embed, "model", lambda: "toy-3")
153
154
  monkeypatch.setattr(embed, "dimension", lambda: 3)
154
155
  return monkeypatch
155
156
 
156
157
  def _use(self, monkeypatch, con):
157
158
  monkeypatch.setattr(dense, "_connect", lambda: con)
158
159
 
159
- _GOOD: ClassVar[dict] = {"version": dense.INDEX_VERSION, "provider": "openai", "dim": 3}
160
+ _GOOD: ClassVar[dict] = {"version": dense.INDEX_VERSION,
161
+ "provider": "openai", "model": "toy-3", "dim": 3}
160
162
 
161
163
  def test_true_when_everything_matches(self, wired):
162
164
  self._use(wired, self._seed(self._GOOD, rows=1))
@@ -182,6 +184,17 @@ class TestReadyGuards:
182
184
  self._use(wired, self._seed({**self._GOOD, "dim": 99}))
183
185
  assert dense.ready() is False
184
186
 
187
+ def test_false_on_model_mismatch(self, wired):
188
+ # provider and dim still match — only the model moved (voyage-3 ->
189
+ # voyage-4 is this exact case, both 1024-d under provider "voyage")
190
+ self._use(wired, self._seed({**self._GOOD, "model": "toy-4"}))
191
+ assert dense.ready() is False
192
+
193
+ def test_false_when_model_absent_from_meta(self, wired):
194
+ meta = {k: v for k, v in self._GOOD.items() if k != "model"}
195
+ self._use(wired, self._seed(meta))
196
+ assert dense.ready() is False
197
+
185
198
  def test_false_when_chunks_table_missing(self, wired):
186
199
  self._use(wired, self._seed(self._GOOD, with_chunks=False))
187
200
  assert dense.ready() is False
@@ -485,12 +498,57 @@ class TestBuildWithoutExtension:
485
498
  assert stats["reused"] == []
486
499
  assert stats["provider"] == "voyage"
487
500
 
501
+ def test_model_switch_wipes_and_rebuilds(self, store):
502
+ # provider and dim unchanged, only the model moved — the voyage-3 ->
503
+ # voyage-4 case. Without the model term in `same_backend` the unchanged
504
+ # tap commit would reuse vectors from the old embedding space.
505
+ dense.build(entries=_ENTRIES, force=True)
506
+ store.setattr(embed, "model", lambda: "toy-4")
507
+ stats = dense.build(entries=_ENTRIES) # no force needed
508
+ assert stats["reused"] == []
509
+ assert stats["model"] == "toy-4"
510
+ assert stats["added"] == 2
511
+ assert stats["chunks"] == 2 # wiped, not appended
512
+
488
513
  def test_batch_count_mismatch_drops_that_batch(self, store):
489
514
  store.setattr(embed, "embed", lambda texts, **k: [[1.0, 2.0, 3.0]])
490
515
  stats = dense.build(entries=_ENTRIES, force=True)
491
516
  assert stats["added"] == 0
492
517
  assert stats["chunks"] == 0
493
518
 
519
+ def test_failed_batch_is_reported_not_swallowed(self, store):
520
+ store.setattr(embed, "embed", lambda texts, **k: None) # provider 429s
521
+ stats = dense.build(entries=_ENTRIES, force=True)
522
+ assert stats["added"] == 0
523
+ assert stats["failed"] == ["acme/skills"]
524
+
525
+ def test_failed_tap_commit_is_not_recorded(self, store):
526
+ # A rate-limited run must not mark the tap "built at c1" — otherwise the
527
+ # next non-forced run reuses it and the store stays empty forever.
528
+ store.setattr(embed, "embed", lambda texts, **k: None)
529
+ dense.build(entries=_ENTRIES, force=True)
530
+ con = sqlite3.connect(str(dense.db_path()))
531
+ meta = dense._read_meta(con)
532
+ con.close()
533
+ assert meta["commits"] == {}
534
+
535
+ def test_rerun_after_failure_retries_instead_of_reusing(self, store):
536
+ store.setattr(embed, "embed", lambda texts, **k: None)
537
+ dense.build(entries=_ENTRIES, force=True) # fails, stores nothing
538
+ store.setattr(embed, "embed", _toy_embed) # provider recovers
539
+ stats = dense.build(entries=_ENTRIES) # no --force needed
540
+ assert stats["reused"] == []
541
+ assert stats["failed"] == []
542
+ assert stats["added"] == 2
543
+ assert stats["chunks"] == 2
544
+
545
+ def test_successful_tap_commit_is_recorded(self, store):
546
+ dense.build(entries=_ENTRIES, force=True)
547
+ con = sqlite3.connect(str(dense.db_path()))
548
+ meta = dense._read_meta(con)
549
+ con.close()
550
+ assert meta["commits"] == {"acme__skills": "c1"}
551
+
494
552
  def test_empty_entries_builds_nothing(self, store):
495
553
  stats = dense.build(entries=[], force=True)
496
554
  assert stats["chunks"] == 0
@@ -51,6 +51,19 @@ class TestProviderSelection:
51
51
  assert embed.dimension() == 1024
52
52
  assert embed.available() is True
53
53
 
54
+ def test_every_selectable_model_has_a_dimension(self, sandbox, monkeypatch):
55
+ """A model bump that forgets ``_DIMS`` would hand ``dense`` a None dim.
56
+
57
+ ``dense.build`` bails out on a None dimension, so the vector store would
58
+ silently never build rather than fail loudly.
59
+ """
60
+ for env in ("VOYAGE_API_KEY", "OPENAI_API_KEY"):
61
+ monkeypatch.delenv("VOYAGE_API_KEY", raising=False)
62
+ monkeypatch.delenv("OPENAI_API_KEY", raising=False)
63
+ monkeypatch.setenv(env, "k")
64
+ assert embed.model() in embed._DIMS
65
+ assert isinstance(embed.dimension(), int)
66
+
54
67
  def test_openai_when_only_openai(self, sandbox, monkeypatch):
55
68
  monkeypatch.setenv("OPENAI_API_KEY", "o")
56
69
  assert embed.provider() == "openai"