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