boost-skill-cli 1.2.37__tar.gz → 1.2.39__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 (800) hide show
  1. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.vale/styles/config/vocabularies/boost/accept.txt +2 -0
  2. {boost_skill_cli-1.2.37/boost_skill_cli.egg-info → boost_skill_cli-1.2.39}/PKG-INFO +9 -4
  3. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/README.md +8 -3
  4. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/_version.py +2 -2
  5. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/bmad.py +105 -21
  6. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/ai.py +49 -24
  7. boost_skill_cli-1.2.39/boost_cli/core/aihost.py +154 -0
  8. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39/boost_skill_cli.egg-info}/PKG-INFO +9 -4
  9. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_skill_cli.egg-info/SOURCES.txt +5 -0
  10. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/bmad.md +30 -3
  11. boost_skill_cli-1.2.39/docs/roadmap/items/ai-backend-fanout.md +42 -0
  12. boost_skill_cli-1.2.39/docs/roadmap/items/bmad-hooks-all-hosts.md +42 -0
  13. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap.html +80 -2
  14. boost_skill_cli-1.2.39/tests/functional/test_bmad_all_hosts.py +124 -0
  15. boost_skill_cli-1.2.39/tests/unit/test_aihost.py +109 -0
  16. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_mutation_hardening.py +26 -3
  17. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.gitattributes +0 -0
  18. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.gitignore +0 -0
  19. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.gitleaks.toml +0 -0
  20. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.htmlvalidate.json +0 -0
  21. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.lighthouserc.json +0 -0
  22. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.lycheeignore +0 -0
  23. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.markdownlint-cli2.jsonc +0 -0
  24. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.pre-commit-config.yaml +0 -0
  25. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.stylelintrc.json +0 -0
  26. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.vale/styles/boost/AIWriting.yml +0 -0
  27. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.vale/styles/boost/Terminology.yml +0 -0
  28. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.vale.ini +0 -0
  29. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/CLAUDE.md +0 -0
  30. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/CODE_OF_CONDUCT.md +0 -0
  31. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/CONTRIBUTING.md +0 -0
  32. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/DCO +0 -0
  33. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/GOVERNANCE.md +0 -0
  34. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/LICENSE +0 -0
  35. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/MAINTAINERS.md +0 -0
  36. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/MANIFEST.in +0 -0
  37. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/Makefile +0 -0
  38. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/SECURITY.md +0 -0
  39. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/SUPPORT.md +0 -0
  40. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost +0 -0
  41. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/__init__.py +0 -0
  42. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/__main__.py +0 -0
  43. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/cli.py +0 -0
  44. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/cliparse.py +0 -0
  45. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/__init__.py +0 -0
  46. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/_common.py +0 -0
  47. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/configuration.py +0 -0
  48. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/discovery.py +0 -0
  49. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/hooks.py +0 -0
  50. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/info.py +0 -0
  51. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/intelligence.py +0 -0
  52. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/pkg.py +0 -0
  53. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/quality.py +0 -0
  54. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/run.py +0 -0
  55. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/safety.py +0 -0
  56. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/taps.py +0 -0
  57. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/team.py +0 -0
  58. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/__init__.py +0 -0
  59. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/adapters.py +0 -0
  60. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/agents.py +0 -0
  61. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/bmad.py +0 -0
  62. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/bootstrap.py +0 -0
  63. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/browse.py +0 -0
  64. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/builtin.py +0 -0
  65. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/capabilities.py +0 -0
  66. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/catalog.py +0 -0
  67. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/catalogbundle.py +0 -0
  68. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/chat.py +0 -0
  69. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/claude_settings.py +0 -0
  70. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/complete.py +0 -0
  71. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/config.py +0 -0
  72. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/dense.py +0 -0
  73. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/ed25519.py +0 -0
  74. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/embed.py +0 -0
  75. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/faithfulness.py +0 -0
  76. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/frontmatter.py +0 -0
  77. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/gitutil.py +0 -0
  78. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/hookhost.py +0 -0
  79. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/imperative.py +0 -0
  80. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/injectscan.py +0 -0
  81. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/installscan.py +0 -0
  82. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/integrity.py +0 -0
  83. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/journal.py +0 -0
  84. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/localembed.py +0 -0
  85. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/lockfile.py +0 -0
  86. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/logs.py +0 -0
  87. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/mcp.py +0 -0
  88. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/mcpdecl.py +0 -0
  89. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/mcphost.py +0 -0
  90. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/minisign.py +0 -0
  91. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/nethttp.py +0 -0
  92. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/output.py +0 -0
  93. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/paths.py +0 -0
  94. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/policy.py +0 -0
  95. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/projectlock.py +0 -0
  96. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/provenance.py +0 -0
  97. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/rag.py +0 -0
  98. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/registry.py +0 -0
  99. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/resolve.py +0 -0
  100. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/rules.py +0 -0
  101. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/scopes.py +0 -0
  102. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/secretscan.py +0 -0
  103. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/selfupdate.py +0 -0
  104. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/serve.py +0 -0
  105. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/stackprobe.py +0 -0
  106. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/staleness.py +0 -0
  107. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/store.py +0 -0
  108. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/trustaudit.py +0 -0
  109. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/typosquat.py +0 -0
  110. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/updatediff.py +0 -0
  111. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/util.py +0 -0
  112. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/workflows.py +0 -0
  113. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/data/registries.json +0 -0
  114. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/data/rules/boost-first.mdc +0 -0
  115. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/errors.py +0 -0
  116. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/spin.py +0 -0
  117. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_langchain/__init__.py +0 -0
  118. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_langchain/_compat.py +0 -0
  119. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_langchain/graph.py +0 -0
  120. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_langchain/loader.py +0 -0
  121. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_langchain/py.typed +0 -0
  122. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_langchain/retriever.py +0 -0
  123. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  124. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  125. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_skill_cli.egg-info/requires.txt +0 -0
  126. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_skill_cli.egg-info/top_level.txt +0 -0
  127. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/codecov.yml +0 -0
  128. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/.claude/settings.local.json +0 -0
  129. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/DEBUGGING.md +0 -0
  130. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/adapters.html +0 -0
  131. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/architecture/README.md +0 -0
  132. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/architecture/c4-components-core.md +0 -0
  133. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/architecture/c4-containers.md +0 -0
  134. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/architecture/c4-context.md +0 -0
  135. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/architecture/c4-dynamic-install.md +0 -0
  136. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/gifs/distill.gif +0 -0
  137. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/gifs/doctor.gif +0 -0
  138. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/gifs/explain.gif +0 -0
  139. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/gifs/hooks.gif +0 -0
  140. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/gifs/install.gif +0 -0
  141. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/gifs/pulse.gif +0 -0
  142. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/gifs/search.gif +0 -0
  143. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/gifs/tap.gif +0 -0
  144. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/tapes/distill.tape +0 -0
  145. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/tapes/doctor.tape +0 -0
  146. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/tapes/explain.tape +0 -0
  147. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/tapes/hooks.tape +0 -0
  148. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/tapes/install.tape +0 -0
  149. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/tapes/pulse.tape +0 -0
  150. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/tapes/search.tape +0 -0
  151. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/tapes/tap.tape +0 -0
  152. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel.html +0 -0
  153. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/chat.html +0 -0
  154. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/code-review.md +0 -0
  155. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/commands.html +0 -0
  156. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/commit-audit.md +0 -0
  157. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/demo-index.json +0 -0
  158. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/demo.gif +0 -0
  159. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/demo.html +0 -0
  160. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/demo.tape +0 -0
  161. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/dependencies.md +0 -0
  162. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/design-roadmap.html +0 -0
  163. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/eval-latest.json +0 -0
  164. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/eval.html +0 -0
  165. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/index.html +0 -0
  166. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/langchain.html +0 -0
  167. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/mcp-hub.html +0 -0
  168. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/openssf-badge.md +0 -0
  169. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/openssf-playbook.md +0 -0
  170. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/rag-architecture.md +0 -0
  171. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D01.md +0 -0
  172. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D02.md +0 -0
  173. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D03.md +0 -0
  174. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D04.md +0 -0
  175. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D05.md +0 -0
  176. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D06.md +0 -0
  177. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D07.md +0 -0
  178. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D08.md +0 -0
  179. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D09.md +0 -0
  180. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D10.md +0 -0
  181. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D11.md +0 -0
  182. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D12.md +0 -0
  183. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D13.md +0 -0
  184. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D14.md +0 -0
  185. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D15.md +0 -0
  186. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D16.md +0 -0
  187. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D17.md +0 -0
  188. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D18.md +0 -0
  189. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D19.md +0 -0
  190. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D20.md +0 -0
  191. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D21.md +0 -0
  192. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D22.md +0 -0
  193. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D23.md +0 -0
  194. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D24.md +0 -0
  195. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D25.md +0 -0
  196. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D26.md +0 -0
  197. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D27.md +0 -0
  198. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  199. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  200. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  201. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  202. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  203. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  204. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  205. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  206. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  207. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  208. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
  209. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  210. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  211. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
  212. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/boost-first-rule.md +0 -0
  213. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  214. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  215. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/branch-current-gate.md +0 -0
  216. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  217. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  218. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
  219. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  220. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  221. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  222. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  223. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
  224. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  225. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  226. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  227. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  228. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  229. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  230. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/cli-command-audit.md +0 -0
  231. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
  232. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  233. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  234. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
  235. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/command-carousel-page.md +0 -0
  236. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  237. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  238. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
  239. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  240. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  241. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  242. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  243. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  244. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  245. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
  246. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  247. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  248. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  249. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  250. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
  251. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  252. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  253. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  254. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  255. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  256. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
  257. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  258. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  259. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  260. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  261. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  262. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  263. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  264. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  265. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  266. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  267. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  268. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  269. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  270. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  271. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  272. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  273. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  274. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  275. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  276. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  277. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  278. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  279. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  280. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  281. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  282. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  283. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
  284. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
  285. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
  286. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/github-community-health-files.md +0 -0
  287. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  288. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  289. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  290. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  291. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  292. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  293. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  294. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  295. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  296. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  297. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  298. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  299. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  300. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  301. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  302. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  303. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  304. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  305. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  306. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  307. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  308. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  309. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  310. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  311. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  312. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  313. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  314. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  315. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  316. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  317. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  318. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  319. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  320. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
  321. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  322. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  323. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  324. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  325. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  326. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  327. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  328. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
  329. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  330. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  331. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  332. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  333. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  334. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  335. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  336. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  337. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  338. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  339. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  340. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  341. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  342. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  343. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  344. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  345. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  346. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  347. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  348. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  349. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  350. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  351. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  352. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  353. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  354. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  355. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  356. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  357. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  358. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  359. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  360. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
  361. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
  362. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/openssf-playbook.md +0 -0
  363. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/openssf-silver.md +0 -0
  364. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/osps-baseline-levels.md +0 -0
  365. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  366. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  367. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  368. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
  369. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  370. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  371. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  372. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  373. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  374. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  375. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  376. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  377. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  378. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  379. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  380. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  381. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  382. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  383. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  384. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  385. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  386. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  387. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  388. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  389. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  390. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
  391. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  392. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  393. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  394. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  395. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
  396. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  397. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  398. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  399. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  400. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  401. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  402. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  403. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  404. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  405. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  406. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  407. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  408. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  409. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  410. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  411. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  412. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  413. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  414. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  415. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  416. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  417. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  418. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
  419. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  420. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  421. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  422. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  423. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  424. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  425. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
  426. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
  427. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
  428. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  429. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
  430. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
  431. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  432. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  433. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  434. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
  435. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  436. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  437. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  438. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  439. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  440. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  441. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
  442. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  443. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  444. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  445. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
  446. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  447. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
  448. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
  449. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
  450. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
  451. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  452. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
  453. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
  454. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
  455. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  456. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  457. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  458. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  459. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  460. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  461. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  462. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  463. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  464. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  465. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  466. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/vex-openvex-feed.md +0 -0
  467. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  468. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  469. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  470. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  471. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  472. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  473. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  474. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/workspace-scope-install.md +0 -0
  475. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/zip-strict-audit.md +0 -0
  476. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  477. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  478. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/security-design.md +0 -0
  479. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/semantic-search.md +0 -0
  480. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
  481. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/verifying-releases.md +0 -0
  482. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/vex/meta.md +0 -0
  483. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/vex/openvex.json +0 -0
  484. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
  485. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
  486. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
  487. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
  488. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/eslint.config.mjs +0 -0
  489. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/evals/README.md +0 -0
  490. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/evals/__init__.py +0 -0
  491. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/evals/baseline.json +0 -0
  492. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/evals/faithfulness.py +0 -0
  493. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/evals/golden_set.json +0 -0
  494. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/evals/make_corpus.py +0 -0
  495. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/evals/make_golden.py +0 -0
  496. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/evals/metrics.py +0 -0
  497. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/evals/publish_golden_dataset.py +0 -0
  498. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/evals/run_evals.py +0 -0
  499. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/examples/README.md +0 -0
  500. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/examples/adapt-demo.sh +0 -0
  501. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/examples/boost-run-prototype.sh +0 -0
  502. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/index.html +0 -0
  503. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/noxfile.py +0 -0
  504. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/pyproject.toml +0 -0
  505. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/coverage-tools.in +0 -0
  506. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/coverage-tools.txt +0 -0
  507. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/lint-tools.in +0 -0
  508. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/lint-tools.txt +0 -0
  509. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/mutation-tools.in +0 -0
  510. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/mutation-tools.txt +0 -0
  511. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/platform-pins.lock +0 -0
  512. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/release-tools.in +0 -0
  513. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/release-tools.txt +0 -0
  514. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/test-tools.in +0 -0
  515. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/test-tools.txt +0 -0
  516. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/a11y_check.py +0 -0
  517. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/add_spdx_headers.py +0 -0
  518. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/bench_cli.sh +0 -0
  519. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/build_command_reference.py +0 -0
  520. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/build_demo_index.py +0 -0
  521. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/build_registries.py +0 -0
  522. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/build_roadmap.py +0 -0
  523. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/build_scale_corpus.py +0 -0
  524. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/build_vex.py +0 -0
  525. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/check_anchors.py +0 -0
  526. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/check_branch_current.py +0 -0
  527. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/check_dco.py +0 -0
  528. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/check_licenses.py +0 -0
  529. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/check_reproducible.py +0 -0
  530. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/check_required_checks.py +0 -0
  531. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/ensure_eval_corpus.sh +0 -0
  532. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/eval_corpus.py +0 -0
  533. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/eval_explain.py +0 -0
  534. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/eval_gate.py +0 -0
  535. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/eval_recommend.py +0 -0
  536. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/eval_retrieval.py +0 -0
  537. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/eval_stats_summary.py +0 -0
  538. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/import_budget.py +0 -0
  539. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/lock_toolchain.py +0 -0
  540. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/measure_registry.py +0 -0
  541. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/mutation_gate.py +0 -0
  542. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/mutation_shards.py +0 -0
  543. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/mutation_weights.json +0 -0
  544. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/normalize_sdist.py +0 -0
  545. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/page_budget.py +0 -0
  546. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/perf_gate.py +0 -0
  547. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/post_deploy_smoke.py +0 -0
  548. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/publish_eval_json.py +0 -0
  549. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/release_guard.py +0 -0
  550. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/release_preflight.py +0 -0
  551. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/serve_docs.py +0 -0
  552. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/setup.cfg +0 -0
  553. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/sonar-project.properties +0 -0
  554. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/style/README.md +0 -0
  555. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/style/boost.css +0 -0
  556. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/style/boost.js +0 -0
  557. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/style/demo.html +0 -0
  558. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/adapt.feature +0 -0
  559. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/browse.feature +0 -0
  560. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/count.feature +0 -0
  561. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/discover.feature +0 -0
  562. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/doctor.feature +0 -0
  563. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/environment.py +0 -0
  564. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/explain.feature +0 -0
  565. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/index.feature +0 -0
  566. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/install.feature +0 -0
  567. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/list.feature +0 -0
  568. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/mcp.feature +0 -0
  569. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/search.feature +0 -0
  570. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/steps/cli_steps.py +0 -0
  571. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/steps/discovery_steps.py +0 -0
  572. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/steps/mcp_steps.py +0 -0
  573. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/steps/quality_steps.py +0 -0
  574. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/conftest.py +0 -0
  575. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/eval/baseline.json +0 -0
  576. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/eval/explain.jsonl +0 -0
  577. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/eval/golden-natural.jsonl +0 -0
  578. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/eval/golden.jsonl +0 -0
  579. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/eval/recommend.jsonl +0 -0
  580. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/eval/taps-scale.txt +0 -0
  581. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/eval/taps.txt +0 -0
  582. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_capabilities_policy.py +0 -0
  583. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_adapt.py +0 -0
  584. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_bmad.py +0 -0
  585. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_catalog.py +0 -0
  586. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_chat.py +0 -0
  587. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_configuration.py +0 -0
  588. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_discovery.py +0 -0
  589. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_hooks.py +0 -0
  590. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_hooks_gemini.py +0 -0
  591. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_info.py +0 -0
  592. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_intelligence.py +0 -0
  593. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_pane_width.py +0 -0
  594. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_pkg.py +0 -0
  595. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_quality.py +0 -0
  596. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_taps.py +0 -0
  597. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_team.py +0 -0
  598. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_everyday_loop.py +0 -0
  599. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_integrity_enforce.py +0 -0
  600. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_kind_conformance.py +0 -0
  601. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_property_parsers.py +0 -0
  602. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_run.py +0 -0
  603. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_tap_signing.py +0 -0
  604. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_workspace_scope.py +0 -0
  605. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/README.md +0 -0
  606. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  607. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  608. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  609. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  610. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  611. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  612. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  613. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  614. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  615. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  616. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  617. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  618. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  619. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  620. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  621. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  622. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  623. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  624. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  625. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  626. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
  627. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
  628. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
  629. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/fuzz_frontmatter.py +0 -0
  630. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/fuzz_registry.py +0 -0
  631. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/langchain/conftest.py +0 -0
  632. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/langchain/test_graph.py +0 -0
  633. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/langchain/test_loader.py +0 -0
  634. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/langchain/test_retriever.py +0 -0
  635. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/make_fixture.py +0 -0
  636. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/perf/test_benchmarks.py +0 -0
  637. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/smoke.sh +0 -0
  638. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_a11y_check.py +0 -0
  639. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_action_pin_lockstep.py +0 -0
  640. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_adapters.py +0 -0
  641. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_adapters_multi.py +0 -0
  642. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_adapters_runner.py +0 -0
  643. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_agents.py +0 -0
  644. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_ai.py +0 -0
  645. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_bmad_core.py +0 -0
  646. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_boost_first_offer.py +0 -0
  647. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_bootstrap.py +0 -0
  648. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_branch_current.py +0 -0
  649. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_browse.py +0 -0
  650. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_builtin.py +0 -0
  651. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_capabilities.py +0 -0
  652. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_catalog.py +0 -0
  653. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_catalogbundle.py +0 -0
  654. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_chat.py +0 -0
  655. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_check_anchors.py +0 -0
  656. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_check_dco.py +0 -0
  657. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_check_licenses.py +0 -0
  658. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_check_reproducible.py +0 -0
  659. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_claude_settings.py +0 -0
  660. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_clean_internal_cache.py +0 -0
  661. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_cliparse.py +0 -0
  662. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_codeql_analysis_key.py +0 -0
  663. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_command_reference_fresh.py +0 -0
  664. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_community_health_files.py +0 -0
  665. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_compact.py +0 -0
  666. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_complete.py +0 -0
  667. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_complete_rc_block.py +0 -0
  668. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_config.py +0 -0
  669. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_content_dedupe.py +0 -0
  670. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_content_identity.py +0 -0
  671. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_crash_redaction.py +0 -0
  672. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dedup_trust.py +0 -0
  673. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_demo_index.py +0 -0
  674. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense.py +0 -0
  675. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense_embed_dedupe.py +0 -0
  676. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense_fallback.py +0 -0
  677. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense_fix_hint.py +0 -0
  678. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense_quantized.py +0 -0
  679. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense_ready_order.py +0 -0
  680. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense_shard_real_schema.py +0 -0
  681. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
  682. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense_shards.py +0 -0
  683. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense_status.py +0 -0
  684. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense_status_cheap.py +0 -0
  685. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dependabot_config.py +0 -0
  686. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_docs_pages_linked.py +0 -0
  687. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_docsite_chrome.py +0 -0
  688. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_ed25519.py +0 -0
  689. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_embed.py +0 -0
  690. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_embed_local.py +0 -0
  691. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_embed_truncated_response.py +0 -0
  692. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_entry_key.py +0 -0
  693. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_errors_and_cli_table.py +0 -0
  694. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_eval_baseline.py +0 -0
  695. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_eval_corpus.py +0 -0
  696. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_eval_faithfulness.py +0 -0
  697. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_eval_gate.py +0 -0
  698. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_eval_grading.py +0 -0
  699. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_eval_metrics.py +0 -0
  700. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_eval_stats_summary.py +0 -0
  701. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  702. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_faithfulness.py +0 -0
  703. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_frontmatter.py +0 -0
  704. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_fuzz_targets.py +0 -0
  705. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  706. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_gitleaks_config.py +0 -0
  707. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_gitutil.py +0 -0
  708. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_gitutil_lfs.py +0 -0
  709. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_gitutil_sparse.py +0 -0
  710. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_hook_settings_hosts.py +0 -0
  711. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_hookhost.py +0 -0
  712. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_imperative.py +0 -0
  713. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_import_budget.py +0 -0
  714. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_injectscan.py +0 -0
  715. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_install_permission_error.py +0 -0
  716. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_installscan.py +0 -0
  717. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_integrity.py +0 -0
  718. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_journal.py +0 -0
  719. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_langchain_packaging.py +0 -0
  720. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_link_ownership.py +0 -0
  721. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_localembed.py +0 -0
  722. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_localembed_e2e.py +0 -0
  723. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_lockfile.py +0 -0
  724. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_logs.py +0 -0
  725. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_marketing_counts.py +0 -0
  726. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_mcp.py +0 -0
  727. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_mcp_install_scan.py +0 -0
  728. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_mcpdecl.py +0 -0
  729. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_mcphost.py +0 -0
  730. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_measure_registry.py +0 -0
  731. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_minisign.py +0 -0
  732. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_mutation_shards.py +0 -0
  733. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_mutation_subfile_shards.py +0 -0
  734. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_mutmut_source_paths.py +0 -0
  735. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_nethttp.py +0 -0
  736. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_normalize_sdist.py +0 -0
  737. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_output.py +0 -0
  738. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_page_budget.py +0 -0
  739. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_paths.py +0 -0
  740. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_perf_gate.py +0 -0
  741. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_pkg_confusions.py +0 -0
  742. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_pkg_injection.py +0 -0
  743. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_pkg_secrets.py +0 -0
  744. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_platform_pins.py +0 -0
  745. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_policy.py +0 -0
  746. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_post_deploy_smoke.py +0 -0
  747. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_project_mcp_sidecar.py +0 -0
  748. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_projectlock.py +0 -0
  749. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_provenance.py +0 -0
  750. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_publish_golden_dataset.py +0 -0
  751. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_rag.py +0 -0
  752. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_rag_fastpath.py +0 -0
  753. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_rag_fusion.py +0 -0
  754. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_registries_fresh.py +0 -0
  755. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_registry.py +0 -0
  756. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_registry_categories.py +0 -0
  757. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_registry_control_chars.py +0 -0
  758. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_release_guard.py +0 -0
  759. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_release_preflight.py +0 -0
  760. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_required_checks.py +0 -0
  761. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_rerank_cache.py +0 -0
  762. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_resolve.py +0 -0
  763. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_roadmap_fresh.py +0 -0
  764. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_rules.py +0 -0
  765. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_scale_corpus.py +0 -0
  766. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_scopes.py +0 -0
  767. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_secretscan.py +0 -0
  768. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_selfupdate.py +0 -0
  769. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_serve.py +0 -0
  770. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_serve_docs.py +0 -0
  771. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_shards_matrix.py +0 -0
  772. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_smoke_covers_every_command.py +0 -0
  773. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_spdx_headers.py +0 -0
  774. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_spin.py +0 -0
  775. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_stackprobe.py +0 -0
  776. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_staleness.py +0 -0
  777. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_store.py +0 -0
  778. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_store_materialize.py +0 -0
  779. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_sync_blocked_links.py +0 -0
  780. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  781. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_token_parity.py +0 -0
  782. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_toolchain_lock.py +0 -0
  783. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_trustaudit.py +0 -0
  784. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_typosquat.py +0 -0
  785. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_updatediff.py +0 -0
  786. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_util.py +0 -0
  787. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_version.py +0 -0
  788. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_vex.py +0 -0
  789. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_visual_harness_flags.py +0 -0
  790. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_workflow_concurrency.py +0 -0
  791. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  792. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  793. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_workflow_timeouts.py +0 -0
  794. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_workflows.py +0 -0
  795. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  796. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/visual/a11y_check.mjs +0 -0
  797. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/visual/console_check.mjs +0 -0
  798. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/visual/package-lock.json +0 -0
  799. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/visual/package.json +0 -0
  800. {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/visual/visual_check.mjs +0 -0
@@ -79,6 +79,8 @@ lookups
79
79
  lowercasing
80
80
  Magento
81
81
  maintainer's
82
+ Matchers
83
+ matchers
82
84
  mcp
83
85
  mergeable
84
86
  minisign
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.37
3
+ Version: 1.2.39
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -1000,9 +1000,14 @@ the C4 diagrams in [`docs/architecture/`](docs/architecture/README.md).
1000
1000
  | Team & Collaboration | cohort · profile · protocol · pulse · replay · who |
1001
1001
 
1002
1002
  The AI-assisted commands (`search --smart`, `explain`, `distill`, `infer`,
1003
- `absorb`, `evolve`, `simulate`) call the `claude` CLI when it is on your PATH,
1004
- or use `ANTHROPIC_API_KEY`, and fall back to plain heuristics when neither is
1005
- available.
1003
+ `absorb`, `evolve`, `simulate`) use whichever assistant CLI you already have —
1004
+ `claude` first, then `gemini` — or `ANTHROPIC_API_KEY`, and fall back to plain
1005
+ heuristics when none is available. boost handles the differences: Gemini takes
1006
+ no separate system prompt, so it is folded into the message, and a model id
1007
+ belonging to another vendor is never passed through.
1008
+
1009
+ The retrieval and faithfulness evals were measured against Claude, so treat
1010
+ those floors as Claude-measured rather than a claim about every backend.
1006
1011
 
1007
1012
  ## boost as an MCP server
1008
1013
 
@@ -282,9 +282,14 @@ the C4 diagrams in [`docs/architecture/`](docs/architecture/README.md).
282
282
  | Team & Collaboration | cohort · profile · protocol · pulse · replay · who |
283
283
 
284
284
  The AI-assisted commands (`search --smart`, `explain`, `distill`, `infer`,
285
- `absorb`, `evolve`, `simulate`) call the `claude` CLI when it is on your PATH,
286
- or use `ANTHROPIC_API_KEY`, and fall back to plain heuristics when neither is
287
- available.
285
+ `absorb`, `evolve`, `simulate`) use whichever assistant CLI you already have —
286
+ `claude` first, then `gemini` — or `ANTHROPIC_API_KEY`, and fall back to plain
287
+ heuristics when none is available. boost handles the differences: Gemini takes
288
+ no separate system prompt, so it is folded into the message, and a model id
289
+ belonging to another vendor is never passed through.
290
+
291
+ The retrieval and faithfulness evals were measured against Claude, so treat
292
+ those floors as Claude-measured rather than a claim about every backend.
288
293
 
289
294
  ## boost as an MCP server
290
295
 
@@ -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.37'
22
- __version_tuple__ = version_tuple = (1, 2, 37)
21
+ __version__ = version = '1.2.39'
22
+ __version_tuple__ = version_tuple = (1, 2, 39)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -38,11 +38,25 @@ stage the installer in a temp dir and copy only the `bmad-*` skills into
38
38
  ~/.claude/skills, so $HOME never gets a stray `_bmad/`; the runtime is
39
39
  per-project by design.
40
40
 
41
- Both surfaces are **Claude Code only**, and deliberately so: subagent
42
- definitions and `SessionStart`/`UserPromptSubmit` hooks are Claude Code
43
- contracts with no equivalent in the other three agents boost targets, and BMAD's
44
- own installer likewise takes `--tools claude-code`. This is the one part of
45
- boost that does not fan out over `agents.enabled_agents()`.
41
+ The **hooks fan out; the personas do not**, and the split is not arbitrary.
42
+
43
+ A subagent definition is a Claude Code contract, and BMAD's own installer takes
44
+ `--tools claude-code`, so personas stay in `~/.claude/agents/`. Copying them
45
+ into Gemini's `agents/` slot would also ship files its schema rejects — that
46
+ slot validates, and a Claude-dialect persona fails it.
47
+
48
+ The hooks are a different case, and an earlier version of this docstring got it
49
+ wrong by lumping them together: it claimed `SessionStart` and
50
+ `UserPromptSubmit` had "no equivalent in the other three agents", which stopped
51
+ being true when `core/hookhost.py` learned Gemini's vocabulary. They map to
52
+ `SessionStart` and `BeforeAgent`, so `bmad on` now installs them on every host
53
+ with evidence of use, translating the event names and the timeout units on the
54
+ way. Matchers are *not* translated — `hookhost` passes them through
55
+ host-native — so Claude's `startup|resume|clear` source matcher is applied only
56
+ on Claude.
57
+
58
+ What that buys on a second host is prompt shaping, not full parity: the routing
59
+ banner names personas Gemini cannot spawn.
46
60
  """
47
61
  from __future__ import annotations
48
62
 
@@ -61,7 +75,7 @@ from pathlib import Path
61
75
  from .. import cliparse
62
76
  from ..core import bmad as core
63
77
  from ..core import claude_settings as cs
64
- from ..core import journal, paths, util
78
+ from ..core import hookhost, journal, paths, util
65
79
  from ..core import output as out
66
80
  from ..errors import BoostError
67
81
 
@@ -148,6 +162,74 @@ def _never_fails(command: str) -> str:
148
162
  return command + " || true"
149
163
 
150
164
 
165
+ def _hook_hosts(scope: str) -> list[str]:
166
+ """Hosts to write hooks into: Claude always, others on evidence of use.
167
+
168
+ Claude is unconditional. It is boost's primary host and the behaviour every
169
+ release before this one had, and the check cannot be `shutil.which` the way
170
+ `boost mcp register`'s is: that command *shells out* to `claude mcp add` and
171
+ genuinely cannot work without the binary, while this one only writes a
172
+ settings.json. A user running inside Claude Code whose launcher is not on
173
+ boost's PATH would otherwise silently get no hooks at all.
174
+
175
+ A second host earns its hooks by evidence that it is actually in use —
176
+ its CLI on PATH, or its dotdir already present. Writing into
177
+ `~/.gemini/settings.json` for someone who has never run Gemini is litter in
178
+ a file boost does not own. A host that appears later is picked up by the
179
+ next `boost bmad on`, which is idempotent.
180
+ """
181
+ chosen = [hookhost.CLAUDE]
182
+ for host in hookhost.hosts():
183
+ if host == hookhost.CLAUDE:
184
+ continue
185
+ dotdir = cs.settings_path(scope, host=host).parent
186
+ if shutil.which(hookhost.cli(host)) or dotdir.is_dir():
187
+ chosen.append(host)
188
+ return chosen
189
+
190
+
191
+ #: (Claude event, hook name, matcher). The matcher is Claude's own
192
+ #: `SessionStart` source vocabulary, and `hookhost` deliberately does not
193
+ #: translate matchers — they pass through host-native — so it is applied only
194
+ #: on the host it was written for. Omitting it elsewhere means "every start",
195
+ #: which is what a session briefing wants anyway.
196
+ _ORIENT_HOOK = ("SessionStart", HOOK_NAME, HOOK_MATCHER)
197
+ _ROUTE_HOOK = ("UserPromptSubmit", ROUTE_HOOK_NAME, None)
198
+
199
+
200
+ def _add_hook_everywhere(scope: str, spec: tuple, command: str) -> list[str]:
201
+ """Install one hook on every installed host. Returns the hosts written."""
202
+ event, name, matcher = spec
203
+ written = []
204
+ for host in _hook_hosts(scope):
205
+ target = hookhost.translate(host, event)
206
+ if target is None:
207
+ # Refused out loud rather than dropped: a hook the user asked for
208
+ # and silently never got is worse than one that cannot exist.
209
+ out.warn("%s has no counterpart for %s — skipped"
210
+ % (hookhost.label(host), event))
211
+ continue
212
+ cs.add_hook(scope, target, name, command,
213
+ matcher=matcher if host == hookhost.CLAUDE else None,
214
+ host=host)
215
+ written.append(host)
216
+ return written
217
+
218
+
219
+ def _remove_hook_everywhere(scope: str, *specs: tuple) -> None:
220
+ """Remove hooks from every host, installed or not.
221
+
222
+ Unlike install this does not filter on `shutil.which`: someone who removed
223
+ an agent CLI still wants boost's hooks gone from its settings.json, and
224
+ `remove_hook` against a file that was never written is a no-op.
225
+ """
226
+ for host in hookhost.hosts():
227
+ for event, name, _matcher in specs:
228
+ target = hookhost.translate(host, event)
229
+ if target is not None:
230
+ cs.remove_hook(scope, target, name, host=host)
231
+
232
+
151
233
  def _autopilot_on(scope) -> int:
152
234
  """The one command. Personas + orientation + router, in one idempotent pass.
153
235
 
@@ -160,11 +242,11 @@ def _autopilot_on(scope) -> int:
160
242
  slugs, skipped = core.write_personas(agents)
161
243
 
162
244
  launcher = shlex.quote(str(paths.launcher()))
163
- cs.add_hook(scope, "SessionStart", HOOK_NAME,
164
- _never_fails("%s bmad orient --scope %s" % (launcher, scope)),
165
- matcher=HOOK_MATCHER)
166
- cs.add_hook(scope, "UserPromptSubmit", ROUTE_HOOK_NAME,
167
- _never_fails("%s bmad route" % launcher))
245
+ hosts = _add_hook_everywhere(
246
+ scope, _ORIENT_HOOK,
247
+ _never_fails("%s bmad orient --scope %s" % (launcher, scope)))
248
+ _add_hook_everywhere(scope, _ROUTE_HOOK,
249
+ _never_fails("%s bmad route" % launcher))
168
250
  _set_scope_state(scope, autopilot=True, startup=True, personas=len(slugs),
169
251
  enabled_at=util.now_iso())
170
252
  journal.log("bmad-autopilot", "on", scope=scope, personas=len(slugs))
@@ -176,8 +258,11 @@ def _autopilot_on(scope) -> int:
176
258
  % (len(skipped), ", ".join(skipped)))
177
259
  out.dim(" delete the file to let `boost bmad on` restore the stock version")
178
260
  out.dim(" personas → %s" % paths.tilde(agents))
179
- out.dim(" hooks → %s (SessionStart + UserPromptSubmit)"
180
- % paths.tilde(cs.settings_path(scope)))
261
+ for host in hosts:
262
+ out.dim(" hooks → %s (%s + %s)"
263
+ % (paths.tilde(cs.settings_path(scope, host=host)),
264
+ hookhost.translate(host, "SessionStart"),
265
+ hookhost.translate(host, "UserPromptSubmit")))
181
266
  out.dim(" every substantive prompt now names its lead persona and its "
182
267
  "definition of done; trivial asks are left alone")
183
268
  # Claude Code only watches an agents dir that existed when the session
@@ -189,8 +274,7 @@ def _autopilot_on(scope) -> int:
189
274
 
190
275
  def _autopilot_off(scope) -> int:
191
276
  scope = scope or "global"
192
- cs.remove_hook(scope, "SessionStart", HOOK_NAME)
193
- cs.remove_hook(scope, "UserPromptSubmit", ROUTE_HOOK_NAME)
277
+ _remove_hook_everywhere(scope, _ORIENT_HOOK, _ROUTE_HOOK)
194
278
  removed = core.remove_personas(_agents_dir(scope))
195
279
  _set_scope_state(scope, autopilot=False, startup=False, personas=0)
196
280
  journal.log("bmad-autopilot", "off", scope=scope, personas=len(removed))
@@ -374,14 +458,15 @@ def _startup(value, scope) -> int:
374
458
  if value == "on":
375
459
  cmd = "%s bmad orient --scope %s" % (
376
460
  shlex.quote(str(paths.launcher())), scope)
377
- cs.add_hook(scope, "SessionStart", HOOK_NAME, cmd, matcher=HOOK_MATCHER)
461
+ started = _add_hook_everywhere(scope, _ORIENT_HOOK, cmd)
378
462
  _set_scope_state(scope, startup=True)
379
463
  journal.log("bmad-startup", "on", scope=scope)
380
464
  out.ok("BMAD startup ON (%s) — new sessions get orientation" % scope)
381
- out.dim(" hook → %s" % cs.settings_path(scope))
465
+ for host in started:
466
+ out.dim(" hook → %s" % cs.settings_path(scope, host=host))
382
467
  return 0
383
468
  if value == "off":
384
- cs.remove_hook(scope, "SessionStart", HOOK_NAME)
469
+ _remove_hook_everywhere(scope, _ORIENT_HOOK)
385
470
  _set_scope_state(scope, startup=False)
386
471
  journal.log("bmad-startup", "off", scope=scope)
387
472
  out.ok("BMAD startup OFF (%s) — skills stay installed" % scope)
@@ -419,8 +504,7 @@ def _uninstall(scope, yes) -> int:
419
504
  scope, " + _bmad/, _bmad-output/" if scope == "project" else ""))):
420
505
  out.info("aborted")
421
506
  return 0
422
- cs.remove_hook(scope, "SessionStart", HOOK_NAME)
423
- cs.remove_hook(scope, "UserPromptSubmit", ROUTE_HOOK_NAME)
507
+ _remove_hook_everywhere(scope, _ORIENT_HOOK, _ROUTE_HOOK)
424
508
  removed = _rm_skills(_skills_dir(scope))
425
509
  removed += len(core.remove_personas(_agents_dir(scope)))
426
510
  if scope == "project":
@@ -438,7 +522,7 @@ def _uninstall(scope, yes) -> int:
438
522
  def _disable(scope) -> int:
439
523
  """Quarantine: turn startup off and move skills aside (recoverable)."""
440
524
  scope = scope or "project"
441
- cs.remove_hook(scope, "SessionStart", HOOK_NAME)
525
+ _remove_hook_everywhere(scope, _ORIENT_HOOK)
442
526
  qdir = _quarantine_dir(scope)
443
527
  qdir.mkdir(parents=True, exist_ok=True)
444
528
  moved = 0
@@ -2,9 +2,21 @@
2
2
  # SPDX-License-Identifier: GPL-3.0-only
3
3
  """Optional AI bridge for the Intelligence commands and --smart ranking.
4
4
 
5
- Strategy: prefer the `claude` CLI if on PATH, else the Anthropic API via
6
- urllib when ANTHROPIC_API_KEY is set, else return None so every caller
7
- degrades to its non-AI fallback.
5
+ Strategy: use the first assistant CLI on PATH that `core/aihost.py` knows —
6
+ Claude first, then Gemini — else the Anthropic API via urllib when
7
+ ANTHROPIC_API_KEY is set, else return None so every caller degrades to its
8
+ non-AI fallback.
9
+
10
+ The second CLI is why `aihost` exists. Before it, a user running Gemini got the
11
+ heuristic fallback from every AI-assisted command even with a perfectly good
12
+ assistant installed, because this module only ever spelled "claude". The
13
+ per-backend differences that would otherwise be bugs — Gemini has no
14
+ `--append-system-prompt`, and `ai.model` holds a Claude id that `gemini -m`
15
+ would reject — are handled there, as data.
16
+
17
+ The direct-API path stays Anthropic-only. Someone using Gemini CLI has the
18
+ binary by definition, so the CLI route is the one that matters; a second HTTP
19
+ client is a separate change with its own wire format and error taxonomy.
8
20
  """
9
21
  from __future__ import annotations
10
22
 
@@ -15,7 +27,7 @@ import subprocess
15
27
  import urllib.error
16
28
  import urllib.request
17
29
 
18
- from . import config, logs, nethttp
30
+ from . import aihost, config, logs, nethttp
19
31
 
20
32
  API_URL = "https://api.anthropic.com/v1/messages"
21
33
 
@@ -30,22 +42,33 @@ def enabled() -> bool:
30
42
 
31
43
 
32
44
  def available() -> bool:
33
- """Return True when AI is enabled and a backend exists: the `claude`
34
-
35
- CLI on PATH or ANTHROPIC_API_KEY set.
36
- """
45
+ """Return True when AI is enabled and some backend exists."""
37
46
  return enabled() and (has_cli() or bool(os.environ.get("ANTHROPIC_API_KEY")))
38
47
 
39
48
 
49
+ def cli_backend() -> str | None:
50
+ """The first assistant CLI on PATH, in `aihost` preference order."""
51
+ for name in aihost.backends():
52
+ if shutil.which(aihost.cli(name)):
53
+ return name
54
+ return None
55
+
56
+
40
57
  def has_cli() -> bool:
41
- """Return True when the `claude` CLI is on PATH."""
42
- return shutil.which("claude") is not None
58
+ """Return True when any assistant CLI `aihost` knows is on PATH."""
59
+ return cli_backend() is not None
43
60
 
44
61
 
45
62
  def fallback_note() -> str:
46
- """Return the one-line hint shown when a command degrades to heuristics."""
47
- return ("AI features need the `claude` CLI on PATH or ANTHROPIC_API_KEY set "
48
- "— using the heuristic fallback")
63
+ """Return the one-line hint shown when a command degrades to heuristics.
64
+
65
+ Names every CLI that would work, not just Claude's — telling a Gemini user
66
+ to install Claude is a worse answer than telling them boost could not find
67
+ either.
68
+ """
69
+ clis = " or ".join("`%s`" % aihost.cli(n) for n in aihost.backends())
70
+ return ("AI features need one of %s on PATH, or ANTHROPIC_API_KEY set "
71
+ "— using the heuristic fallback" % clis)
49
72
 
50
73
 
51
74
  def ask(prompt: str, system: str | None = None, model: str | None = None,
@@ -54,8 +77,9 @@ def ask(prompt: str, system: str | None = None, model: str | None = None,
54
77
  if not enabled():
55
78
  return None
56
79
  model = model or str(config.get("ai.model"))
57
- if has_cli():
58
- text = _ask_cli(prompt, system, model, timeout)
80
+ backend = cli_backend()
81
+ if backend:
82
+ text = _ask_cli(backend, prompt, system, model, timeout)
59
83
  if text:
60
84
  return text
61
85
  if os.environ.get("ANTHROPIC_API_KEY"):
@@ -88,26 +112,27 @@ def _stderr_excerpt(text: str | None) -> str:
88
112
  return (s[:STDERR_LOG_CHARS] + "...") if len(s) > STDERR_LOG_CHARS else s
89
113
 
90
114
 
91
- def _ask_cli(prompt: str, system: str | None, model: str,
115
+ def _ask_cli(backend: str, prompt: str, system: str | None, model: str,
92
116
  timeout: int) -> str | None:
93
- cmd = ["claude", "-p", "--model", model, "--output-format", "text"]
94
- if system:
95
- cmd += ["--append-system-prompt", system]
117
+ cmd = aihost.argv(backend, model, system)
118
+ # A backend with no system flag takes the text folded into the prompt.
119
+ body = aihost.fold_system(backend, system, prompt)
120
+ who = "%s CLI" % aihost.cli(backend)
96
121
  try:
97
- proc = subprocess.run(cmd, input=prompt, capture_output=True,
122
+ proc = subprocess.run(cmd, input=body, capture_output=True,
98
123
  text=True, timeout=timeout)
99
124
  except (subprocess.TimeoutExpired, OSError) as e:
100
125
  # The exception TYPE only, never str(e): TimeoutExpired stringifies the
101
- # whole argv, which carries the --append-system-prompt text with it.
102
- _log_failure("claude CLI", type(e).__name__)
126
+ # whole argv, which carries the system-prompt text with it.
127
+ _log_failure(who, type(e).__name__)
103
128
  return None
104
129
  if proc.returncode != 0:
105
- _log_failure("claude CLI", "exit %d: %s"
130
+ _log_failure(who, "exit %d: %s"
106
131
  % (proc.returncode, _stderr_excerpt(proc.stderr)))
107
132
  return None
108
133
  out = proc.stdout.strip()
109
134
  if not out:
110
- _log_failure("claude CLI", "empty reply")
135
+ _log_failure(who, "empty reply")
111
136
  return None
112
137
  return out
113
138
 
@@ -0,0 +1,154 @@
1
+ #!/usr/bin/env python3
2
+ # Copyright the boost contributors.
3
+ # SPDX-License-Identifier: GPL-3.0-only
4
+ """Per-assistant-CLI facts for the AI bridge — a pure table, like `hookhost`.
5
+
6
+ `core/ai.py` knew exactly one backend: the `claude` CLI, or the Anthropic API
7
+ via ANTHROPIC_API_KEY. Every AI-assisted command therefore degraded to its
8
+ heuristic fallback for a user running Gemini CLI, even though Gemini exposes
9
+ the same headless contract. Skills, MCP, rules, workflows and hooks all fan out
10
+ across hosts; this was the last surface that did not, and it is the one a user
11
+ notices, because the fallback is visibly worse prose.
12
+
13
+ Three per-backend facts do the work, and each is a difference that would
14
+ otherwise be a bug:
15
+
16
+ * **The system prompt.** Claude takes `--append-system-prompt`. Gemini has no
17
+ equivalent, so the system text has to be folded into the prompt body. Passing
18
+ an unknown flag would make every call fail with a usage error rather than
19
+ degrade — the one outcome worse than having no AI at all.
20
+ * **The model id.** `ai.model` defaults to a Claude model name, and handing
21
+ that to `gemini -m` is an error, not a fallback. A backend only receives a
22
+ model id it owns; otherwise the flag is omitted and the CLI picks its own
23
+ default.
24
+ * **Order.** Claude is first, and that is behaviour rather than taste: someone
25
+ with both CLIs installed had Claude answering before this table existed, and
26
+ reordering would silently change every result they get.
27
+
28
+ The direct-API path in `ai.py` stays Anthropic-only. A user of Gemini CLI has
29
+ the `gemini` binary by definition, so the CLI route is the one that matters
30
+ here; a second HTTP client is a separate, larger change with its own wire
31
+ format and error taxonomy.
32
+ """
33
+ from __future__ import annotations
34
+
35
+ from ..errors import BoostError
36
+
37
+ CLAUDE = "claude"
38
+ GEMINI = "gemini"
39
+
40
+ #: Ordered: the first installed backend wins. See the module docstring on why
41
+ #: Claude must stay at the front.
42
+ BACKENDS: dict[str, dict] = {
43
+ CLAUDE: {
44
+ "cli": "claude",
45
+ "label": "Claude Code",
46
+ "prompt_flag": "-p",
47
+ "model_flag": "--model",
48
+ # Model ids this backend accepts. `ai.model` is a Claude id today, so
49
+ # this is what keeps it from being handed to another CLI.
50
+ "model_prefixes": ("claude", "sonnet", "opus", "haiku"),
51
+ "output_flags": ("--output-format", "text"),
52
+ "system_flag": "--append-system-prompt",
53
+ "key_env": "ANTHROPIC_API_KEY",
54
+ },
55
+ GEMINI: {
56
+ "cli": "gemini",
57
+ "label": "Gemini CLI",
58
+ "prompt_flag": "-p",
59
+ "model_flag": "-m",
60
+ "model_prefixes": ("gemini",),
61
+ "output_flags": ("-o", "text"),
62
+ # No equivalent flag. `fold_system` puts the text in the prompt.
63
+ "system_flag": "",
64
+ "key_env": "GEMINI_API_KEY",
65
+ },
66
+ }
67
+
68
+
69
+ def backends() -> list[str]:
70
+ """Known backend ids, in preference order."""
71
+ return list(BACKENDS)
72
+
73
+
74
+ def spec(name: str) -> dict:
75
+ """The table row for ``name``, or a BoostError naming the alternatives."""
76
+ try:
77
+ return BACKENDS[name]
78
+ except KeyError:
79
+ raise BoostError(
80
+ "unknown AI backend %r" % name,
81
+ hint="use one of: %s" % ", ".join(backends())) from None
82
+
83
+
84
+ def cli(name: str) -> str:
85
+ """The executable to run for ``name``."""
86
+ return str(spec(name)["cli"])
87
+
88
+
89
+ def label(name: str) -> str:
90
+ """Display name for ``name`` (``gemini`` -> "Gemini CLI")."""
91
+ return str(spec(name)["label"])
92
+
93
+
94
+ def key_env(name: str) -> str:
95
+ """The API-key environment variable ``name`` reads."""
96
+ return str(spec(name)["key_env"])
97
+
98
+
99
+ def takes_system_flag(name: str) -> bool:
100
+ """Whether ``name`` accepts a separate system prompt."""
101
+ return bool(spec(name)["system_flag"])
102
+
103
+
104
+ def owns_model(name: str, model: str | None) -> bool:
105
+ """Whether ``model`` is an id ``name`` clearly owns."""
106
+ if not model:
107
+ return False
108
+ return model.lower().startswith(tuple(spec(name)["model_prefixes"]))
109
+
110
+
111
+ def accepts_model(name: str, model: str | None) -> bool:
112
+ """Whether to hand ``model`` to ``name``.
113
+
114
+ The rule is "not another vendor's", not "one of mine". An id that no
115
+ backend claims — a custom alias, a pinned snapshot, anything a user passes
116
+ to `--model` — goes through untouched, because refusing it would silently
117
+ drop an override the user asked for. Only an id another backend plainly
118
+ owns is withheld: `ai.model` defaults to a Claude name, and `gemini -m
119
+ claude-sonnet-4-5` is an error rather than a fallback.
120
+ """
121
+ if not model:
122
+ return False
123
+ if owns_model(name, model):
124
+ return True
125
+ return not any(owns_model(other, model)
126
+ for other in backends() if other != name)
127
+
128
+
129
+ def fold_system(name: str, system: str | None, prompt: str) -> str:
130
+ """The prompt to send, with ``system`` folded in when there is no flag.
131
+
132
+ Returned unchanged for a backend that takes a system flag, so Claude's
133
+ request is byte-for-byte what it has always been.
134
+ """
135
+ if not system or takes_system_flag(name):
136
+ return prompt
137
+ return "%s\n\n%s" % (system, prompt)
138
+
139
+
140
+ def argv(name: str, model: str | None, system: str | None) -> list[str]:
141
+ """The command line for ``name``, minus the prompt (which goes on stdin).
142
+
143
+ ``model`` is passed unless another backend plainly owns the id (see
144
+ `accepts_model`), and ``system`` only when this backend has a flag for one
145
+ — `fold_system` handles the other case.
146
+ """
147
+ row = spec(name)
148
+ cmd = [str(row["cli"]), str(row["prompt_flag"])]
149
+ if accepts_model(name, model):
150
+ cmd += [str(row["model_flag"]), str(model)]
151
+ cmd += [str(x) for x in row["output_flags"]]
152
+ if system and row["system_flag"]:
153
+ cmd += [str(row["system_flag"]), system]
154
+ return cmd
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.37
3
+ Version: 1.2.39
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -1000,9 +1000,14 @@ the C4 diagrams in [`docs/architecture/`](docs/architecture/README.md).
1000
1000
  | Team & Collaboration | cohort · profile · protocol · pulse · replay · who |
1001
1001
 
1002
1002
  The AI-assisted commands (`search --smart`, `explain`, `distill`, `infer`,
1003
- `absorb`, `evolve`, `simulate`) call the `claude` CLI when it is on your PATH,
1004
- or use `ANTHROPIC_API_KEY`, and fall back to plain heuristics when neither is
1005
- available.
1003
+ `absorb`, `evolve`, `simulate`) use whichever assistant CLI you already have —
1004
+ `claude` first, then `gemini` — or `ANTHROPIC_API_KEY`, and fall back to plain
1005
+ heuristics when none is available. boost handles the differences: Gemini takes
1006
+ no separate system prompt, so it is folded into the message, and a model id
1007
+ belonging to another vendor is never passed through.
1008
+
1009
+ The retrieval and faithfulness evals were measured against Claude, so treat
1010
+ those floors as Claude-measured rather than a claim about every backend.
1006
1011
 
1007
1012
  ## boost as an MCP server
1008
1013
 
@@ -56,6 +56,7 @@ boost_cli/core/__init__.py
56
56
  boost_cli/core/adapters.py
57
57
  boost_cli/core/agents.py
58
58
  boost_cli/core/ai.py
59
+ boost_cli/core/aihost.py
59
60
  boost_cli/core/bmad.py
60
61
  boost_cli/core/bootstrap.py
61
62
  boost_cli/core/browse.py
@@ -202,6 +203,7 @@ docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md
202
203
  docs/roadmap/items/actionlint-skips-shellcheck-silently.md
203
204
  docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md
204
205
  docs/roadmap/items/agents-field-records-the-request-not-the-links.md
206
+ docs/roadmap/items/ai-backend-fanout.md
205
207
  docs/roadmap/items/ai-bridge-silent-failure-logging.md
206
208
  docs/roadmap/items/ambiguous-tap-short-name-resolution.md
207
209
  docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md
@@ -210,6 +212,7 @@ docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md
210
212
  docs/roadmap/items/bm25-has-no-stemming.md
211
213
  docs/roadmap/items/bm25-index-is-one-json-blob.md
212
214
  docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md
215
+ docs/roadmap/items/bmad-hooks-all-hosts.md
213
216
  docs/roadmap/items/boost-first-carried-the-losing-trigger.md
214
217
  docs/roadmap/items/boost-first-rule.md
215
218
  docs/roadmap/items/boost-langchain-publishing.md
@@ -574,6 +577,7 @@ tests/eval/golden.jsonl
574
577
  tests/eval/recommend.jsonl
575
578
  tests/eval/taps-scale.txt
576
579
  tests/eval/taps.txt
580
+ tests/functional/test_bmad_all_hosts.py
577
581
  tests/functional/test_capabilities_policy.py
578
582
  tests/functional/test_cli_adapt.py
579
583
  tests/functional/test_cli_bmad.py
@@ -635,6 +639,7 @@ tests/unit/test_adapters_multi.py
635
639
  tests/unit/test_adapters_runner.py
636
640
  tests/unit/test_agents.py
637
641
  tests/unit/test_ai.py
642
+ tests/unit/test_aihost.py
638
643
  tests/unit/test_bmad_core.py
639
644
  tests/unit/test_boost_first_offer.py
640
645
  tests/unit/test_bootstrap.py
@@ -48,9 +48,9 @@ boost bmad on
48
48
  ```
49
49
 
50
50
  It writes seven BMAD persona subagents into `~/.claude/agents/` and installs two
51
- hooks. A `SessionStart` hook briefs the session on the roster. A
52
- `UserPromptSubmit` hook classifies each incoming prompt and prefixes it with a
53
- short routing banner:
51
+ hooks on every host it finds. A `SessionStart` hook briefs the session on the
52
+ roster. A `UserPromptSubmit` hook classifies each incoming prompt and prefixes
53
+ it with a short routing banner:
54
54
 
55
55
  ```text
56
56
  [BMAD autopilot] track: build
@@ -92,6 +92,33 @@ contents, so the moment you edit one it stops being boost's. `boost bmad on`
92
92
  reports it as kept rather than overwriting it, and `boost bmad off` leaves it
93
93
  alone. Delete the file if you want the stock version back.
94
94
 
95
+ ### Which hosts get the hooks
96
+
97
+ `boost bmad on` writes its two hooks into every host it has evidence you use,
98
+ and re-running it changes nothing that is already correct.
99
+
100
+ - **Claude always.** It is boost's primary host, and the check deliberately is
101
+ not "is the `claude` binary on `PATH`" — `bmad on` only writes a
102
+ settings.json, so someone running inside Claude Code whose launcher is not on
103
+ boost's `PATH` would otherwise silently get no hooks. (`boost mcp register`
104
+ does gate on the binary, because it shells out to `claude mcp add` and
105
+ genuinely cannot work without it.)
106
+ - **Any other host on evidence of use** — its CLI on `PATH`, or its dotdir
107
+ already there. Writing into `~/.gemini/settings.json` for someone who has
108
+ never run Gemini is litter in a file boost does not own. Install that agent
109
+ later and the next `boost bmad on` picks it up.
110
+
111
+ boost translates on the way in. `UserPromptSubmit` is written as Gemini's
112
+ `BeforeAgent`, and `--timeout 10` means ten seconds on both hosts even though
113
+ Gemini's field is milliseconds. Matchers are **not** translated — they pass
114
+ through host-native — so Claude's `startup|resume|clear` source matcher is
115
+ applied only on Claude, where that vocabulary exists.
116
+
117
+ **The personas stay Claude-only.** A subagent definition is a Claude Code
118
+ contract, and Gemini's `agents/` slot validates its input, so a Claude-dialect
119
+ persona would be rejected. What a second host gets is prompt shaping: the
120
+ routing banner arrives and names a lead persona, but Gemini cannot spawn it.
121
+
95
122
  ## The full BMAD method
96
123
 
97
124
  The method itself is a separate, heavier install. `boost bmad install` delegates