boost-skill-cli 1.2.48__tar.gz → 1.2.50__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.48 → boost_skill_cli-1.2.50}/CLAUDE.md +22 -1
  2. {boost_skill_cli-1.2.48/boost_skill_cli.egg-info → boost_skill_cli-1.2.50}/PKG-INFO +5 -1
  3. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/README.md +4 -0
  4. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/__init__.py +9 -1
  5. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/_version.py +2 -2
  6. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/commands/configuration.py +61 -20
  7. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/commands/quickstart.py +34 -6
  8. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50/boost_skill_cli.egg-info}/PKG-INFO +5 -1
  9. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_skill_cli.egg-info/SOURCES.txt +3 -0
  10. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/commands.html +4 -3
  11. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/semantic-search.md +7 -0
  12. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/pyproject.toml +15 -0
  13. boost_skill_cli-1.2.50/scripts/shard_plan.py +146 -0
  14. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/bdd/features/mcp.feature +2 -1
  15. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_cli_configuration.py +73 -2
  16. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_cli_quickstart.py +32 -0
  17. boost_skill_cli-1.2.50/tests/unit/test_shard_plan.py +125 -0
  18. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_shards_matrix.py +33 -7
  19. boost_skill_cli-1.2.50/tests/unit/test_version_tags.py +104 -0
  20. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/.gitattributes +0 -0
  21. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/.gitignore +0 -0
  22. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/.gitleaks.toml +0 -0
  23. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/.htmlvalidate.json +0 -0
  24. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/.lighthouserc.json +0 -0
  25. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/.lycheeignore +0 -0
  26. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/.markdownlint-cli2.jsonc +0 -0
  27. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/.pre-commit-config.yaml +0 -0
  28. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/.stylelintrc.json +0 -0
  29. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/.vale/styles/boost/AIWriting.yml +0 -0
  30. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/.vale/styles/boost/Terminology.yml +0 -0
  31. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  32. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/.vale.ini +0 -0
  33. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/CODE_OF_CONDUCT.md +0 -0
  34. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/CONTRIBUTING.md +0 -0
  35. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/DCO +0 -0
  36. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/GOVERNANCE.md +0 -0
  37. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/LICENSE +0 -0
  38. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/MAINTAINERS.md +0 -0
  39. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/MANIFEST.in +0 -0
  40. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/Makefile +0 -0
  41. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/SECURITY.md +0 -0
  42. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/SUPPORT.md +0 -0
  43. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost +0 -0
  44. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/__main__.py +0 -0
  45. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/cli.py +0 -0
  46. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/cliparse.py +0 -0
  47. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/commands/__init__.py +0 -0
  48. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/commands/_common.py +0 -0
  49. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/commands/bmad.py +0 -0
  50. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/commands/discovery.py +0 -0
  51. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/commands/hooks.py +0 -0
  52. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/commands/info.py +0 -0
  53. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/commands/intelligence.py +0 -0
  54. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/commands/pkg.py +0 -0
  55. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/commands/quality.py +0 -0
  56. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/commands/run.py +0 -0
  57. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/commands/safety.py +0 -0
  58. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/commands/taps.py +0 -0
  59. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/commands/team.py +0 -0
  60. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/__init__.py +0 -0
  61. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/adapters.py +0 -0
  62. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/agents.py +0 -0
  63. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/ai.py +0 -0
  64. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/aihost.py +0 -0
  65. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/bmad.py +0 -0
  66. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/bootstrap.py +0 -0
  67. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/browse.py +0 -0
  68. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/builtin.py +0 -0
  69. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/capabilities.py +0 -0
  70. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/catalog.py +0 -0
  71. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/catalogbundle.py +0 -0
  72. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/chat.py +0 -0
  73. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/claude_settings.py +0 -0
  74. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/complete.py +0 -0
  75. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/config.py +0 -0
  76. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/dense.py +0 -0
  77. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/ed25519.py +0 -0
  78. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/embed.py +0 -0
  79. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/faithfulness.py +0 -0
  80. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/frontmatter.py +0 -0
  81. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/gitutil.py +0 -0
  82. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/hookhost.py +0 -0
  83. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/imperative.py +0 -0
  84. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/injectscan.py +0 -0
  85. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/installscan.py +0 -0
  86. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/integrity.py +0 -0
  87. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/journal.py +0 -0
  88. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/localembed.py +0 -0
  89. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/lockfile.py +0 -0
  90. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/logs.py +0 -0
  91. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/mcp.py +0 -0
  92. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/mcpdecl.py +0 -0
  93. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/mcphost.py +0 -0
  94. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/minisign.py +0 -0
  95. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/nethttp.py +0 -0
  96. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/output.py +0 -0
  97. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/paths.py +0 -0
  98. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/policy.py +0 -0
  99. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/projectlock.py +0 -0
  100. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/provenance.py +0 -0
  101. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/rag.py +0 -0
  102. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/registry.py +0 -0
  103. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/resolve.py +0 -0
  104. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/rules.py +0 -0
  105. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/scopes.py +0 -0
  106. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/secretscan.py +0 -0
  107. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/selfupdate.py +0 -0
  108. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/serve.py +0 -0
  109. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/shards.py +0 -0
  110. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/stackprobe.py +0 -0
  111. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/staleness.py +0 -0
  112. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/store.py +0 -0
  113. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/trustaudit.py +0 -0
  114. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/typosquat.py +0 -0
  115. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/updatediff.py +0 -0
  116. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/util.py +0 -0
  117. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/core/workflows.py +0 -0
  118. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/data/registries.json +0 -0
  119. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/data/rules/boost-first.mdc +0 -0
  120. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/errors.py +0 -0
  121. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_cli/spin.py +0 -0
  122. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_langchain/__init__.py +0 -0
  123. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_langchain/_compat.py +0 -0
  124. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_langchain/graph.py +0 -0
  125. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_langchain/loader.py +0 -0
  126. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_langchain/py.typed +0 -0
  127. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_langchain/retriever.py +0 -0
  128. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  129. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  130. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_skill_cli.egg-info/requires.txt +0 -0
  131. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/boost_skill_cli.egg-info/top_level.txt +0 -0
  132. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/codecov.yml +0 -0
  133. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/.claude/settings.local.json +0 -0
  134. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/DEBUGGING.md +0 -0
  135. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/adapters.html +0 -0
  136. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/architecture/README.md +0 -0
  137. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/architecture/c4-components-core.md +0 -0
  138. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/architecture/c4-containers.md +0 -0
  139. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/architecture/c4-context.md +0 -0
  140. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/architecture/c4-dynamic-install.md +0 -0
  141. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/bmad.md +0 -0
  142. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/carousel/gifs/distill.gif +0 -0
  143. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/carousel/gifs/doctor.gif +0 -0
  144. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/carousel/gifs/explain.gif +0 -0
  145. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/carousel/gifs/hooks.gif +0 -0
  146. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/carousel/gifs/install.gif +0 -0
  147. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/carousel/gifs/pulse.gif +0 -0
  148. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/carousel/gifs/search.gif +0 -0
  149. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/carousel/gifs/tap.gif +0 -0
  150. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/carousel/tapes/distill.tape +0 -0
  151. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/carousel/tapes/doctor.tape +0 -0
  152. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/carousel/tapes/explain.tape +0 -0
  153. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/carousel/tapes/hooks.tape +0 -0
  154. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/carousel/tapes/install.tape +0 -0
  155. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/carousel/tapes/pulse.tape +0 -0
  156. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/carousel/tapes/search.tape +0 -0
  157. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/carousel/tapes/tap.tape +0 -0
  158. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/carousel.html +0 -0
  159. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/chat.html +0 -0
  160. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/code-review.md +0 -0
  161. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/commit-audit.md +0 -0
  162. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/demo-index.json +0 -0
  163. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/demo.gif +0 -0
  164. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/demo.html +0 -0
  165. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/demo.tape +0 -0
  166. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/dependencies.md +0 -0
  167. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/design-roadmap.html +0 -0
  168. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/eval-latest.json +0 -0
  169. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/eval.html +0 -0
  170. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/index.html +0 -0
  171. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/langchain.html +0 -0
  172. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/mcp-hub.html +0 -0
  173. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/openssf-badge.md +0 -0
  174. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/openssf-playbook.md +0 -0
  175. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/rag-architecture.md +0 -0
  176. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D01.md +0 -0
  177. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D02.md +0 -0
  178. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D03.md +0 -0
  179. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D04.md +0 -0
  180. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D05.md +0 -0
  181. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D06.md +0 -0
  182. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D07.md +0 -0
  183. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D08.md +0 -0
  184. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D09.md +0 -0
  185. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D10.md +0 -0
  186. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D11.md +0 -0
  187. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D12.md +0 -0
  188. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D13.md +0 -0
  189. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D14.md +0 -0
  190. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D15.md +0 -0
  191. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D16.md +0 -0
  192. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D17.md +0 -0
  193. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D18.md +0 -0
  194. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D19.md +0 -0
  195. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D20.md +0 -0
  196. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D21.md +0 -0
  197. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D22.md +0 -0
  198. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D23.md +0 -0
  199. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D24.md +0 -0
  200. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D25.md +0 -0
  201. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D26.md +0 -0
  202. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/BOOST-D27.md +0 -0
  203. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  204. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  205. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  206. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  207. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  208. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/ai-backend-fanout.md +0 -0
  209. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  210. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  211. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  212. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  213. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  214. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
  215. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  216. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  217. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/bmad-hooks-all-hosts.md +0 -0
  218. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
  219. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/boost-first-rule.md +0 -0
  220. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  221. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  222. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/branch-current-gate.md +0 -0
  223. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  224. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  225. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
  226. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  227. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  228. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  229. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  230. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
  231. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  232. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  233. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  234. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  235. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  236. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  237. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/cli-command-audit.md +0 -0
  238. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
  239. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  240. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  241. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
  242. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/command-carousel-page.md +0 -0
  243. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  244. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  245. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
  246. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  247. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  248. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  249. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  250. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  251. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  252. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
  253. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  254. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  255. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  256. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  257. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
  258. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  259. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  260. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  261. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  262. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  263. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
  264. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  265. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  266. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  267. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  268. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  269. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  270. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  271. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  272. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  273. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  274. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  275. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  276. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  277. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  278. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  279. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  280. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  281. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  282. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  283. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  284. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  285. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  286. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  287. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  288. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  289. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  290. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
  291. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
  292. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
  293. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/github-community-health-files.md +0 -0
  294. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  295. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  296. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  297. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/gstack-tap-first-then-coexistence.md +0 -0
  298. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  299. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  300. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  301. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  302. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  303. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  304. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  305. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  306. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  307. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  308. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  309. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  310. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  311. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  312. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  313. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  314. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  315. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  316. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  317. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  318. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  319. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  320. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  321. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  322. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  323. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  324. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  325. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  326. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  327. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  328. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
  329. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  330. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  331. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  332. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  333. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  334. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  335. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  336. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
  337. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  338. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  339. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  340. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  341. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  342. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  343. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  344. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  345. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  346. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  347. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  348. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  349. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  350. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  351. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  352. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  353. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  354. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  355. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  356. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  357. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  358. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  359. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  360. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  361. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  362. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  363. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  364. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  365. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  366. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  367. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  368. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
  369. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
  370. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/openssf-playbook.md +0 -0
  371. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/openssf-silver.md +0 -0
  372. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/osps-baseline-levels.md +0 -0
  373. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  374. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  375. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  376. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
  377. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  378. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  379. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  380. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  381. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  382. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  383. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  384. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  385. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  386. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  387. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  388. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  389. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  390. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  391. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  392. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  393. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/published-shards-have-no-consumer.md +0 -0
  394. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  395. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  396. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  397. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  398. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  399. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
  400. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  401. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  402. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  403. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  404. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/relicence-apache-2.md +0 -0
  405. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
  406. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  407. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  408. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  409. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  410. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  411. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  412. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  413. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  414. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  415. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  416. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  417. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  418. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  419. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  420. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  421. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  422. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  423. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  424. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  425. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  426. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  427. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  428. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
  429. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  430. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  431. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  432. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  433. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  434. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  435. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
  436. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
  437. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
  438. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  439. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
  440. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
  441. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  442. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  443. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  444. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
  445. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  446. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  447. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  448. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  449. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  450. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  451. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
  452. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  453. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  454. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  455. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
  456. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  457. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
  458. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
  459. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
  460. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
  461. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  462. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
  463. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
  464. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
  465. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  466. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  467. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  468. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  469. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  470. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  471. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  472. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  473. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  474. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  475. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  476. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/vex-openvex-feed.md +0 -0
  477. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  478. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  479. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  480. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  481. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  482. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  483. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  484. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/workspace-scope-install.md +0 -0
  485. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/zip-strict-audit.md +0 -0
  486. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  487. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  488. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/roadmap.html +0 -0
  489. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/security-design.md +0 -0
  490. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
  491. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/verifying-releases.md +0 -0
  492. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/vex/meta.md +0 -0
  493. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/vex/openvex.json +0 -0
  494. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
  495. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
  496. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
  497. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
  498. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/eslint.config.mjs +0 -0
  499. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/evals/README.md +0 -0
  500. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/evals/__init__.py +0 -0
  501. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/evals/baseline.json +0 -0
  502. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/evals/faithfulness.py +0 -0
  503. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/evals/golden_set.json +0 -0
  504. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/evals/make_corpus.py +0 -0
  505. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/evals/make_golden.py +0 -0
  506. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/evals/metrics.py +0 -0
  507. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/evals/publish_golden_dataset.py +0 -0
  508. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/evals/run_evals.py +0 -0
  509. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/examples/README.md +0 -0
  510. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/examples/adapt-demo.sh +0 -0
  511. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/examples/boost-run-prototype.sh +0 -0
  512. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/index.html +0 -0
  513. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/noxfile.py +0 -0
  514. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/requirements/coverage-tools.in +0 -0
  515. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/requirements/coverage-tools.txt +0 -0
  516. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/requirements/lint-tools.in +0 -0
  517. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/requirements/lint-tools.txt +0 -0
  518. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/requirements/mutation-tools.in +0 -0
  519. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/requirements/mutation-tools.txt +0 -0
  520. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/requirements/platform-pins.lock +0 -0
  521. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/requirements/release-tools.in +0 -0
  522. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/requirements/release-tools.txt +0 -0
  523. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/requirements/test-tools.in +0 -0
  524. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/requirements/test-tools.txt +0 -0
  525. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/a11y_check.py +0 -0
  526. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/add_spdx_headers.py +0 -0
  527. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/bench_cli.sh +0 -0
  528. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/build_command_reference.py +0 -0
  529. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/build_demo_index.py +0 -0
  530. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/build_registries.py +0 -0
  531. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/build_roadmap.py +0 -0
  532. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/build_scale_corpus.py +0 -0
  533. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/build_vex.py +0 -0
  534. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/check_anchors.py +0 -0
  535. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/check_branch_current.py +0 -0
  536. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/check_dco.py +0 -0
  537. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/check_licenses.py +0 -0
  538. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/check_reproducible.py +0 -0
  539. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/check_required_checks.py +0 -0
  540. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/ensure_eval_corpus.sh +0 -0
  541. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/eval_corpus.py +0 -0
  542. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/eval_explain.py +0 -0
  543. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/eval_gate.py +0 -0
  544. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/eval_recommend.py +0 -0
  545. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/eval_retrieval.py +0 -0
  546. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/eval_stats_summary.py +0 -0
  547. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/import_budget.py +0 -0
  548. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/lock_toolchain.py +0 -0
  549. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/measure_registry.py +0 -0
  550. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/mutation_gate.py +0 -0
  551. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/mutation_shards.py +0 -0
  552. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/mutation_weights.json +0 -0
  553. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/normalize_sdist.py +0 -0
  554. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/page_budget.py +0 -0
  555. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/perf_gate.py +0 -0
  556. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/post_deploy_smoke.py +0 -0
  557. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/publish_eval_json.py +0 -0
  558. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/publish_shards.py +0 -0
  559. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/release_guard.py +0 -0
  560. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/release_preflight.py +0 -0
  561. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/scripts/serve_docs.py +0 -0
  562. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/setup.cfg +0 -0
  563. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/sonar-project.properties +0 -0
  564. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/style/README.md +0 -0
  565. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/style/boost.css +0 -0
  566. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/style/boost.js +0 -0
  567. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/style/demo.html +0 -0
  568. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/bdd/features/adapt.feature +0 -0
  569. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/bdd/features/browse.feature +0 -0
  570. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/bdd/features/count.feature +0 -0
  571. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/bdd/features/discover.feature +0 -0
  572. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/bdd/features/doctor.feature +0 -0
  573. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/bdd/features/environment.py +0 -0
  574. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/bdd/features/explain.feature +0 -0
  575. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/bdd/features/index.feature +0 -0
  576. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/bdd/features/install.feature +0 -0
  577. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/bdd/features/list.feature +0 -0
  578. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/bdd/features/search.feature +0 -0
  579. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/bdd/features/steps/cli_steps.py +0 -0
  580. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/bdd/features/steps/discovery_steps.py +0 -0
  581. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/bdd/features/steps/mcp_steps.py +0 -0
  582. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/bdd/features/steps/quality_steps.py +0 -0
  583. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/conftest.py +0 -0
  584. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/eval/baseline.json +0 -0
  585. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/eval/explain.jsonl +0 -0
  586. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/eval/golden-natural.jsonl +0 -0
  587. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/eval/golden.jsonl +0 -0
  588. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/eval/recommend.jsonl +0 -0
  589. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/eval/taps-scale.txt +0 -0
  590. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/eval/taps.txt +0 -0
  591. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_bmad_all_hosts.py +0 -0
  592. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_capabilities_policy.py +0 -0
  593. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_cli_adapt.py +0 -0
  594. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_cli_bmad.py +0 -0
  595. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_cli_catalog.py +0 -0
  596. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_cli_chat.py +0 -0
  597. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_cli_discovery.py +0 -0
  598. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_cli_hooks.py +0 -0
  599. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_cli_hooks_gemini.py +0 -0
  600. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_cli_info.py +0 -0
  601. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_cli_intelligence.py +0 -0
  602. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_cli_pane_width.py +0 -0
  603. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_cli_pkg.py +0 -0
  604. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_cli_quality.py +0 -0
  605. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_cli_tap_pins.py +0 -0
  606. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_cli_taps.py +0 -0
  607. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_cli_team.py +0 -0
  608. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_everyday_loop.py +0 -0
  609. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_integrity_enforce.py +0 -0
  610. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_kind_conformance.py +0 -0
  611. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_property_parsers.py +0 -0
  612. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_run.py +0 -0
  613. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_tap_signing.py +0 -0
  614. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/functional/test_workspace_scope.py +0 -0
  615. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/README.md +0 -0
  616. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  617. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  618. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  619. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  620. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  621. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  622. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  623. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  624. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  625. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  626. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  627. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  628. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  629. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  630. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  631. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  632. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  633. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  634. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  635. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  636. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
  637. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
  638. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
  639. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/fuzz_frontmatter.py +0 -0
  640. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/fuzz/fuzz_registry.py +0 -0
  641. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/langchain/conftest.py +0 -0
  642. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/langchain/test_graph.py +0 -0
  643. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/langchain/test_loader.py +0 -0
  644. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/langchain/test_retriever.py +0 -0
  645. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/make_fixture.py +0 -0
  646. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/perf/test_benchmarks.py +0 -0
  647. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/smoke.sh +0 -0
  648. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_a11y_check.py +0 -0
  649. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_action_pin_lockstep.py +0 -0
  650. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_adapters.py +0 -0
  651. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_adapters_multi.py +0 -0
  652. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_adapters_runner.py +0 -0
  653. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_agents.py +0 -0
  654. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_ai.py +0 -0
  655. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_aihost.py +0 -0
  656. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_bmad_core.py +0 -0
  657. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_boost_first_offer.py +0 -0
  658. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_bootstrap.py +0 -0
  659. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_branch_current.py +0 -0
  660. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_browse.py +0 -0
  661. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_builtin.py +0 -0
  662. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_capabilities.py +0 -0
  663. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_catalog.py +0 -0
  664. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_catalogbundle.py +0 -0
  665. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_chat.py +0 -0
  666. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_check_anchors.py +0 -0
  667. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_check_dco.py +0 -0
  668. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_check_licenses.py +0 -0
  669. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_check_reproducible.py +0 -0
  670. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_claude_settings.py +0 -0
  671. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_clean_internal_cache.py +0 -0
  672. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_cliparse.py +0 -0
  673. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_codeql_analysis_key.py +0 -0
  674. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_command_reference_fresh.py +0 -0
  675. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_community_health_files.py +0 -0
  676. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_compact.py +0 -0
  677. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_complete.py +0 -0
  678. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_complete_rc_block.py +0 -0
  679. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_config.py +0 -0
  680. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_content_dedupe.py +0 -0
  681. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_content_identity.py +0 -0
  682. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_crash_redaction.py +0 -0
  683. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_dedup_trust.py +0 -0
  684. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_demo_index.py +0 -0
  685. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_dense.py +0 -0
  686. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_dense_embed_dedupe.py +0 -0
  687. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_dense_fallback.py +0 -0
  688. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_dense_fix_hint.py +0 -0
  689. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_dense_quantized.py +0 -0
  690. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_dense_ready_order.py +0 -0
  691. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_dense_shard_real_schema.py +0 -0
  692. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
  693. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_dense_shards.py +0 -0
  694. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_dense_status.py +0 -0
  695. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_dense_status_cheap.py +0 -0
  696. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_dependabot_config.py +0 -0
  697. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_docs_pages_linked.py +0 -0
  698. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_docsite_chrome.py +0 -0
  699. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_ed25519.py +0 -0
  700. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_embed.py +0 -0
  701. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_embed_local.py +0 -0
  702. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_embed_truncated_response.py +0 -0
  703. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_entry_key.py +0 -0
  704. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_errors_and_cli_table.py +0 -0
  705. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_eval_baseline.py +0 -0
  706. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_eval_corpus.py +0 -0
  707. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_eval_faithfulness.py +0 -0
  708. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_eval_gate.py +0 -0
  709. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_eval_grading.py +0 -0
  710. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_eval_metrics.py +0 -0
  711. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_eval_stats_summary.py +0 -0
  712. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  713. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_faithfulness.py +0 -0
  714. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_frontmatter.py +0 -0
  715. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_fuzz_targets.py +0 -0
  716. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  717. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_gitleaks_config.py +0 -0
  718. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_gitutil.py +0 -0
  719. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_gitutil_lfs.py +0 -0
  720. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_gitutil_sparse.py +0 -0
  721. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_hook_settings_hosts.py +0 -0
  722. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_hookhost.py +0 -0
  723. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_imperative.py +0 -0
  724. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_import_budget.py +0 -0
  725. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_injectscan.py +0 -0
  726. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_install_permission_error.py +0 -0
  727. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_installscan.py +0 -0
  728. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_integrity.py +0 -0
  729. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_journal.py +0 -0
  730. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_langchain_packaging.py +0 -0
  731. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_link_ownership.py +0 -0
  732. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_localembed.py +0 -0
  733. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_localembed_e2e.py +0 -0
  734. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_lockfile.py +0 -0
  735. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_logs.py +0 -0
  736. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_marketing_counts.py +0 -0
  737. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_mcp.py +0 -0
  738. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_mcp_install_scan.py +0 -0
  739. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_mcpdecl.py +0 -0
  740. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_mcphost.py +0 -0
  741. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_measure_registry.py +0 -0
  742. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_minisign.py +0 -0
  743. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_mutation_hardening.py +0 -0
  744. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_mutation_shards.py +0 -0
  745. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_mutation_subfile_shards.py +0 -0
  746. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_mutmut_source_paths.py +0 -0
  747. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_nethttp.py +0 -0
  748. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_normalize_sdist.py +0 -0
  749. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_output.py +0 -0
  750. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_page_budget.py +0 -0
  751. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_paths.py +0 -0
  752. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_perf_gate.py +0 -0
  753. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_pkg_confusions.py +0 -0
  754. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_pkg_injection.py +0 -0
  755. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_pkg_secrets.py +0 -0
  756. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_platform_pins.py +0 -0
  757. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_policy.py +0 -0
  758. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_post_deploy_smoke.py +0 -0
  759. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_project_mcp_sidecar.py +0 -0
  760. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_projectlock.py +0 -0
  761. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_provenance.py +0 -0
  762. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_publish_golden_dataset.py +0 -0
  763. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_rag.py +0 -0
  764. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_rag_fastpath.py +0 -0
  765. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_rag_fusion.py +0 -0
  766. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_registries_fresh.py +0 -0
  767. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_registry.py +0 -0
  768. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_registry_categories.py +0 -0
  769. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_registry_control_chars.py +0 -0
  770. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_registry_parallel.py +0 -0
  771. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_release_guard.py +0 -0
  772. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_release_preflight.py +0 -0
  773. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_required_checks.py +0 -0
  774. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_rerank_cache.py +0 -0
  775. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_resolve.py +0 -0
  776. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_roadmap_fresh.py +0 -0
  777. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_rules.py +0 -0
  778. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_scale_corpus.py +0 -0
  779. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_scopes.py +0 -0
  780. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_secretscan.py +0 -0
  781. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_selfupdate.py +0 -0
  782. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_serve.py +0 -0
  783. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_serve_docs.py +0 -0
  784. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_shards.py +0 -0
  785. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_smoke_covers_every_command.py +0 -0
  786. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_spdx_headers.py +0 -0
  787. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_spin.py +0 -0
  788. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_stackprobe.py +0 -0
  789. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_staleness.py +0 -0
  790. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_store.py +0 -0
  791. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_store_materialize.py +0 -0
  792. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_sync_blocked_links.py +0 -0
  793. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  794. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_tap_pins.py +0 -0
  795. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_token_parity.py +0 -0
  796. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_toolchain_lock.py +0 -0
  797. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_trustaudit.py +0 -0
  798. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_typosquat.py +0 -0
  799. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_updatediff.py +0 -0
  800. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_util.py +0 -0
  801. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_version.py +0 -0
  802. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_vex.py +0 -0
  803. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_visual_harness_flags.py +0 -0
  804. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_workflow_concurrency.py +0 -0
  805. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  806. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  807. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_workflow_timeouts.py +0 -0
  808. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_workflows.py +0 -0
  809. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  810. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/visual/a11y_check.mjs +0 -0
  811. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/visual/console_check.mjs +0 -0
  812. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/visual/package-lock.json +0 -0
  813. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/tests/visual/package.json +0 -0
  814. {boost_skill_cli-1.2.48 → boost_skill_cli-1.2.50}/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
@@ -450,6 +459,18 @@ each agent's skills dir, and updating the lock file.
450
459
  costs a download instead of an hour of CPU — and says plainly when one does
451
460
  not.
452
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
+
453
474
  - **A published shard is only importable while three things match, and every
454
475
  mismatch is silent if waved through.** `core/shards.py` fetches
455
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.48
3
+ Version: 1.2.50
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License-Expression: Apache-2.0
@@ -186,6 +186,10 @@ 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.
191
195
 
@@ -144,6 +144,10 @@ 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.
149
153
 
@@ -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.48'
22
- __version_tuple__ = version_tuple = (1, 2, 48)
21
+ __version__ = version = '1.2.50'
22
+ __version_tuple__ = version_tuple = (1, 2, 50)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -1450,30 +1450,46 @@ def _mcp_tool(tool: str, args: dict):
1450
1450
  return REGISTRY.call(tool, args)
1451
1451
 
1452
1452
 
1453
- def _run_mcp_host(host: str, action: str, cmd) -> bool:
1454
- """Run one host's register/unregister argv. True if it actually ran.
1453
+ #: Substrings an agent CLI uses to say "this server is already registered".
1454
+ #: Registering twice is not a failure — it is the state the user asked for —
1455
+ #: and treating it as one is what made `--host auto` abort on host one and
1456
+ #: never reach host two on any machine where boost was already in Claude.
1457
+ _ALREADY = ("already exists", "already registered", "already configured")
1455
1458
 
1456
- A host whose CLI is not installed is *not* an error — most machines have
1457
- one agent CLI, not all of them — so the argv is printed for the user to run
1458
- later and the caller moves on to the next host. A CLI that is present and
1459
- fails is a real error and raises.
1459
+
1460
+ def _run_mcp_host(host: str, action: str, cmd) -> tuple[str, str]:
1461
+ """Run one host's register/unregister argv.
1462
+
1463
+ Returns ``(status, detail)`` where status is:
1464
+
1465
+ * ``"ran"`` — the CLI ran and succeeded;
1466
+ * ``"already"`` — it reported the server is already in the state asked
1467
+ for, which is success with a different wording;
1468
+ * ``"missing"`` — the CLI is not installed. Not an error: most machines
1469
+ have one agent CLI, not all of them;
1470
+ * ``"failed"`` — it is installed and something else went wrong.
1471
+
1472
+ It **returns** rather than raises so one host cannot end the sweep. That
1473
+ was the bug: a present CLI exiting non-zero raised straight out of the
1474
+ loop, so with boost already registered in Claude, `--host auto` died on
1475
+ "already exists" and never reached the second agent.
1460
1476
  """
1461
1477
  exe = mcphost.cli(host)
1462
1478
  if not shutil.which(exe):
1463
- return False
1479
+ return "missing", ""
1464
1480
  try:
1465
1481
  proc = subprocess.run(cmd, capture_output=True, text=True, timeout=60)
1466
1482
  except (OSError, subprocess.TimeoutExpired) as e:
1467
- raise BoostError("%s mcp %s failed: %s" % (exe, action, e),
1468
- hint="run it yourself: " + " ".join(cmd)) from e
1483
+ return "failed", str(e)
1469
1484
  for ln in (proc.stdout or "").strip().splitlines():
1470
1485
  out.info(ln)
1471
- if proc.returncode != 0:
1472
- tail = (proc.stderr or "").strip().splitlines()
1473
- raise BoostError("%s mcp %s failed: %s"
1474
- % (exe, action, tail[-1] if tail else "unknown error"),
1475
- hint="run it yourself: " + " ".join(cmd))
1476
- return True
1486
+ if proc.returncode == 0:
1487
+ return "ran", ""
1488
+ blob = ((proc.stderr or "") + (proc.stdout or "")).lower()
1489
+ if action == "register" and any(k in blob for k in _ALREADY):
1490
+ return "already", ""
1491
+ tail = (proc.stderr or "").strip().splitlines()
1492
+ return "failed", tail[-1] if tail else "unknown error"
1477
1493
 
1478
1494
 
1479
1495
  def _seed_catalog_for_mcp(force: bool) -> None:
@@ -1627,11 +1643,18 @@ def cmd_mcp(argv) -> int:
1627
1643
  # `all`) always reports it, so a user setting up a machine can see the argv
1628
1644
  # for an agent CLI they have not installed yet.
1629
1645
  explicit = args.host not in (None, "", "auto")
1630
- done, missing = [], []
1646
+ done, already, missing, failed = [], [], [], {}
1631
1647
  for host in targets:
1632
1648
  cmd = mcphost.argv(host, args.action, shim)
1633
- if _run_mcp_host(host, args.action, cmd):
1649
+ status, detail = _run_mcp_host(host, args.action, cmd)
1650
+ if status == "ran":
1634
1651
  done.append(host)
1652
+ elif status == "already":
1653
+ already.append(host)
1654
+ elif status == "failed":
1655
+ # Collected, not raised: the next host is a different agent on a
1656
+ # different config file and has nothing to do with this failure.
1657
+ failed[host] = detail
1635
1658
  else:
1636
1659
  missing.append(host)
1637
1660
  if explicit:
@@ -1643,7 +1666,23 @@ def cmd_mcp(argv) -> int:
1643
1666
  for host in done:
1644
1667
  out.ok("%sed boost as an MCP server for %s (scope: user)"
1645
1668
  % (verb, mcphost.label(host)))
1646
- if not done:
1669
+ for host in already:
1670
+ out.ok("already registered with %s — nothing to do"
1671
+ % mcphost.label(host))
1672
+ for host, detail in failed.items():
1673
+ out.warn("%s: %s mcp %s failed — %s"
1674
+ % (mcphost.label(host), mcphost.cli(host), args.action,
1675
+ detail))
1676
+ out.info(out.role("run it yourself: %s"
1677
+ % " ".join(mcphost.argv(host, args.action, shim)),
1678
+ "muted"))
1679
+ settled = done + already
1680
+ if not settled:
1681
+ if failed:
1682
+ # Every installed CLI failed. That is a real error — but only after
1683
+ # each one has been tried and named.
1684
+ journal.log("mcp", args.action, hosts="")
1685
+ return 1
1647
1686
  # Nothing ran. Under `auto` nothing has been printed yet, so say which
1648
1687
  # CLIs were looked for rather than exiting silently on success.
1649
1688
  if not explicit:
@@ -1654,8 +1693,10 @@ def cmd_mcp(argv) -> int:
1654
1693
  journal.log("mcp", args.action, hosts="")
1655
1694
  return 0
1656
1695
  if args.action == "register":
1657
- _offer_boost_first(done)
1658
- journal.log("mcp", args.action, hosts=",".join(done))
1696
+ _offer_boost_first(settled)
1697
+ journal.log("mcp", args.action, hosts=",".join(settled))
1698
+ # Same rule as `boost update` across taps: a partial sweep is a success
1699
+ # with a warning, because the hosts that worked really did work.
1659
1700
  return 0
1660
1701
 
1661
1702
 
@@ -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)"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.48
3
+ Version: 1.2.50
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License-Expression: Apache-2.0
@@ -186,6 +186,10 @@ 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.
191
195
 
@@ -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
@@ -776,6 +777,7 @@ tests/unit/test_secretscan.py
776
777
  tests/unit/test_selfupdate.py
777
778
  tests/unit/test_serve.py
778
779
  tests/unit/test_serve_docs.py
780
+ tests/unit/test_shard_plan.py
779
781
  tests/unit/test_shards.py
780
782
  tests/unit/test_shards_matrix.py
781
783
  tests/unit/test_smoke_covers_every_command.py
@@ -795,6 +797,7 @@ tests/unit/test_typosquat.py
795
797
  tests/unit/test_updatediff.py
796
798
  tests/unit/test_util.py
797
799
  tests/unit/test_version.py
800
+ tests/unit/test_version_tags.py
798
801
  tests/unit/test_vex.py
799
802
  tests/unit/test_visual_harness_flags.py
800
803
  tests/unit/test_workflow_concurrency.py
@@ -180,7 +180,7 @@
180
180
  </div>
181
181
  <div class="group" data-group="cfg">
182
182
  <div class="group-h">Config &amp; setup</div>
183
- <a class="cmd-link" href="#cmd-quickstart" data-search="quickstart tap the starter registries and load prebuilt vectors --no-vectors --dry-run">quickstart</a>
183
+ <a class="cmd-link" href="#cmd-quickstart" data-search="quickstart tap the starter registries and load prebuilt vectors --catalog --no-vectors --dry-run">quickstart</a>
184
184
  <a class="cmd-link" href="#cmd-config" data-search="config display or modify boost configuration --json {list,get,set,unset} key value">config</a>
185
185
  <a class="cmd-link" href="#cmd-clean" data-search="clean clear stale caches &amp; broken symlinks --dry-run --deep">clean</a>
186
186
  <a class="cmd-link" href="#cmd-compact" data-search="compact shrink tap clones to the files boost indexes --dry-run --reclone tap">compact</a>
@@ -974,12 +974,13 @@
974
974
  </div>
975
975
  </section>
976
976
  <h2 class="group-h" id="grp-cfg">Config &amp; setup</h2>
977
- <section class="cmd" id="cmd-quickstart" data-search="quickstart tap the starter registries and load prebuilt vectors --no-vectors --dry-run">
977
+ <section class="cmd" id="cmd-quickstart" data-search="quickstart tap the starter registries and load prebuilt vectors --catalog --no-vectors --dry-run">
978
978
  <h3><span class="cname">quickstart</span><span class="gtag">cfg</span></h3>
979
979
  <p class="summary">Tap the starter registries and load prebuilt vectors</p>
980
- <pre class="syn">boost quickstart [--no-vectors] [--dry-run]</pre>
980
+ <pre class="syn">boost quickstart [--catalog] [--no-vectors] [--dry-run]</pre>
981
981
  <div class="args-h">Options</div>
982
982
  <div class="args">
983
+ <div class="arg"><code>--catalog</code><span>tap every catalogued registry, not just the 7 starters, and fetch vectors for all of them</span></div>
983
984
  <div class="arg"><code>--no-vectors</code><span>set up taps and keyword search only, skip shards</span></div>
984
985
  <div class="arg"><code>--dry-run</code><span>print what would happen, change nothing</span></div>
985
986
  </div>
@@ -61,9 +61,16 @@ two commands consume them:
61
61
 
62
62
  ```bash
63
63
  boost quickstart # tap the starter registries + import their vectors
64
+ boost quickstart --catalog # …or all 463 catalogued registries
64
65
  boost reindex --fetch-shards # already tapped: import whatever is published
65
66
  ```
66
67
 
68
+ The published set is the whole catalogue, refreshed weekly. CI packs the 463
69
+ registries into ~60 matrix jobs rather than one per registry, because GitHub
70
+ caps a matrix at 256 jobs and embedding cost is uneven enough that slicing
71
+ would leave one job carrying several of the largest registries
72
+ (`scripts/shard_plan.py`).
73
+
67
74
  Three rules keep a downloaded vector honest, and each of them refuses rather
68
75
  than degrades — the failures they prevent are silent ones:
69
76
 
@@ -118,6 +118,21 @@ boost = "boost_cli.cli:main"
118
118
  # are the single source of truth — no constant to bump, no drift. Writes the
119
119
  # resolved version to boost_cli/_version.py (git-ignored).
120
120
  version_file = "boost_cli/_version.py"
121
+ # ONLY vX.Y.Z tags are versions, and both settings are needed to say so: the
122
+ # describe command decides which tag is *found*, `tag_regex` decides how it is
123
+ # *parsed*. Without them, the rolling `shards-latest` tag that hosts the
124
+ # prebuilt vector shards was picked up as this project's version — a CI
125
+ # checkout resolved `vshards-latest-4-g1c1398c`, which then broke
126
+ # `boost self-update`'s "am I behind PyPI?" comparison, because that compares
127
+ # version tuples and this parses as none.
128
+ #
129
+ # The repository now carries a non-version tag on purpose (a GitHub release
130
+ # needs one), so this is not a hypothetical: any future non-version tag is
131
+ # covered too.
132
+ git_describe_command = [
133
+ "git", "describe", "--dirty", "--tags", "--long", "--match", "v[0-9]*",
134
+ ]
135
+ tag_regex = "^v(?P<version>[0-9]+[^+]*)$"
121
136
 
122
137
  [tool.setuptools.packages.find]
123
138
  # Two top-level packages, one wheel: boost_cli (the zero-dependency CLI) and
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env python3
2
+ # Copyright the boost contributors.
3
+ # SPDX-License-Identifier: Apache-2.0
4
+ """Pack the registry catalogue into a bounded, balanced Actions matrix.
5
+
6
+ WHY THIS EXISTS. `shards.yml` ran one job per registry, which is fine for the
7
+ 20-repo eval corpus and impossible for the 463-registry catalogue: **GitHub
8
+ caps a matrix at 256 jobs per workflow run**, so 463 rows do not start at all.
9
+ Chunking is therefore not an optimisation, it is the difference between the
10
+ workflow running and not.
11
+
12
+ WHY BIN-PACKING RATHER THAN SLICING. Embedding cost is wildly uneven — the
13
+ catalogue's largest registry is 880 measured items against a median of 30 and a
14
+ minimum of 1 — so a naive `chunk(n)` puts several giants in one job and leaves
15
+ others with nothing. The whole run then takes as long as its unluckiest chunk, against
16
+ a hard 6-hour job ceiling. Longest-processing-time-first (sort by cost
17
+ descending, always add to the currently cheapest bin) is the standard greedy
18
+ answer and is within 4/3 of optimal, which is far inside the margin that
19
+ matters here. The practical effect is that the biggest registry ends up
20
+ effectively alone in its bin, which is exactly what you want: it is the run's
21
+ critical path either way.
22
+
23
+ COST PROXY. `est_items` from the bundled catalogue, which is *measured* (see
24
+ `scripts/measure_registry.py`) rather than guessed. It is a proxy for chunk
25
+ count, not chunk count itself — deduplication means a registry that mirrors
26
+ itself is cheaper than its size suggests — but it is the only per-registry
27
+ number available before cloning, and it is right about the ordering, which is
28
+ what the packing needs.
29
+
30
+ shard_plan.py --scope catalog # matrix JSON for GITHUB_OUTPUT
31
+ shard_plan.py --scope catalog --explain # what each job would carry
32
+ """
33
+ from __future__ import annotations
34
+
35
+ import argparse
36
+ import json
37
+ import sys
38
+ from pathlib import Path
39
+
40
+ sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
41
+
42
+ from boost_cli.core import config
43
+
44
+ #: GitHub's documented ceiling. Not a tunable — a matrix that exceeds it fails
45
+ #: the whole run before a single job starts.
46
+ MAX_MATRIX_JOBS = 256
47
+
48
+ #: Default jobs to plan for. Under the ceiling with room to spare, and enough
49
+ #: parallelism that the run is bounded by its largest registry rather than by
50
+ #: how many bins there are.
51
+ DEFAULT_JOBS = 60
52
+
53
+
54
+ def catalog_rows(include_lists: bool = False) -> list[dict]:
55
+ """Every catalogued registry as ``{"name", "cost"}``, biggest first."""
56
+ rows = []
57
+ for entry in config.load_registry_catalog():
58
+ if not include_lists and entry.get("list_only"):
59
+ # An awesome-list repo indexes other repos; there is nothing of its
60
+ # own to embed.
61
+ continue
62
+ name = str(entry.get("name") or "")
63
+ if not name:
64
+ continue
65
+ rows.append({"name": name, "cost": int(entry.get("est_items") or 0)})
66
+ rows.sort(key=lambda r: (-r["cost"], r["name"]))
67
+ return rows
68
+
69
+
70
+ def pack(rows: list[dict], jobs: int) -> list[list[str]]:
71
+ """Longest-processing-time-first packing into at most `jobs` bins.
72
+
73
+ Deterministic: rows arrive sorted by (-cost, name), and ties between bins
74
+ are broken by index, so the same catalogue always plans the same matrix.
75
+ That matters for reruns — a rerun that repacked differently would re-embed
76
+ registries whose shards were already published.
77
+ """
78
+ if jobs < 1:
79
+ raise SystemExit("--jobs must be at least 1")
80
+ bins: list[list[str]] = [[] for _ in range(min(jobs, max(1, len(rows))))]
81
+ loads = [0] * len(bins)
82
+ for row in rows:
83
+ i = loads.index(min(loads))
84
+ bins[i].append(row["name"])
85
+ loads[i] += row["cost"]
86
+ return [b for b in bins if b]
87
+
88
+
89
+ def plan(scope: str, jobs: int, include_lists: bool = False) -> list[list[str]]:
90
+ """The matrix for `scope`, as a list of registry-name lists."""
91
+ if scope == "eval":
92
+ # The pinned corpus every other gate measures against: one job per
93
+ # registry, because there are twenty of them and no packing is needed.
94
+ import subprocess
95
+ out = subprocess.run(
96
+ [sys.executable, str(Path(__file__).with_name("eval_corpus.py")),
97
+ "--list-repos"], check=True, capture_output=True, text=True).stdout
98
+ return [[name] for name in out.split()]
99
+ rows = catalog_rows(include_lists=include_lists)
100
+ if not rows:
101
+ raise SystemExit("the bundled registry catalogue is empty")
102
+ return pack(rows, jobs)
103
+
104
+
105
+ def main(argv: list[str] | None = None) -> int:
106
+ p = argparse.ArgumentParser(description=__doc__,
107
+ formatter_class=argparse.RawDescriptionHelpFormatter)
108
+ p.add_argument("--scope", choices=("catalog", "eval"), default="catalog",
109
+ help="which registries to shard (default: %(default)s)")
110
+ p.add_argument("--jobs", type=int, default=DEFAULT_JOBS,
111
+ help="how many matrix jobs to plan for (default: %(default)s)")
112
+ p.add_argument("--include-lists", action="store_true",
113
+ help="also shard awesome-list/index repos")
114
+ p.add_argument("--explain", action="store_true",
115
+ help="print the packing as a table instead of JSON")
116
+ args = p.parse_args(argv)
117
+
118
+ if args.jobs > MAX_MATRIX_JOBS:
119
+ raise SystemExit(
120
+ "--jobs %d exceeds GitHub's %d-job matrix ceiling; the run would "
121
+ "fail before starting" % (args.jobs, MAX_MATRIX_JOBS))
122
+ chunks = plan(args.scope, args.jobs, args.include_lists)
123
+ if len(chunks) > MAX_MATRIX_JOBS:
124
+ raise SystemExit("planned %d jobs, over the %d-job ceiling"
125
+ % (len(chunks), MAX_MATRIX_JOBS))
126
+ if args.explain:
127
+ costs = {r["name"]: r["cost"] for r in catalog_rows(args.include_lists)}
128
+ for i, chunk in enumerate(chunks):
129
+ load = sum(costs.get(n, 0) for n in chunk)
130
+ print("job %2d %5d est. items %2d registries %s"
131
+ % (i, load, len(chunk),
132
+ ", ".join(chunk[:3]) + (" …" if len(chunk) > 3 else "")))
133
+ loads = [sum(costs.get(n, 0) for n in c) for c in chunks]
134
+ print("\n%d jobs · %d registries · %d est. items · heaviest %d, "
135
+ "lightest %d" % (len(chunks), sum(len(c) for c in chunks),
136
+ sum(loads), max(loads), min(loads)))
137
+ return 0
138
+ # One matrix entry per job: a space-separated list the workflow splits in
139
+ # Python, never in shell — `shards.yml`'s header records what happened the
140
+ # last time a list was word-split by the runner.
141
+ print(json.dumps([" ".join(chunk) for chunk in chunks]))
142
+ return 0
143
+
144
+
145
+ if __name__ == "__main__":
146
+ raise SystemExit(main())
@@ -53,7 +53,8 @@ Feature: boost mcp
53
53
  Given the "claude" CLI is on PATH but fails with "no auth"
54
54
  When I run "boost mcp register"
55
55
  Then the exit code should be 1
56
- And the output should contain "claude mcp register failed: no auth"
56
+ And the output should contain "claude mcp register failed — no auth"
57
+ And the output should contain "run it yourself"
57
58
 
58
59
  Scenario: unregistering with no agent CLI prints both manual commands
59
60
  Given no agent CLI is on PATH