boost-skill-cli 1.2.47__tar.gz → 1.2.49__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 (814) hide show
  1. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/CLAUDE.md +37 -1
  2. {boost_skill_cli-1.2.47/boost_skill_cli.egg-info → boost_skill_cli-1.2.49}/PKG-INFO +14 -1
  3. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/README.md +13 -0
  4. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/__init__.py +9 -1
  5. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/_version.py +2 -2
  6. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/discovery.py +26 -0
  7. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/pkg.py +54 -2
  8. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/quickstart.py +34 -6
  9. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/taps.py +8 -2
  10. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/paths.py +10 -0
  11. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/registry.py +96 -6
  12. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49/boost_skill_cli.egg-info}/PKG-INFO +14 -1
  13. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_skill_cli.egg-info/SOURCES.txt +5 -0
  14. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/commands.html +8 -6
  15. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/semantic-search.md +7 -0
  16. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/pyproject.toml +15 -0
  17. boost_skill_cli-1.2.49/scripts/shard_plan.py +146 -0
  18. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_quickstart.py +32 -0
  19. boost_skill_cli-1.2.49/tests/functional/test_cli_tap_pins.py +204 -0
  20. boost_skill_cli-1.2.49/tests/unit/test_shard_plan.py +125 -0
  21. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_shards_matrix.py +33 -7
  22. boost_skill_cli-1.2.49/tests/unit/test_tap_pins.py +167 -0
  23. boost_skill_cli-1.2.49/tests/unit/test_version_tags.py +104 -0
  24. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.gitattributes +0 -0
  25. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.gitignore +0 -0
  26. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.gitleaks.toml +0 -0
  27. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.htmlvalidate.json +0 -0
  28. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.lighthouserc.json +0 -0
  29. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.lycheeignore +0 -0
  30. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.markdownlint-cli2.jsonc +0 -0
  31. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.pre-commit-config.yaml +0 -0
  32. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.stylelintrc.json +0 -0
  33. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.vale/styles/boost/AIWriting.yml +0 -0
  34. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.vale/styles/boost/Terminology.yml +0 -0
  35. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  36. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.vale.ini +0 -0
  37. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/CODE_OF_CONDUCT.md +0 -0
  38. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/CONTRIBUTING.md +0 -0
  39. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/DCO +0 -0
  40. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/GOVERNANCE.md +0 -0
  41. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/LICENSE +0 -0
  42. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/MAINTAINERS.md +0 -0
  43. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/MANIFEST.in +0 -0
  44. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/Makefile +0 -0
  45. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/SECURITY.md +0 -0
  46. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/SUPPORT.md +0 -0
  47. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost +0 -0
  48. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/__main__.py +0 -0
  49. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/cli.py +0 -0
  50. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/cliparse.py +0 -0
  51. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/__init__.py +0 -0
  52. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/_common.py +0 -0
  53. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/bmad.py +0 -0
  54. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/configuration.py +0 -0
  55. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/hooks.py +0 -0
  56. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/info.py +0 -0
  57. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/intelligence.py +0 -0
  58. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/quality.py +0 -0
  59. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/run.py +0 -0
  60. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/safety.py +0 -0
  61. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/team.py +0 -0
  62. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/__init__.py +0 -0
  63. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/adapters.py +0 -0
  64. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/agents.py +0 -0
  65. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/ai.py +0 -0
  66. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/aihost.py +0 -0
  67. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/bmad.py +0 -0
  68. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/bootstrap.py +0 -0
  69. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/browse.py +0 -0
  70. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/builtin.py +0 -0
  71. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/capabilities.py +0 -0
  72. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/catalog.py +0 -0
  73. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/catalogbundle.py +0 -0
  74. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/chat.py +0 -0
  75. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/claude_settings.py +0 -0
  76. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/complete.py +0 -0
  77. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/config.py +0 -0
  78. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/dense.py +0 -0
  79. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/ed25519.py +0 -0
  80. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/embed.py +0 -0
  81. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/faithfulness.py +0 -0
  82. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/frontmatter.py +0 -0
  83. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/gitutil.py +0 -0
  84. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/hookhost.py +0 -0
  85. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/imperative.py +0 -0
  86. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/injectscan.py +0 -0
  87. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/installscan.py +0 -0
  88. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/integrity.py +0 -0
  89. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/journal.py +0 -0
  90. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/localembed.py +0 -0
  91. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/lockfile.py +0 -0
  92. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/logs.py +0 -0
  93. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/mcp.py +0 -0
  94. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/mcpdecl.py +0 -0
  95. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/mcphost.py +0 -0
  96. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/minisign.py +0 -0
  97. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/nethttp.py +0 -0
  98. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/output.py +0 -0
  99. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/policy.py +0 -0
  100. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/projectlock.py +0 -0
  101. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/provenance.py +0 -0
  102. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/rag.py +0 -0
  103. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/resolve.py +0 -0
  104. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/rules.py +0 -0
  105. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/scopes.py +0 -0
  106. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/secretscan.py +0 -0
  107. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/selfupdate.py +0 -0
  108. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/serve.py +0 -0
  109. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/shards.py +0 -0
  110. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/stackprobe.py +0 -0
  111. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/staleness.py +0 -0
  112. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/store.py +0 -0
  113. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/trustaudit.py +0 -0
  114. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/typosquat.py +0 -0
  115. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/updatediff.py +0 -0
  116. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/util.py +0 -0
  117. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/workflows.py +0 -0
  118. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/data/registries.json +0 -0
  119. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/data/rules/boost-first.mdc +0 -0
  120. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/errors.py +0 -0
  121. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/spin.py +0 -0
  122. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_langchain/__init__.py +0 -0
  123. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_langchain/_compat.py +0 -0
  124. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_langchain/graph.py +0 -0
  125. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_langchain/loader.py +0 -0
  126. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_langchain/py.typed +0 -0
  127. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_langchain/retriever.py +0 -0
  128. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  129. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  130. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_skill_cli.egg-info/requires.txt +0 -0
  131. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_skill_cli.egg-info/top_level.txt +0 -0
  132. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/codecov.yml +0 -0
  133. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/.claude/settings.local.json +0 -0
  134. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/DEBUGGING.md +0 -0
  135. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/adapters.html +0 -0
  136. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/architecture/README.md +0 -0
  137. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/architecture/c4-components-core.md +0 -0
  138. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/architecture/c4-containers.md +0 -0
  139. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/architecture/c4-context.md +0 -0
  140. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/architecture/c4-dynamic-install.md +0 -0
  141. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/bmad.md +0 -0
  142. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/gifs/distill.gif +0 -0
  143. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/gifs/doctor.gif +0 -0
  144. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/gifs/explain.gif +0 -0
  145. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/gifs/hooks.gif +0 -0
  146. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/gifs/install.gif +0 -0
  147. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/gifs/pulse.gif +0 -0
  148. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/gifs/search.gif +0 -0
  149. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/gifs/tap.gif +0 -0
  150. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/tapes/distill.tape +0 -0
  151. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/tapes/doctor.tape +0 -0
  152. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/tapes/explain.tape +0 -0
  153. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/tapes/hooks.tape +0 -0
  154. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/tapes/install.tape +0 -0
  155. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/tapes/pulse.tape +0 -0
  156. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/tapes/search.tape +0 -0
  157. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/tapes/tap.tape +0 -0
  158. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel.html +0 -0
  159. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/chat.html +0 -0
  160. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/code-review.md +0 -0
  161. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/commit-audit.md +0 -0
  162. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/demo-index.json +0 -0
  163. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/demo.gif +0 -0
  164. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/demo.html +0 -0
  165. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/demo.tape +0 -0
  166. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/dependencies.md +0 -0
  167. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/design-roadmap.html +0 -0
  168. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/eval-latest.json +0 -0
  169. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/eval.html +0 -0
  170. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/index.html +0 -0
  171. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/langchain.html +0 -0
  172. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/mcp-hub.html +0 -0
  173. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/openssf-badge.md +0 -0
  174. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/openssf-playbook.md +0 -0
  175. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/rag-architecture.md +0 -0
  176. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D01.md +0 -0
  177. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D02.md +0 -0
  178. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D03.md +0 -0
  179. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D04.md +0 -0
  180. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D05.md +0 -0
  181. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D06.md +0 -0
  182. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D07.md +0 -0
  183. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D08.md +0 -0
  184. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D09.md +0 -0
  185. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D10.md +0 -0
  186. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D11.md +0 -0
  187. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D12.md +0 -0
  188. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D13.md +0 -0
  189. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D14.md +0 -0
  190. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D15.md +0 -0
  191. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D16.md +0 -0
  192. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D17.md +0 -0
  193. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D18.md +0 -0
  194. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D19.md +0 -0
  195. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D20.md +0 -0
  196. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D21.md +0 -0
  197. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D22.md +0 -0
  198. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D23.md +0 -0
  199. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D24.md +0 -0
  200. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D25.md +0 -0
  201. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D26.md +0 -0
  202. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D27.md +0 -0
  203. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  204. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  205. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  206. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  207. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  208. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/ai-backend-fanout.md +0 -0
  209. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  210. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  211. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  212. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  213. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  214. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
  215. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  216. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  217. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/bmad-hooks-all-hosts.md +0 -0
  218. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
  219. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/boost-first-rule.md +0 -0
  220. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  221. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  222. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/branch-current-gate.md +0 -0
  223. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  224. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  225. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
  226. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  227. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  228. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  229. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  230. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
  231. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  232. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  233. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  234. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  235. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  236. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  237. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/cli-command-audit.md +0 -0
  238. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
  239. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  240. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  241. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
  242. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/command-carousel-page.md +0 -0
  243. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  244. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  245. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
  246. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  247. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  248. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  249. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  250. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  251. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  252. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
  253. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  254. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  255. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  256. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  257. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
  258. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  259. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  260. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  261. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  262. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  263. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
  264. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  265. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  266. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  267. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  268. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  269. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  270. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  271. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  272. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  273. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  274. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  275. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  276. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  277. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  278. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  279. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  280. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  281. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  282. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  283. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  284. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  285. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  286. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  287. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  288. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  289. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  290. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
  291. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
  292. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
  293. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/github-community-health-files.md +0 -0
  294. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  295. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  296. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  297. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/gstack-tap-first-then-coexistence.md +0 -0
  298. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  299. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  300. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  301. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  302. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  303. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  304. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  305. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  306. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  307. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  308. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  309. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  310. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  311. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  312. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  313. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  314. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  315. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  316. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  317. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  318. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  319. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  320. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  321. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  322. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  323. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  324. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  325. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  326. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  327. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  328. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
  329. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  330. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  331. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  332. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  333. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  334. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  335. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  336. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
  337. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  338. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  339. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  340. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  341. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  342. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  343. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  344. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  345. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  346. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  347. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  348. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  349. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  350. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  351. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  352. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  353. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  354. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  355. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  356. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  357. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  358. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  359. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  360. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  361. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  362. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  363. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  364. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  365. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  366. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  367. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  368. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
  369. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
  370. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/openssf-playbook.md +0 -0
  371. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/openssf-silver.md +0 -0
  372. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/osps-baseline-levels.md +0 -0
  373. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  374. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  375. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  376. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
  377. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  378. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  379. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  380. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  381. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  382. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  383. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  384. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  385. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  386. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  387. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  388. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  389. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  390. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  391. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  392. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  393. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/published-shards-have-no-consumer.md +0 -0
  394. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  395. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  396. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  397. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  398. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  399. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
  400. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  401. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  402. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  403. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  404. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/relicence-apache-2.md +0 -0
  405. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
  406. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  407. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  408. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  409. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  410. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  411. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  412. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  413. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  414. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  415. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  416. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  417. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  418. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  419. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  420. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  421. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  422. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  423. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  424. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  425. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  426. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  427. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  428. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
  429. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  430. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  431. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  432. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  433. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  434. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  435. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
  436. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
  437. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
  438. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  439. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
  440. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
  441. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  442. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  443. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  444. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
  445. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  446. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  447. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  448. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  449. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  450. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  451. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
  452. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  453. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  454. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  455. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
  456. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  457. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
  458. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
  459. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
  460. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
  461. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  462. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
  463. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
  464. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
  465. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  466. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  467. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  468. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  469. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  470. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  471. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  472. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  473. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  474. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  475. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  476. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/vex-openvex-feed.md +0 -0
  477. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  478. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  479. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  480. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  481. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  482. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  483. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  484. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/workspace-scope-install.md +0 -0
  485. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/zip-strict-audit.md +0 -0
  486. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  487. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  488. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap.html +0 -0
  489. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/security-design.md +0 -0
  490. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
  491. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/verifying-releases.md +0 -0
  492. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/vex/meta.md +0 -0
  493. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/vex/openvex.json +0 -0
  494. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
  495. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
  496. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
  497. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
  498. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/eslint.config.mjs +0 -0
  499. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/evals/README.md +0 -0
  500. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/evals/__init__.py +0 -0
  501. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/evals/baseline.json +0 -0
  502. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/evals/faithfulness.py +0 -0
  503. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/evals/golden_set.json +0 -0
  504. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/evals/make_corpus.py +0 -0
  505. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/evals/make_golden.py +0 -0
  506. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/evals/metrics.py +0 -0
  507. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/evals/publish_golden_dataset.py +0 -0
  508. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/evals/run_evals.py +0 -0
  509. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/examples/README.md +0 -0
  510. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/examples/adapt-demo.sh +0 -0
  511. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/examples/boost-run-prototype.sh +0 -0
  512. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/index.html +0 -0
  513. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/noxfile.py +0 -0
  514. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/coverage-tools.in +0 -0
  515. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/coverage-tools.txt +0 -0
  516. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/lint-tools.in +0 -0
  517. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/lint-tools.txt +0 -0
  518. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/mutation-tools.in +0 -0
  519. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/mutation-tools.txt +0 -0
  520. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/platform-pins.lock +0 -0
  521. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/release-tools.in +0 -0
  522. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/release-tools.txt +0 -0
  523. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/test-tools.in +0 -0
  524. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/test-tools.txt +0 -0
  525. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/a11y_check.py +0 -0
  526. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/add_spdx_headers.py +0 -0
  527. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/bench_cli.sh +0 -0
  528. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/build_command_reference.py +0 -0
  529. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/build_demo_index.py +0 -0
  530. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/build_registries.py +0 -0
  531. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/build_roadmap.py +0 -0
  532. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/build_scale_corpus.py +0 -0
  533. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/build_vex.py +0 -0
  534. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/check_anchors.py +0 -0
  535. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/check_branch_current.py +0 -0
  536. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/check_dco.py +0 -0
  537. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/check_licenses.py +0 -0
  538. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/check_reproducible.py +0 -0
  539. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/check_required_checks.py +0 -0
  540. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/ensure_eval_corpus.sh +0 -0
  541. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/eval_corpus.py +0 -0
  542. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/eval_explain.py +0 -0
  543. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/eval_gate.py +0 -0
  544. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/eval_recommend.py +0 -0
  545. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/eval_retrieval.py +0 -0
  546. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/eval_stats_summary.py +0 -0
  547. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/import_budget.py +0 -0
  548. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/lock_toolchain.py +0 -0
  549. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/measure_registry.py +0 -0
  550. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/mutation_gate.py +0 -0
  551. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/mutation_shards.py +0 -0
  552. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/mutation_weights.json +0 -0
  553. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/normalize_sdist.py +0 -0
  554. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/page_budget.py +0 -0
  555. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/perf_gate.py +0 -0
  556. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/post_deploy_smoke.py +0 -0
  557. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/publish_eval_json.py +0 -0
  558. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/publish_shards.py +0 -0
  559. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/release_guard.py +0 -0
  560. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/release_preflight.py +0 -0
  561. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/serve_docs.py +0 -0
  562. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/setup.cfg +0 -0
  563. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/sonar-project.properties +0 -0
  564. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/style/README.md +0 -0
  565. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/style/boost.css +0 -0
  566. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/style/boost.js +0 -0
  567. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/style/demo.html +0 -0
  568. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/adapt.feature +0 -0
  569. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/browse.feature +0 -0
  570. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/count.feature +0 -0
  571. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/discover.feature +0 -0
  572. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/doctor.feature +0 -0
  573. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/environment.py +0 -0
  574. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/explain.feature +0 -0
  575. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/index.feature +0 -0
  576. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/install.feature +0 -0
  577. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/list.feature +0 -0
  578. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/mcp.feature +0 -0
  579. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/search.feature +0 -0
  580. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/steps/cli_steps.py +0 -0
  581. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/steps/discovery_steps.py +0 -0
  582. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/steps/mcp_steps.py +0 -0
  583. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/steps/quality_steps.py +0 -0
  584. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/conftest.py +0 -0
  585. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/eval/baseline.json +0 -0
  586. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/eval/explain.jsonl +0 -0
  587. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/eval/golden-natural.jsonl +0 -0
  588. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/eval/golden.jsonl +0 -0
  589. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/eval/recommend.jsonl +0 -0
  590. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/eval/taps-scale.txt +0 -0
  591. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/eval/taps.txt +0 -0
  592. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_bmad_all_hosts.py +0 -0
  593. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_capabilities_policy.py +0 -0
  594. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_adapt.py +0 -0
  595. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_bmad.py +0 -0
  596. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_catalog.py +0 -0
  597. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_chat.py +0 -0
  598. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_configuration.py +0 -0
  599. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_discovery.py +0 -0
  600. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_hooks.py +0 -0
  601. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_hooks_gemini.py +0 -0
  602. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_info.py +0 -0
  603. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_intelligence.py +0 -0
  604. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_pane_width.py +0 -0
  605. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_pkg.py +0 -0
  606. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_quality.py +0 -0
  607. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_taps.py +0 -0
  608. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_team.py +0 -0
  609. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_everyday_loop.py +0 -0
  610. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_integrity_enforce.py +0 -0
  611. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_kind_conformance.py +0 -0
  612. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_property_parsers.py +0 -0
  613. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_run.py +0 -0
  614. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_tap_signing.py +0 -0
  615. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_workspace_scope.py +0 -0
  616. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/README.md +0 -0
  617. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  618. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  619. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  620. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  621. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  622. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  623. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  624. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  625. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  626. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  627. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  628. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  629. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  630. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  631. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  632. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  633. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  634. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  635. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  636. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  637. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
  638. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
  639. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
  640. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/fuzz_frontmatter.py +0 -0
  641. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/fuzz_registry.py +0 -0
  642. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/langchain/conftest.py +0 -0
  643. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/langchain/test_graph.py +0 -0
  644. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/langchain/test_loader.py +0 -0
  645. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/langchain/test_retriever.py +0 -0
  646. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/make_fixture.py +0 -0
  647. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/perf/test_benchmarks.py +0 -0
  648. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/smoke.sh +0 -0
  649. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_a11y_check.py +0 -0
  650. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_action_pin_lockstep.py +0 -0
  651. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_adapters.py +0 -0
  652. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_adapters_multi.py +0 -0
  653. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_adapters_runner.py +0 -0
  654. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_agents.py +0 -0
  655. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_ai.py +0 -0
  656. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_aihost.py +0 -0
  657. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_bmad_core.py +0 -0
  658. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_boost_first_offer.py +0 -0
  659. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_bootstrap.py +0 -0
  660. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_branch_current.py +0 -0
  661. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_browse.py +0 -0
  662. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_builtin.py +0 -0
  663. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_capabilities.py +0 -0
  664. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_catalog.py +0 -0
  665. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_catalogbundle.py +0 -0
  666. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_chat.py +0 -0
  667. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_check_anchors.py +0 -0
  668. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_check_dco.py +0 -0
  669. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_check_licenses.py +0 -0
  670. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_check_reproducible.py +0 -0
  671. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_claude_settings.py +0 -0
  672. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_clean_internal_cache.py +0 -0
  673. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_cliparse.py +0 -0
  674. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_codeql_analysis_key.py +0 -0
  675. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_command_reference_fresh.py +0 -0
  676. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_community_health_files.py +0 -0
  677. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_compact.py +0 -0
  678. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_complete.py +0 -0
  679. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_complete_rc_block.py +0 -0
  680. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_config.py +0 -0
  681. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_content_dedupe.py +0 -0
  682. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_content_identity.py +0 -0
  683. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_crash_redaction.py +0 -0
  684. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dedup_trust.py +0 -0
  685. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_demo_index.py +0 -0
  686. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense.py +0 -0
  687. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense_embed_dedupe.py +0 -0
  688. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense_fallback.py +0 -0
  689. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense_fix_hint.py +0 -0
  690. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense_quantized.py +0 -0
  691. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense_ready_order.py +0 -0
  692. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense_shard_real_schema.py +0 -0
  693. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
  694. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense_shards.py +0 -0
  695. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense_status.py +0 -0
  696. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense_status_cheap.py +0 -0
  697. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dependabot_config.py +0 -0
  698. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_docs_pages_linked.py +0 -0
  699. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_docsite_chrome.py +0 -0
  700. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_ed25519.py +0 -0
  701. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_embed.py +0 -0
  702. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_embed_local.py +0 -0
  703. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_embed_truncated_response.py +0 -0
  704. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_entry_key.py +0 -0
  705. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_errors_and_cli_table.py +0 -0
  706. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_eval_baseline.py +0 -0
  707. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_eval_corpus.py +0 -0
  708. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_eval_faithfulness.py +0 -0
  709. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_eval_gate.py +0 -0
  710. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_eval_grading.py +0 -0
  711. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_eval_metrics.py +0 -0
  712. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_eval_stats_summary.py +0 -0
  713. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  714. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_faithfulness.py +0 -0
  715. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_frontmatter.py +0 -0
  716. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_fuzz_targets.py +0 -0
  717. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  718. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_gitleaks_config.py +0 -0
  719. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_gitutil.py +0 -0
  720. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_gitutil_lfs.py +0 -0
  721. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_gitutil_sparse.py +0 -0
  722. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_hook_settings_hosts.py +0 -0
  723. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_hookhost.py +0 -0
  724. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_imperative.py +0 -0
  725. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_import_budget.py +0 -0
  726. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_injectscan.py +0 -0
  727. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_install_permission_error.py +0 -0
  728. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_installscan.py +0 -0
  729. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_integrity.py +0 -0
  730. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_journal.py +0 -0
  731. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_langchain_packaging.py +0 -0
  732. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_link_ownership.py +0 -0
  733. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_localembed.py +0 -0
  734. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_localembed_e2e.py +0 -0
  735. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_lockfile.py +0 -0
  736. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_logs.py +0 -0
  737. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_marketing_counts.py +0 -0
  738. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_mcp.py +0 -0
  739. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_mcp_install_scan.py +0 -0
  740. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_mcpdecl.py +0 -0
  741. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_mcphost.py +0 -0
  742. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_measure_registry.py +0 -0
  743. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_minisign.py +0 -0
  744. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_mutation_hardening.py +0 -0
  745. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_mutation_shards.py +0 -0
  746. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_mutation_subfile_shards.py +0 -0
  747. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_mutmut_source_paths.py +0 -0
  748. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_nethttp.py +0 -0
  749. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_normalize_sdist.py +0 -0
  750. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_output.py +0 -0
  751. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_page_budget.py +0 -0
  752. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_paths.py +0 -0
  753. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_perf_gate.py +0 -0
  754. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_pkg_confusions.py +0 -0
  755. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_pkg_injection.py +0 -0
  756. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_pkg_secrets.py +0 -0
  757. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_platform_pins.py +0 -0
  758. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_policy.py +0 -0
  759. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_post_deploy_smoke.py +0 -0
  760. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_project_mcp_sidecar.py +0 -0
  761. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_projectlock.py +0 -0
  762. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_provenance.py +0 -0
  763. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_publish_golden_dataset.py +0 -0
  764. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_rag.py +0 -0
  765. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_rag_fastpath.py +0 -0
  766. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_rag_fusion.py +0 -0
  767. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_registries_fresh.py +0 -0
  768. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_registry.py +0 -0
  769. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_registry_categories.py +0 -0
  770. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_registry_control_chars.py +0 -0
  771. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_registry_parallel.py +0 -0
  772. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_release_guard.py +0 -0
  773. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_release_preflight.py +0 -0
  774. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_required_checks.py +0 -0
  775. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_rerank_cache.py +0 -0
  776. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_resolve.py +0 -0
  777. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_roadmap_fresh.py +0 -0
  778. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_rules.py +0 -0
  779. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_scale_corpus.py +0 -0
  780. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_scopes.py +0 -0
  781. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_secretscan.py +0 -0
  782. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_selfupdate.py +0 -0
  783. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_serve.py +0 -0
  784. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_serve_docs.py +0 -0
  785. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_shards.py +0 -0
  786. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_smoke_covers_every_command.py +0 -0
  787. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_spdx_headers.py +0 -0
  788. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_spin.py +0 -0
  789. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_stackprobe.py +0 -0
  790. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_staleness.py +0 -0
  791. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_store.py +0 -0
  792. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_store_materialize.py +0 -0
  793. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_sync_blocked_links.py +0 -0
  794. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  795. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_token_parity.py +0 -0
  796. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_toolchain_lock.py +0 -0
  797. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_trustaudit.py +0 -0
  798. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_typosquat.py +0 -0
  799. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_updatediff.py +0 -0
  800. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_util.py +0 -0
  801. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_version.py +0 -0
  802. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_vex.py +0 -0
  803. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_visual_harness_flags.py +0 -0
  804. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_workflow_concurrency.py +0 -0
  805. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  806. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  807. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_workflow_timeouts.py +0 -0
  808. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_workflows.py +0 -0
  809. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  810. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/visual/a11y_check.mjs +0 -0
  811. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/visual/console_check.mjs +0 -0
  812. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/visual/package-lock.json +0 -0
  813. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/visual/package.json +0 -0
  814. {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/visual/visual_check.mjs +0 -0
@@ -185,7 +185,16 @@ line coverage. Target `boost_cli/core` behavior with assertions, not just import
185
185
  `HOME`/`BOOST_HOME`; tests point them at a tempdir. In zsh, one-line chains
186
186
  like `export A=$(...) B=$A/x` leave `B` broken — use separate `export`
187
187
  statements.
188
- - **Versioning is setuptools-scm from git tags.** There is no `__version__`
188
+ - **Versioning is setuptools-scm from git tags.** **Only `vX.Y.Z` tags count**, and
189
+ two settings say so: `git_describe_command`'s `--match v[0-9]*` decides which
190
+ tag is *found* and `tag_regex` decides how it is *parsed*. Both are load-
191
+ bearing since the repo gained a deliberate non-version tag — `shards-latest`,
192
+ the rolling release hosting the vector shards. At defaults, `git describe`
193
+ returned `shards-latest-1-g82c3e6a`, the build called itself
194
+ `vshards-latest-…`, and `boost self-update` then reported "already up to
195
+ date" against a newer PyPI release, because it compares version tuples and
196
+ that string parses as none. A silent wrong answer in the command whose job is
197
+ to detect being behind. There is no `__version__`
189
198
  constant and `boost_cli/_version.py` is generated + gitignored. Don't hardcode
190
199
  or assert exact versions; version tests are shape-only (`^boost \S+$`). The
191
200
  publish workflow filename must stay `publish.yml` (PyPI Trusted Publisher
@@ -435,6 +444,33 @@ of the three item kinds (see Non-obvious rules above); `core/store.py` owns
435
444
  install, uninstall and sync — copying into the canonical store, symlinking into
436
445
  each agent's skills dir, and updating the lock file.
437
446
 
447
+ - **A tap pin lives in `config.json`, and `boost update` is what makes it real.**
448
+ `boost tap --at <sha>` used to check a commit out and record nothing, so the
449
+ next `boost update` reset the clone to the default branch — measured on a
450
+ two-commit fixture: tapped at `fb61736`, updated, `6206d22`. That silently
451
+ invalidates any shard imported for the old commit (stale vectors, still
452
+ present, no error), which is also the reason **search must never refresh taps
453
+ in the background**: `_hint_stale_taps` reads one mtime
454
+ (`paths.tap_refresh_marker`, stamped by `registry.update`) and prints one
455
+ line rather than fetching. `registry.update` skips a pinned tap; `--force`
456
+ moves it *and* drops the pin, because deciding to move a tap is deciding to
457
+ stop holding it still. After any tap actually moves, `pkg._resync_vectors`
458
+ asks the manifest whether a shard exists for the new commit — importing it
459
+ costs a download instead of an hour of CPU — and says plainly when one does
460
+ not.
461
+
462
+ - **The shard matrix is packed, not sliced, and 256 is a hard ceiling.**
463
+ GitHub runs at most 256 matrix jobs per workflow, so `shards.yml` cannot take
464
+ one job per registry once the scope is the 463-registry catalogue — the run
465
+ fails before a job starts. `scripts/shard_plan.py` bin-packs by the measured
466
+ `est_items` (longest-processing-time-first), which matters because cost is
467
+ uneven: the largest catalogued registry is 880 items against a median of 30,
468
+ so slicing puts several giants in one job while others idle, against a
469
+ 6-hour per-job ceiling. Packing is deterministic on purpose — a rerun that
470
+ repacked differently would re-embed registries whose shards were already
471
+ published. A matrix entry is a **space-separated list**, split in Python
472
+ inside the job, never by shell word-splitting.
473
+
438
474
  - **A published shard is only importable while three things match, and every
439
475
  mismatch is silent if waved through.** `core/shards.py` fetches
440
476
  `manifest.json` from a rolling `shards-latest` **prerelease** on this repo —
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.47
3
+ Version: 1.2.49
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License-Expression: Apache-2.0
@@ -186,8 +186,21 @@ those vectors. Embedding is ~1.2 s/chunk on CPU — hours for a real corpus —
186
186
  and importing the same rows takes 0.12 s, so the difference between the two is
187
187
  the difference between semantic search being available and being reachable.
188
188
 
189
+ Want everything? `boost quickstart --catalog` taps all 463 catalogued
190
+ registries — 2 min 10 s now that clones run in parallel — and fetches vectors
191
+ for every one that has a published shard.
192
+
189
193
  Already tapped? `boost reindex --fetch-shards` does the download half alone,
190
194
  and `boost reindex --dense` embeds locally whatever has no published shard.
195
+
196
+ Because vectors are keyed to a registry's commit, `quickstart` **pins** each tap
197
+ it fetches vectors for, and `boost update` skips a pinned tap rather than moving
198
+ it out from under them (`--force` moves it anyway and drops the pin). When a tap
199
+ does move, boost checks whether a newer shard exists for the new commit and
200
+ imports it; if none does, it says so instead of leaving stale vectors looking
201
+ fresh. `boost search` never refreshes taps behind your back — it prints one line
202
+ when they are more than two weeks old and leaves the fetching to
203
+ `boost update --taps-only`.
191
204
  Every download is checked against the sha256 in the manifest and refused on a
192
205
  mismatch, and shards for a registry that has moved since publication are
193
206
  refused rather than merged — stale vectors would otherwise look fresh forever.
@@ -144,8 +144,21 @@ those vectors. Embedding is ~1.2 s/chunk on CPU — hours for a real corpus —
144
144
  and importing the same rows takes 0.12 s, so the difference between the two is
145
145
  the difference between semantic search being available and being reachable.
146
146
 
147
+ Want everything? `boost quickstart --catalog` taps all 463 catalogued
148
+ registries — 2 min 10 s now that clones run in parallel — and fetches vectors
149
+ for every one that has a published shard.
150
+
147
151
  Already tapped? `boost reindex --fetch-shards` does the download half alone,
148
152
  and `boost reindex --dense` embeds locally whatever has no published shard.
153
+
154
+ Because vectors are keyed to a registry's commit, `quickstart` **pins** each tap
155
+ it fetches vectors for, and `boost update` skips a pinned tap rather than moving
156
+ it out from under them (`--force` moves it anyway and drops the pin). When a tap
157
+ does move, boost checks whether a newer shard exists for the new commit and
158
+ imports it; if none does, it says so instead of leaving stale vectors looking
159
+ fresh. `boost search` never refreshes taps behind your back — it prints one line
160
+ when they are more than two weeks old and leaves the fetching to
161
+ `boost update --taps-only`.
149
162
  Every download is checked against the sha256 in the manifest and refused on a
150
163
  mismatch, and shards for a registry that has moved since publication are
151
164
  refused rather than merged — stale vectors would otherwise look fresh forever.
@@ -21,8 +21,16 @@ def _detect_version() -> str:
21
21
  import subprocess
22
22
  from pathlib import Path
23
23
  root = Path(__file__).resolve().parent.parent
24
+ # `--match v[0-9]*`, exactly as pyproject's git_describe_command:
25
+ # the repo carries a deliberate non-version tag (`shards-latest`, the
26
+ # rolling release hosting the vector shards), and without the match
27
+ # this fallback served `shards-latest-3-g…` as the version — which
28
+ # parses as no version at all, so `self-update` compared nothing and
29
+ # answered "already up to date" while a newer release existed.
30
+ # `--always` still yields a bare SHA when no version tag is reachable.
24
31
  proc = subprocess.run(
25
- ["git", "-C", str(root), "describe", "--tags", "--always", "--dirty"],
32
+ ["git", "-C", str(root), "describe", "--tags", "--always",
33
+ "--dirty", "--match", "v[0-9]*"],
26
34
  capture_output=True, text=True, timeout=3)
27
35
  described = proc.stdout.strip()
28
36
  if proc.returncode == 0 and described:
@@ -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.47'
22
- __version_tuple__ = version_tuple = (1, 2, 47)
21
+ __version__ = version = '1.2.49'
22
+ __version_tuple__ = version_tuple = (1, 2, 49)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -141,6 +141,9 @@ def cmd_search(argv):
141
141
  "no matches for %r" % query,
142
142
  "try `boost discover %s` to search all of GitHub" % query))
143
143
  _hint_semantic_search(engine)
144
+ # Especially here: "no matches" is exactly the answer an out-of-date
145
+ # tap set produces, and the user has no other way to suspect it.
146
+ _hint_stale_taps()
144
147
  return 0
145
148
  # The CLI's long-standing wording for the BM25 engine differs from the label
146
149
  # rag/eval use ("BM25 full-content"), and both are load-bearing: the latter
@@ -180,6 +183,7 @@ def cmd_search(argv):
180
183
  if use_rag:
181
184
  _note_stem_expansions(query)
182
185
  _hint_semantic_search(engine)
186
+ _hint_stale_taps()
183
187
  return 0
184
188
 
185
189
 
@@ -200,6 +204,28 @@ def _note_stem_expansions(query: str) -> None:
200
204
  max(0, out.term_width() - 2)), "muted"))
201
205
 
202
206
 
207
+ def _hint_stale_taps() -> None:
208
+ """Mention old tap clones. One `stat`, and never a network call.
209
+
210
+ Search deliberately does not refresh the taps themselves. A refresh is a
211
+ `git fetch` per tap — ~1.6 s each, minutes across a real install — so doing
212
+ it inline would turn a sub-second command into a wait, and doing it in the
213
+ background would mean unannounced network egress plus writes to the very
214
+ caches the search is reading. Worse, a tap's commit is load-bearing for
215
+ dense vectors, so a silent update would strand imported shards as stale.
216
+
217
+ So: say it, do not do it. The marker's mtime answers "how long ago" for the
218
+ price of one stat, and a machine that has never refreshed says nothing at
219
+ all rather than inventing an age.
220
+ """
221
+ age = registry.refresh_age_days()
222
+ if age is None or age < registry.STALE_TAPS_DAYS:
223
+ return
224
+ out.info(out.role(
225
+ "taps last refreshed %d days ago — `boost update --taps-only`"
226
+ % int(age), "muted"))
227
+
228
+
203
229
  def _hint_semantic_search(engine: str) -> None:
204
230
  """Say that a better engine exists, when BM25 answered alone.
205
231
 
@@ -31,6 +31,7 @@ from ..core import (
31
31
  lockfile,
32
32
  paths,
33
33
  projectlock,
34
+ rag,
34
35
  registry,
35
36
  resolve,
36
37
  scopes,
@@ -835,6 +836,48 @@ def _update_materialized(kind: str, installed: dict[str, dict], results) -> int:
835
836
  return n
836
837
 
837
838
 
839
+ def _resync_vectors(moved: list[str]) -> None:
840
+ """Keep prebuilt vectors honest after the taps underneath them move.
841
+
842
+ A tap's commit is load-bearing for dense search: `dense.build` marks a tap
843
+ "reused" per commit and `import_shard` refuses a shard built for another
844
+ one. So an update that moves a tap leaves its vectors stale *but present* —
845
+ the failure mode that looks like nothing at all, and the reason auto-
846
+ updating taps in the background would quietly undo a shard import.
847
+
848
+ Two outcomes are worth the network: a newer shard exists for the commit the
849
+ tap just moved to, in which case importing it costs a download instead of
850
+ an hour of CPU; or one does not, in which case the honest thing is to say
851
+ the vectors are now stale and name the command that rebuilds them.
852
+ """
853
+ if not moved:
854
+ return
855
+ from ..core import dense, shards
856
+ if not dense.ready():
857
+ return # nothing embedded here to invalidate
858
+ try:
859
+ manifest = shards.fetch_manifest()
860
+ except BoostError:
861
+ # Offline, or no manifest published. The vectors are still stale, and
862
+ # saying so without the remedy we could not check for is enough.
863
+ out.info(out.role("prebuilt vectors for %d refreshed tap(s) are now "
864
+ "stale — `boost reindex --dense` rebuilds them"
865
+ % len(moved), "muted"))
866
+ return
867
+ commits = rag._tap_commits()
868
+ by_name = {t.name: commits.get(t.safe_name, "")
869
+ for t in registry.list_taps() if t.name in moved}
870
+ got = [r for r in shards.sync(list(by_name), by_name, manifest=manifest)
871
+ if r["status"] == "imported"]
872
+ if got:
873
+ out.ok("re-imported prebuilt vectors for %d tap(s)" % len(got))
874
+ left = len(moved) - len(got)
875
+ if left:
876
+ out.info(out.role("%d refreshed tap(s) have no matching shard yet — "
877
+ "their vectors are stale until "
878
+ "`boost reindex --dense`" % left, "muted"))
879
+
880
+
838
881
  def cmd_update(argv: list[str]) -> int:
839
882
  ap = cliparse.parser(prog="boost update",
840
883
  description="Sync taps or update installed skills")
@@ -849,14 +892,23 @@ def cmd_update(argv: list[str]) -> int:
849
892
  # sys.argv, so this makes the printed advice true rather than adding a path.
850
893
  ap.add_argument("-y", "--yes", action="store_true",
851
894
  help="skip the confirmation prompt")
895
+ ap.add_argument("--force", action="store_true",
896
+ help="move pinned taps too, clearing their pin")
852
897
  args = ap.parse_args(argv)
853
- results, failures = registry.update(args.tap or None)
898
+ results, failures = registry.update(args.tap or None, force=args.force)
854
899
  if not results and not failures:
855
900
  out.info("no taps configured — start with `boost tap --defaults`")
856
901
  return 0
902
+ moved = []
857
903
  for tname, summary in results.items():
858
- catalog.rebuild_tap(registry.get(tname))
904
+ if "skipped" not in summary:
905
+ catalog.rebuild_tap(registry.get(tname))
906
+ # "abc1234 → def5678" is a tap whose tree changed; "already up to date"
907
+ # and "pinned at ..." are not. Only the first invalidates vectors.
908
+ if "→" in summary:
909
+ moved.append(tname)
859
910
  out.ok("%s: %s" % (tname, summary))
911
+ _resync_vectors(moved)
860
912
  # Report the dead ones by name, after the successes, so a broken upstream
861
913
  # reads as one line of bad news rather than as the whole command failing.
862
914
  for tname, err in failures.items():
@@ -32,19 +32,43 @@ from ..core import output as out
32
32
  from ..errors import BoostError
33
33
 
34
34
 
35
- def _tap_defaults(pins: dict[str, dict], dry_run: bool) -> list[str]:
36
- """Tap the default registries, pinned to a shard's commit when one exists.
35
+ def _selection(catalog_scope: bool) -> list[dict]:
36
+ """The registries quickstart will tap: the seven defaults, or all of them.
37
+
38
+ `--catalog` exists because "search everything" is a real ask and the two
39
+ costs that used to make it unreasonable are gone: tapping 463 registries is
40
+ 2 min 10 s now that clones run in parallel, and their vectors are a
41
+ download rather than an hour of CPU.
42
+ """
43
+ if not catalog_scope:
44
+ return [d.copy() for d in config.DEFAULT_TAPS]
45
+ return [{"name": e["name"], "url": e["url"]}
46
+ for e in config.load_registry_catalog()
47
+ if not e.get("list_only") and e.get("name") and e.get("url")]
48
+
49
+
50
+ def _tap_defaults(selection: list[dict], pins: dict[str, dict],
51
+ dry_run: bool) -> list[str]:
52
+ """Tap the selected registries, pinned to a shard's commit when one exists.
37
53
 
38
54
  Returns the tap names that are configured afterwards, tapped here or not.
39
55
  Pinning is the whole point: tapping HEAD and then fetching a shard is the
40
56
  ordering that produces a commit mismatch on every registry that moved since
41
57
  the last shard run.
42
58
  """
43
- names = [str(d["name"]) for d in config.DEFAULT_TAPS]
59
+ names = [str(d["name"]) for d in selection]
44
60
  commits = {name: str(pins[name].get("commit")) for name in names
45
61
  if name in pins}
46
62
  if dry_run:
47
63
  existing = {t.name for t in registry.list_taps()}
64
+ pending = [n for n in names if n not in existing]
65
+ # Over 463 registries a line each is a wall of text, so past a handful
66
+ # the dry run reports the shape instead of the list.
67
+ if len(pending) > 12:
68
+ out.info("would tap %d registries (%d pinned to a published "
69
+ "shard's commit)"
70
+ % (len(pending), sum(1 for n in pending if n in commits)))
71
+ return names
48
72
  for name in names:
49
73
  if name in existing:
50
74
  out.info(out.role("%s already tapped" % name, "muted"))
@@ -56,7 +80,7 @@ def _tap_defaults(pins: dict[str, dict], dry_run: bool) -> list[str]:
56
80
  # for work that takes ~2 s done together, and the first thing a new user
57
81
  # sees should not be a progress bar.
58
82
  with spin.Spinner("tapping %d registries" % len(names)):
59
- results = registry.add_many([str(d["url"]) for d in config.DEFAULT_TAPS],
83
+ results = registry.add_many([str(d["url"]) for d in selection],
60
84
  curated=True, pins=commits)
61
85
  for res in results:
62
86
  name = res["name"]
@@ -104,10 +128,13 @@ def _report(results: list[dict]) -> None:
104
128
 
105
129
 
106
130
  def cmd_quickstart(argv) -> int:
107
- """boost quickstart [--no-vectors] [--dry-run]"""
131
+ """boost quickstart [--catalog] [--no-vectors] [--dry-run]"""
108
132
  p = cliparse.parser(
109
133
  prog="boost quickstart",
110
134
  description="Tap the starter registries and load prebuilt vectors")
135
+ p.add_argument("--catalog", action="store_true",
136
+ help="tap every catalogued registry, not just the 7 "
137
+ "starters, and fetch vectors for all of them")
111
138
  p.add_argument("--no-vectors", action="store_true",
112
139
  help="set up taps and keyword search only, skip shards")
113
140
  p.add_argument("--dry-run", action="store_true",
@@ -129,7 +156,8 @@ def cmd_quickstart(argv) -> int:
129
156
  out.warn("no published shards: %s" % exc.message)
130
157
  manifest = None
131
158
 
132
- names = _tap_defaults(pins, args.dry_run)
159
+ selection = _selection(args.catalog)
160
+ names = _tap_defaults(selection, pins, args.dry_run)
133
161
  if args.dry_run:
134
162
  planned = [n for n in names if n in pins] if manifest else []
135
163
  out.info("would build the keyword index, then import %d shard(s)"
@@ -226,7 +226,8 @@ def cmd_taps(argv) -> int:
226
226
  skills = catalog.load_tap(tap)
227
227
  total += len(skills)
228
228
  taps.append({"name": tap.name, "url": tap.url, "curated": tap.curated,
229
- "skills": len(skills), "updated": _tap_updated(tap)})
229
+ "skills": len(skills), "updated": _tap_updated(tap),
230
+ "pin": tap.pin})
230
231
  if args.json:
231
232
  print(json.dumps(taps, indent=2))
232
233
  return 0
@@ -234,7 +235,12 @@ def cmd_taps(argv) -> int:
234
235
  out.info("no taps configured")
235
236
  out.info(out.role("add the recommended registries with `boost tap --defaults`", "muted"))
236
237
  return 0
237
- rows = [(t["name"], str(t["skills"]), t["updated"],
238
+ # A pinned tap reads as its commit rather than its date: the date of a
239
+ # clone held still is not what the user needs to know about it, and a tap
240
+ # that `boost update` deliberately skips should say why on the line the
241
+ # user is already reading.
242
+ rows = [(t["name"], str(t["skills"]),
243
+ "@%s" % str(t["pin"])[:7] if t["pin"] else t["updated"],
238
244
  "★" if t["curated"] else "", out.role(_tilde(t["url"]), "muted"))
239
245
  for t in taps]
240
246
  out.table(rows, headers=("NAME", "SKILLS", "UPDATED", "", "URL"))
@@ -103,6 +103,16 @@ def state_dir() -> Path:
103
103
  return boost_home() / "state"
104
104
 
105
105
 
106
+ def tap_refresh_marker() -> Path:
107
+ """File whose mtime records when the taps were last refreshed.
108
+
109
+ An mtime rather than a JSON field: the only question asked of it is "how
110
+ long ago", on the search path, where one `stat` is affordable and parsing
111
+ anything is not.
112
+ """
113
+ return state_dir() / "last-tap-refresh"
114
+
115
+
106
116
  def snapshots_dir() -> Path:
107
117
  """Return the directory for ``snap-*`` store snapshot tarballs."""
108
118
  return state_dir() / "snapshots"
@@ -5,6 +5,7 @@ from __future__ import annotations
5
5
 
6
6
  import difflib
7
7
  import os
8
+ import time
8
9
  from concurrent.futures import ThreadPoolExecutor
9
10
  from contextlib import suppress
10
11
  from dataclasses import dataclass
@@ -20,6 +21,12 @@ class Tap:
20
21
  name: str # "anthropics/skills" or a short alias
21
22
  url: str # https URL or local path
22
23
  curated: bool = False
24
+ #: A 40-character commit this tap is held at, or "" for "track the default
25
+ #: branch". A pin is durable *because it is recorded here*: `tap --at`
26
+ #: checked a commit out and nothing remembered, so the next `boost update`
27
+ #: moved the clone to HEAD — silently invalidating any prebuilt vectors
28
+ #: imported for that commit, which is the whole reason the pin exists.
29
+ pin: str = ""
23
30
 
24
31
  @property
25
32
  def safe_name(self) -> str:
@@ -131,7 +138,8 @@ def list_taps() -> list[Tap]:
131
138
  taps = config.get("taps", []) or []
132
139
  if not isinstance(taps, list):
133
140
  return []
134
- return [Tap(name=t["name"], url=t.get("url", ""), curated=bool(t.get("curated")))
141
+ return [Tap(name=t["name"], url=t.get("url", ""),
142
+ curated=bool(t.get("curated")), pin=str(t.get("pin") or ""))
135
143
  for t in taps if isinstance(t, dict) and t.get("name")]
136
144
 
137
145
 
@@ -203,9 +211,12 @@ def add(spec: str, curated: bool = False, at: str | None = None) -> Tap:
203
211
  hint="add its key with `boost trust add <name> <key>`, "
204
212
  "or relax `boost policy set require_signed_taps false`")
205
213
  cfg = config.load()
206
- cfg.setdefault("taps", []).append(
207
- {"name": name, "url": url, "curated": curated})
214
+ row = {"name": name, "url": url, "curated": curated}
215
+ if at:
216
+ row["pin"] = at
217
+ cfg.setdefault("taps", []).append(row)
208
218
  config.save(cfg)
219
+ tap.pin = at or ""
209
220
  return tap
210
221
 
211
222
 
@@ -336,8 +347,12 @@ def add_many(specs: list[str], curated: bool = False,
336
347
  cfg = config.load()
337
348
  rows = cfg.setdefault("taps", [])
338
349
  for r in fresh:
339
- rows.append({"name": r["name"], "url": r["url"],
340
- "curated": curated})
350
+ row = {"name": r["name"], "url": r["url"], "curated": curated}
351
+ pin = pins.get(r["name"])
352
+ if pin:
353
+ row["pin"] = pin
354
+ r["tap"].pin = pin
355
+ rows.append(row)
341
356
  config.save(cfg)
342
357
  # First occurrence, not last: a dict comprehension over `specs` keeps the
343
358
  # LAST index for a repeated spec, which pushed the duplicate — and so its
@@ -352,6 +367,58 @@ def add_many(specs: list[str], curated: bool = False,
352
367
  return results
353
368
 
354
369
 
370
+ #: How long a tap set may go unrefreshed before `boost search` mentions it.
371
+ #: Two weeks rather than days: registries move slowly, and a hint that fires
372
+ #: every other search is one users learn to read past.
373
+ STALE_TAPS_DAYS = 14
374
+
375
+
376
+ def mark_refreshed() -> None:
377
+ """Stamp "the taps were refreshed just now"; never fails a refresh."""
378
+ with suppress(OSError):
379
+ paths.ensure_dirs()
380
+ paths.tap_refresh_marker().write_text("", encoding="utf-8")
381
+
382
+
383
+ def refresh_age_days() -> float | None:
384
+ """Days since the last tap refresh, or None when nothing has recorded one.
385
+
386
+ None is not zero and not infinity: on a machine that has never run
387
+ `boost update` there is nothing to report, and inventing an age would make
388
+ every fresh install nag about staleness on its first search.
389
+ """
390
+ marker = paths.tap_refresh_marker()
391
+ try:
392
+ age = time.time() - marker.stat().st_mtime
393
+ except OSError:
394
+ return None
395
+ return max(0.0, age / 86400.0)
396
+
397
+
398
+ def pin(name: str, commit: str) -> Tap:
399
+ """Record `commit` as the tap's pin, so `update` leaves it alone."""
400
+ tap = get(name)
401
+ cfg = config.load()
402
+ for row in cfg.get("taps", []) or []:
403
+ if isinstance(row, dict) and row.get("name") == tap.name:
404
+ row["pin"] = commit
405
+ config.save(cfg)
406
+ tap.pin = commit
407
+ return tap
408
+
409
+
410
+ def unpin(name: str) -> Tap:
411
+ """Drop a tap's pin so it tracks its default branch again."""
412
+ tap = get(name)
413
+ cfg = config.load()
414
+ for row in cfg.get("taps", []) or []:
415
+ if isinstance(row, dict) and row.get("name") == tap.name:
416
+ row.pop("pin", None)
417
+ config.save(cfg)
418
+ tap.pin = ""
419
+ return tap
420
+
421
+
355
422
  def remove(name: str) -> Tap:
356
423
  """Deregister a tap and delete its clone and cache file.
357
424
 
@@ -374,9 +441,14 @@ def remove(name: str) -> Tap:
374
441
  WHEEL_SCHEME = "builtin:"
375
442
 
376
443
 
377
- def update(name: str | None = None) -> tuple[dict, dict]:
444
+ def update(name: str | None = None,
445
+ force: bool = False) -> tuple[dict, dict]:
378
446
  """git-pull one tap (or all). Returns ``({name: summary}, {name: error})``.
379
447
 
448
+ **A pinned tap is skipped** unless ``force``, which also clears the pin —
449
+ an update that silently moved a pinned clone is what made `tap --at` a
450
+ suggestion rather than a guarantee.
451
+
380
452
  **A named tap still raises.** ``boost update sometap`` is a request about
381
453
  that one tap, so its failure is the answer to the question asked.
382
454
 
@@ -395,6 +467,14 @@ def update(name: str | None = None) -> tuple[dict, dict]:
395
467
  results: dict = {}
396
468
  failures: dict = {}
397
469
  for tap in targets:
470
+ if tap.pin and not force:
471
+ # A pinned tap is held at one commit on purpose: prebuilt vectors
472
+ # are keyed to it, and moving the clone would make them stale while
473
+ # still present — the failure that looks like nothing at all. Not
474
+ # an error, because "update everything" over 400 taps should not
475
+ # fail because three are pinned.
476
+ results[tap.name] = "pinned at %s (skipped)" % tap.pin[:7]
477
+ continue
398
478
  try:
399
479
  if tap.url.startswith(WHEEL_SCHEME):
400
480
  # boost's own tap arrives with the wheel, so there is no remote
@@ -414,6 +494,11 @@ def update(name: str | None = None) -> tuple[dict, dict]:
414
494
  results[tap.name] = "cloned"
415
495
  else:
416
496
  results[tap.name] = gitutil.pull(tap.path)
497
+ if tap.pin:
498
+ # `--force` is a decision to stop holding this tap still,
499
+ # so the pin goes with the move rather than silently
500
+ # re-applying on the next run.
501
+ unpin(tap.name)
417
502
  except BoostError as err:
418
503
  if name:
419
504
  raise
@@ -421,4 +506,9 @@ def update(name: str | None = None) -> tuple[dict, dict]:
421
506
  # says; git's own first line already carries the URL or path. See
422
507
  # gitutil._git_error for why that line is now the one we show.
423
508
  failures[tap.name] = err.message
509
+ if results:
510
+ # Stamped on any successful sweep, including one where every tap was
511
+ # already current: "refreshed" is about having asked, not about having
512
+ # found something.
513
+ mark_refreshed()
424
514
  return results, failures
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.47
3
+ Version: 1.2.49
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License-Expression: Apache-2.0
@@ -186,8 +186,21 @@ those vectors. Embedding is ~1.2 s/chunk on CPU — hours for a real corpus —
186
186
  and importing the same rows takes 0.12 s, so the difference between the two is
187
187
  the difference between semantic search being available and being reachable.
188
188
 
189
+ Want everything? `boost quickstart --catalog` taps all 463 catalogued
190
+ registries — 2 min 10 s now that clones run in parallel — and fetches vectors
191
+ for every one that has a published shard.
192
+
189
193
  Already tapped? `boost reindex --fetch-shards` does the download half alone,
190
194
  and `boost reindex --dense` embeds locally whatever has no published shard.
195
+
196
+ Because vectors are keyed to a registry's commit, `quickstart` **pins** each tap
197
+ it fetches vectors for, and `boost update` skips a pinned tap rather than moving
198
+ it out from under them (`--force` moves it anyway and drops the pin). When a tap
199
+ does move, boost checks whether a newer shard exists for the new commit and
200
+ imports it; if none does, it says so instead of leaving stale vectors looking
201
+ fresh. `boost search` never refreshes taps behind your back — it prints one line
202
+ when they are more than two weeks old and leaves the fetching to
203
+ `boost update --taps-only`.
191
204
  Every download is checked against the sha256 in the manifest and refused on a
192
205
  mismatch, and shards for a registry that has moved since publication are
193
206
  refused rather than merged — stale vectors would otherwise look fresh forever.
@@ -553,6 +553,7 @@ scripts/publish_shards.py
553
553
  scripts/release_guard.py
554
554
  scripts/release_preflight.py
555
555
  scripts/serve_docs.py
556
+ scripts/shard_plan.py
556
557
  style/README.md
557
558
  style/boost.css
558
559
  style/boost.js
@@ -599,6 +600,7 @@ tests/functional/test_cli_pane_width.py
599
600
  tests/functional/test_cli_pkg.py
600
601
  tests/functional/test_cli_quality.py
601
602
  tests/functional/test_cli_quickstart.py
603
+ tests/functional/test_cli_tap_pins.py
602
604
  tests/functional/test_cli_taps.py
603
605
  tests/functional/test_cli_team.py
604
606
  tests/functional/test_everyday_loop.py
@@ -775,6 +777,7 @@ tests/unit/test_secretscan.py
775
777
  tests/unit/test_selfupdate.py
776
778
  tests/unit/test_serve.py
777
779
  tests/unit/test_serve_docs.py
780
+ tests/unit/test_shard_plan.py
778
781
  tests/unit/test_shards.py
779
782
  tests/unit/test_shards_matrix.py
780
783
  tests/unit/test_smoke_covers_every_command.py
@@ -786,6 +789,7 @@ tests/unit/test_store.py
786
789
  tests/unit/test_store_materialize.py
787
790
  tests/unit/test_sync_blocked_links.py
788
791
  tests/unit/test_sync_repairs_gutted_skill.py
792
+ tests/unit/test_tap_pins.py
789
793
  tests/unit/test_token_parity.py
790
794
  tests/unit/test_toolchain_lock.py
791
795
  tests/unit/test_trustaudit.py
@@ -793,6 +797,7 @@ tests/unit/test_typosquat.py
793
797
  tests/unit/test_updatediff.py
794
798
  tests/unit/test_util.py
795
799
  tests/unit/test_version.py
800
+ tests/unit/test_version_tags.py
796
801
  tests/unit/test_vex.py
797
802
  tests/unit/test_visual_harness_flags.py
798
803
  tests/unit/test_workflow_concurrency.py