boost-skill-cli 1.0.421__tar.gz → 1.0.423__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 (665) hide show
  1. {boost_skill_cli-1.0.421/boost_skill_cli.egg-info → boost_skill_cli-1.0.423}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/configuration.py +152 -14
  4. boost_skill_cli-1.0.423/boost_cli/core/builtin.py +114 -0
  5. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/catalog.py +22 -0
  6. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/mcp.py +128 -1
  7. boost_skill_cli-1.0.423/boost_cli/data/rules/boost-first.mdc +35 -0
  8. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423/boost_skill_cli.egg-info}/PKG-INFO +1 -1
  9. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_skill_cli.egg-info/SOURCES.txt +6 -0
  10. boost_skill_cli-1.0.423/docs/demo.gif +0 -0
  11. boost_skill_cli-1.0.423/docs/roadmap/items/boost-first-rule.md +73 -0
  12. boost_skill_cli-1.0.423/docs/roadmap/items/mcp-already-covered-defeater.md +77 -0
  13. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap.html +145 -1
  14. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/pyproject.toml +1 -1
  15. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/environment.py +3 -1
  16. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/conftest.py +5 -0
  17. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_configuration.py +8 -1
  18. boost_skill_cli-1.0.423/tests/unit/test_boost_first_offer.py +179 -0
  19. boost_skill_cli-1.0.423/tests/unit/test_builtin.py +169 -0
  20. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_catalog.py +38 -0
  21. boost_skill_cli-1.0.423/tests/unit/test_mcp.py +1100 -0
  22. boost_skill_cli-1.0.421/docs/demo.gif +0 -0
  23. boost_skill_cli-1.0.421/tests/unit/test_mcp.py +0 -584
  24. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.gitattributes +0 -0
  25. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.gitignore +0 -0
  26. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.gitleaks.toml +0 -0
  27. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.htmlvalidate.json +0 -0
  28. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.lighthouserc.json +0 -0
  29. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.lycheeignore +0 -0
  30. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.markdownlint-cli2.jsonc +0 -0
  31. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.pre-commit-config.yaml +0 -0
  32. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.stylelintrc.json +0 -0
  33. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.vale/styles/boost/Terminology.yml +0 -0
  34. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  35. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.vale.ini +0 -0
  36. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/CLAUDE.md +0 -0
  37. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/CODE_OF_CONDUCT.md +0 -0
  38. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/CONTRIBUTING.md +0 -0
  39. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/LICENSE +0 -0
  40. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/MANIFEST.in +0 -0
  41. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/Makefile +0 -0
  42. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/README.md +0 -0
  43. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/SECURITY.md +0 -0
  44. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost +0 -0
  45. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/__init__.py +0 -0
  46. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/__main__.py +0 -0
  47. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/cli.py +0 -0
  48. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/cliparse.py +0 -0
  49. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/__init__.py +0 -0
  50. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/_common.py +0 -0
  51. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/bmad.py +0 -0
  52. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/discovery.py +0 -0
  53. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/hooks.py +0 -0
  54. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/info.py +0 -0
  55. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/intelligence.py +0 -0
  56. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/pkg.py +0 -0
  57. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/quality.py +0 -0
  58. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/run.py +0 -0
  59. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/safety.py +0 -0
  60. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/taps.py +0 -0
  61. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/team.py +0 -0
  62. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/__init__.py +0 -0
  63. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/adapters.py +0 -0
  64. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/agents.py +0 -0
  65. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/ai.py +0 -0
  66. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/bmad.py +0 -0
  67. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/bootstrap.py +0 -0
  68. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/capabilities.py +0 -0
  69. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/chat.py +0 -0
  70. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/claude_settings.py +0 -0
  71. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/complete.py +0 -0
  72. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/config.py +0 -0
  73. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/dense.py +0 -0
  74. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/ed25519.py +0 -0
  75. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/embed.py +0 -0
  76. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/faithfulness.py +0 -0
  77. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/frontmatter.py +0 -0
  78. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/gitutil.py +0 -0
  79. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/imperative.py +0 -0
  80. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/injectscan.py +0 -0
  81. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/installscan.py +0 -0
  82. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/integrity.py +0 -0
  83. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/journal.py +0 -0
  84. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/localembed.py +0 -0
  85. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/lockfile.py +0 -0
  86. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/logs.py +0 -0
  87. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/mcpdecl.py +0 -0
  88. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/mcphost.py +0 -0
  89. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/minisign.py +0 -0
  90. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/nethttp.py +0 -0
  91. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/output.py +0 -0
  92. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/paths.py +0 -0
  93. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/policy.py +0 -0
  94. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/projectlock.py +0 -0
  95. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/provenance.py +0 -0
  96. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/rag.py +0 -0
  97. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/registry.py +0 -0
  98. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/resolve.py +0 -0
  99. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/rules.py +0 -0
  100. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/scopes.py +0 -0
  101. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/secretscan.py +0 -0
  102. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/selfupdate.py +0 -0
  103. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/serve.py +0 -0
  104. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/stackprobe.py +0 -0
  105. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/staleness.py +0 -0
  106. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/store.py +0 -0
  107. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/trustaudit.py +0 -0
  108. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/typosquat.py +0 -0
  109. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/updatediff.py +0 -0
  110. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/util.py +0 -0
  111. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/workflows.py +0 -0
  112. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/data/registries.json +0 -0
  113. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/errors.py +0 -0
  114. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/spin.py +0 -0
  115. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_langchain/__init__.py +0 -0
  116. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_langchain/_compat.py +0 -0
  117. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_langchain/graph.py +0 -0
  118. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_langchain/loader.py +0 -0
  119. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_langchain/py.typed +0 -0
  120. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_langchain/retriever.py +0 -0
  121. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  122. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  123. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_skill_cli.egg-info/requires.txt +0 -0
  124. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_skill_cli.egg-info/top_level.txt +0 -0
  125. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/codecov.yml +0 -0
  126. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/.claude/settings.local.json +0 -0
  127. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/DEBUGGING.md +0 -0
  128. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/adapters.html +0 -0
  129. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/architecture/README.md +0 -0
  130. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/architecture/c4-components-core.md +0 -0
  131. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/architecture/c4-containers.md +0 -0
  132. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/architecture/c4-context.md +0 -0
  133. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/architecture/c4-dynamic-install.md +0 -0
  134. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/gifs/distill.gif +0 -0
  135. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/gifs/doctor.gif +0 -0
  136. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/gifs/explain.gif +0 -0
  137. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/gifs/hooks.gif +0 -0
  138. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/gifs/install.gif +0 -0
  139. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/gifs/pulse.gif +0 -0
  140. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/gifs/search.gif +0 -0
  141. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/gifs/tap.gif +0 -0
  142. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/tapes/distill.tape +0 -0
  143. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/tapes/doctor.tape +0 -0
  144. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/tapes/explain.tape +0 -0
  145. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/tapes/hooks.tape +0 -0
  146. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/tapes/install.tape +0 -0
  147. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/tapes/pulse.tape +0 -0
  148. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/tapes/search.tape +0 -0
  149. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/tapes/tap.tape +0 -0
  150. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel.html +0 -0
  151. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/chat.html +0 -0
  152. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/commands.html +0 -0
  153. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/demo-index.json +0 -0
  154. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/demo.html +0 -0
  155. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/demo.tape +0 -0
  156. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/design-roadmap.html +0 -0
  157. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/eval-latest.json +0 -0
  158. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/eval.html +0 -0
  159. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/index.html +0 -0
  160. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/langchain.html +0 -0
  161. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/mcp-hub.html +0 -0
  162. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/rag-architecture.md +0 -0
  163. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D01.md +0 -0
  164. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D02.md +0 -0
  165. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D03.md +0 -0
  166. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D04.md +0 -0
  167. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D05.md +0 -0
  168. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D06.md +0 -0
  169. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D07.md +0 -0
  170. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D08.md +0 -0
  171. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D09.md +0 -0
  172. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D10.md +0 -0
  173. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D11.md +0 -0
  174. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D12.md +0 -0
  175. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D13.md +0 -0
  176. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D14.md +0 -0
  177. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D15.md +0 -0
  178. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D16.md +0 -0
  179. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D17.md +0 -0
  180. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D18.md +0 -0
  181. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D19.md +0 -0
  182. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D20.md +0 -0
  183. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D21.md +0 -0
  184. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D22.md +0 -0
  185. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D23.md +0 -0
  186. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D24.md +0 -0
  187. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D25.md +0 -0
  188. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D26.md +0 -0
  189. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  190. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  191. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  192. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  193. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  194. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  195. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  196. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  197. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  198. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  199. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  200. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  201. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  202. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  203. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  204. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  205. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  206. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  207. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  208. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  209. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  210. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  211. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  212. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  213. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  214. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  215. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  216. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  217. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/command-carousel-page.md +0 -0
  218. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  219. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  220. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  221. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  222. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  223. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  224. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  225. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  226. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  227. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  228. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  229. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  230. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  231. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  232. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  233. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  234. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  235. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  236. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  237. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  238. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  239. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  240. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  241. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  242. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  243. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  244. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  245. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  246. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  247. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  248. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  249. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  250. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  251. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  252. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  253. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  254. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  255. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/github-community-health-files.md +0 -0
  256. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  257. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  258. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  259. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  260. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  261. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  262. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  263. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  264. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  265. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  266. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  267. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  268. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  269. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  270. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  271. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  272. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  273. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  274. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  275. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  276. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  277. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  278. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  279. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  280. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  281. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  282. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  283. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  284. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  285. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  286. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  287. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  288. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  289. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  290. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  291. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  292. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  293. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  294. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  295. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  296. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  297. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  298. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  299. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  300. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  301. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  302. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  303. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  304. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  305. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  306. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  307. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  308. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  309. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  310. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  311. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  312. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  313. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  314. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  315. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  316. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  317. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  318. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  319. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  320. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  321. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  322. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  323. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  324. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  325. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  326. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  327. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  328. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  329. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  330. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  331. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  332. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  333. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  334. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  335. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  336. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  337. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  338. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  339. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  340. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  341. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  342. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  343. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  344. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  345. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  346. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  347. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  348. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  349. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  350. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  351. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  352. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  353. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  354. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  355. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  356. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  357. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  358. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  359. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  360. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  361. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  362. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  363. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  364. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  365. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  366. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  367. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  368. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  369. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  370. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  371. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  372. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  373. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  374. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  375. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  376. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  377. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  378. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  379. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  380. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  381. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  382. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  383. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  384. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  385. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  386. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  387. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  388. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  389. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  390. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  391. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  392. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  393. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  394. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
  395. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  396. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  397. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  398. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  399. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  400. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  401. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  402. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  403. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  404. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  405. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  406. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  407. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  408. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  409. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  410. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  411. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  412. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/workspace-scope-install.md +0 -0
  413. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/zip-strict-audit.md +0 -0
  414. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  415. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/eslint.config.mjs +0 -0
  416. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/evals/README.md +0 -0
  417. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/evals/__init__.py +0 -0
  418. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/evals/baseline.json +0 -0
  419. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/evals/faithfulness.py +0 -0
  420. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/evals/golden_set.json +0 -0
  421. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/evals/make_corpus.py +0 -0
  422. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/evals/make_golden.py +0 -0
  423. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/evals/metrics.py +0 -0
  424. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/evals/publish_golden_dataset.py +0 -0
  425. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/evals/run_evals.py +0 -0
  426. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/examples/README.md +0 -0
  427. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/examples/adapt-demo.sh +0 -0
  428. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/examples/boost-run-prototype.sh +0 -0
  429. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/index.html +0 -0
  430. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/noxfile.py +0 -0
  431. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/coverage-tools.in +0 -0
  432. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/coverage-tools.txt +0 -0
  433. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/lint-tools.in +0 -0
  434. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/lint-tools.txt +0 -0
  435. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/mutation-tools.in +0 -0
  436. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/mutation-tools.txt +0 -0
  437. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/platform-pins.lock +0 -0
  438. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/release-tools.in +0 -0
  439. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/release-tools.txt +0 -0
  440. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/test-tools.in +0 -0
  441. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/test-tools.txt +0 -0
  442. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/a11y_check.py +0 -0
  443. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/bench_cli.sh +0 -0
  444. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/build_command_reference.py +0 -0
  445. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/build_demo_index.py +0 -0
  446. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/build_registries.py +0 -0
  447. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/build_roadmap.py +0 -0
  448. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/build_scale_corpus.py +0 -0
  449. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/check_anchors.py +0 -0
  450. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/check_licenses.py +0 -0
  451. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/check_required_checks.py +0 -0
  452. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/ensure_eval_corpus.sh +0 -0
  453. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/eval_corpus.py +0 -0
  454. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/eval_explain.py +0 -0
  455. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/eval_gate.py +0 -0
  456. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/eval_recommend.py +0 -0
  457. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/eval_retrieval.py +0 -0
  458. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/eval_stats_summary.py +0 -0
  459. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/import_budget.py +0 -0
  460. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/lock_toolchain.py +0 -0
  461. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/mutation_gate.py +0 -0
  462. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/mutation_shards.py +0 -0
  463. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/mutation_weights.json +0 -0
  464. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/page_budget.py +0 -0
  465. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/perf_gate.py +0 -0
  466. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/post_deploy_smoke.py +0 -0
  467. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/publish_eval_json.py +0 -0
  468. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/release_guard.py +0 -0
  469. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/release_preflight.py +0 -0
  470. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/serve_docs.py +0 -0
  471. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/setup.cfg +0 -0
  472. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/sonar-project.properties +0 -0
  473. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/style/README.md +0 -0
  474. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/style/boost.css +0 -0
  475. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/style/boost.js +0 -0
  476. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/style/demo.html +0 -0
  477. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/adapt.feature +0 -0
  478. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/browse.feature +0 -0
  479. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/count.feature +0 -0
  480. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/discover.feature +0 -0
  481. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/doctor.feature +0 -0
  482. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/explain.feature +0 -0
  483. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/index.feature +0 -0
  484. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/install.feature +0 -0
  485. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/list.feature +0 -0
  486. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/mcp.feature +0 -0
  487. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/search.feature +0 -0
  488. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/steps/cli_steps.py +0 -0
  489. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/steps/discovery_steps.py +0 -0
  490. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/steps/mcp_steps.py +0 -0
  491. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/steps/quality_steps.py +0 -0
  492. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/eval/baseline.json +0 -0
  493. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/eval/explain.jsonl +0 -0
  494. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/eval/golden-natural.jsonl +0 -0
  495. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/eval/golden.jsonl +0 -0
  496. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/eval/recommend.jsonl +0 -0
  497. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/eval/taps-scale.txt +0 -0
  498. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/eval/taps.txt +0 -0
  499. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_capabilities_policy.py +0 -0
  500. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_adapt.py +0 -0
  501. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_bmad.py +0 -0
  502. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_chat.py +0 -0
  503. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_discovery.py +0 -0
  504. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_hooks.py +0 -0
  505. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_info.py +0 -0
  506. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_intelligence.py +0 -0
  507. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_pkg.py +0 -0
  508. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_quality.py +0 -0
  509. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_taps.py +0 -0
  510. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_team.py +0 -0
  511. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_everyday_loop.py +0 -0
  512. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_integrity_enforce.py +0 -0
  513. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_kind_conformance.py +0 -0
  514. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_property_parsers.py +0 -0
  515. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_run.py +0 -0
  516. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_tap_signing.py +0 -0
  517. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_workspace_scope.py +0 -0
  518. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/README.md +0 -0
  519. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  520. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  521. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  522. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  523. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  524. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  525. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  526. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  527. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  528. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  529. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  530. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  531. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  532. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  533. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  534. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  535. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  536. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  537. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  538. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  539. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/fuzz_frontmatter.py +0 -0
  540. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/fuzz_registry.py +0 -0
  541. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/langchain/conftest.py +0 -0
  542. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/langchain/test_graph.py +0 -0
  543. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/langchain/test_loader.py +0 -0
  544. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/langchain/test_retriever.py +0 -0
  545. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/make_fixture.py +0 -0
  546. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/perf/test_benchmarks.py +0 -0
  547. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/smoke.sh +0 -0
  548. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_a11y_check.py +0 -0
  549. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_adapters.py +0 -0
  550. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_adapters_multi.py +0 -0
  551. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_adapters_runner.py +0 -0
  552. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_agents.py +0 -0
  553. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_ai.py +0 -0
  554. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_bmad_core.py +0 -0
  555. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_bootstrap.py +0 -0
  556. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_capabilities.py +0 -0
  557. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_chat.py +0 -0
  558. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_check_anchors.py +0 -0
  559. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_check_licenses.py +0 -0
  560. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_claude_settings.py +0 -0
  561. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_cliparse.py +0 -0
  562. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_codeql_analysis_key.py +0 -0
  563. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_command_reference_fresh.py +0 -0
  564. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_community_health_files.py +0 -0
  565. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_complete.py +0 -0
  566. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_config.py +0 -0
  567. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_content_dedupe.py +0 -0
  568. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_dedup_trust.py +0 -0
  569. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_demo_index.py +0 -0
  570. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_dense.py +0 -0
  571. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_dense_fallback.py +0 -0
  572. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_dense_fix_hint.py +0 -0
  573. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_dense_shards.py +0 -0
  574. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_dense_status.py +0 -0
  575. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_dependabot_config.py +0 -0
  576. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_docs_pages_linked.py +0 -0
  577. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_docsite_chrome.py +0 -0
  578. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_ed25519.py +0 -0
  579. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_embed.py +0 -0
  580. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_embed_local.py +0 -0
  581. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_entry_key.py +0 -0
  582. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_errors_and_cli_table.py +0 -0
  583. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_eval_baseline.py +0 -0
  584. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_eval_corpus.py +0 -0
  585. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_eval_faithfulness.py +0 -0
  586. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_eval_gate.py +0 -0
  587. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_eval_grading.py +0 -0
  588. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_eval_metrics.py +0 -0
  589. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_eval_stats_summary.py +0 -0
  590. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_faithfulness.py +0 -0
  591. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_frontmatter.py +0 -0
  592. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_fuzz_targets.py +0 -0
  593. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_gitleaks_config.py +0 -0
  594. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_gitutil.py +0 -0
  595. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_imperative.py +0 -0
  596. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_import_budget.py +0 -0
  597. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_injectscan.py +0 -0
  598. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_installscan.py +0 -0
  599. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_integrity.py +0 -0
  600. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_journal.py +0 -0
  601. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_langchain_packaging.py +0 -0
  602. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_link_ownership.py +0 -0
  603. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_localembed.py +0 -0
  604. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_localembed_e2e.py +0 -0
  605. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_lockfile.py +0 -0
  606. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_logs.py +0 -0
  607. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_marketing_counts.py +0 -0
  608. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_mcp_install_scan.py +0 -0
  609. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_mcpdecl.py +0 -0
  610. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_mcphost.py +0 -0
  611. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_minisign.py +0 -0
  612. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_mutation_hardening.py +0 -0
  613. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_mutation_shards.py +0 -0
  614. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_mutation_subfile_shards.py +0 -0
  615. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_mutmut_source_paths.py +0 -0
  616. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_nethttp.py +0 -0
  617. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_output.py +0 -0
  618. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_page_budget.py +0 -0
  619. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_paths.py +0 -0
  620. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_perf_gate.py +0 -0
  621. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_pkg_confusions.py +0 -0
  622. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_pkg_injection.py +0 -0
  623. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_pkg_secrets.py +0 -0
  624. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_platform_pins.py +0 -0
  625. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_policy.py +0 -0
  626. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_post_deploy_smoke.py +0 -0
  627. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_project_mcp_sidecar.py +0 -0
  628. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_projectlock.py +0 -0
  629. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_provenance.py +0 -0
  630. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_rag.py +0 -0
  631. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_rag_fusion.py +0 -0
  632. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_registries_fresh.py +0 -0
  633. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_registry.py +0 -0
  634. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_registry_categories.py +0 -0
  635. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_release_guard.py +0 -0
  636. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_release_preflight.py +0 -0
  637. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_required_checks.py +0 -0
  638. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_resolve.py +0 -0
  639. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_roadmap_fresh.py +0 -0
  640. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_rules.py +0 -0
  641. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_scale_corpus.py +0 -0
  642. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_scopes.py +0 -0
  643. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_secretscan.py +0 -0
  644. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_selfupdate.py +0 -0
  645. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_serve.py +0 -0
  646. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_serve_docs.py +0 -0
  647. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_spin.py +0 -0
  648. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_stackprobe.py +0 -0
  649. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_staleness.py +0 -0
  650. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_store.py +0 -0
  651. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_token_parity.py +0 -0
  652. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_toolchain_lock.py +0 -0
  653. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_trustaudit.py +0 -0
  654. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_typosquat.py +0 -0
  655. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_updatediff.py +0 -0
  656. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_util.py +0 -0
  657. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_version.py +0 -0
  658. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_workflow_concurrency.py +0 -0
  659. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_workflow_timeouts.py +0 -0
  660. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_workflows.py +0 -0
  661. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/visual/a11y_check.mjs +0 -0
  662. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/visual/console_check.mjs +0 -0
  663. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/visual/package-lock.json +0 -0
  664. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/visual/package.json +0 -0
  665. {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/visual/visual_check.mjs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.421
3
+ Version: 1.0.423
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.0.421'
22
- __version_tuple__ = version_tuple = (1, 0, 421)
21
+ __version__ = version = '1.0.423'
22
+ __version_tuple__ = version_tuple = (1, 0, 423)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -11,12 +11,14 @@ import subprocess
11
11
  import sys
12
12
  import time
13
13
  from datetime import datetime, timedelta
14
+ from itertools import chain
14
15
  from pathlib import Path
15
16
 
16
17
  from .. import __version__, cliparse
17
18
  from ..core import (
18
19
  agents,
19
20
  bootstrap,
21
+ builtin,
20
22
  catalog,
21
23
  complete,
22
24
  config,
@@ -32,6 +34,7 @@ from ..core import (
32
34
  policy,
33
35
  rag,
34
36
  registry,
37
+ rules,
35
38
  selfupdate,
36
39
  serve,
37
40
  store,
@@ -862,6 +865,15 @@ def _ranking_note(ranker: str) -> str:
862
865
  "enable it.)" % ranker)
863
866
 
864
867
 
868
+ # The label for the pre-RAG fallback below. `_ranking_note` needs a name for
869
+ # whatever produced the order, and this branch is neither engine it knows
870
+ # about: `catalog.search` scores names and descriptions from the tap caches
871
+ # because no index exists yet. `rag.rerank`'s own comment is the rule being
872
+ # followed — naming a specific wrong engine is worse than naming none, since
873
+ # the label is the only signal about which retrieval answered.
874
+ FRONTMATTER_RANKER = "frontmatter match, no index built yet"
875
+
876
+
865
877
  def _tool_search(args: dict):
866
878
  query = str(args.get("query", ""))
867
879
  rag.ensure() # build the full-content index on first use (BM25 by default)
@@ -882,27 +894,54 @@ def _tool_search(args: dict):
882
894
  # miss apart from a machine that has never been tapped — the two used to
883
895
  # share one sentence, and the fresh-install case is the one an agent reads
884
896
  # first and learns the most from.
885
- tapped = len(registry.list_taps())
897
+ tapped = builtin.configured_tap_count()
898
+ # The two retrieval branches converge on ONE render. They used to diverge:
899
+ # the RAG branch appended `_ranking_note`, and the frontmatter fallback
900
+ # appended nothing at all — so an agent on that path got ten lines with the
901
+ # exact shape of a reranked ten, and no way to tell. Both now carry the
902
+ # kind marker, the [installed] marker, the overlap note and a ranking note.
886
903
  if rag_result is not None: # full-content index is built
887
904
  hits, ranker = rag_result
888
- if not hits:
889
- return mcp.no_results(query, tapped=tapped), False
890
- lines = [mcp.hit_line(h["entry"]) for h in hits]
891
- lines.append(_ranking_note(ranker))
892
- return "\n".join(lines), False
893
- # no index yet -> keep today's frontmatter search so nothing regresses
894
- scored = catalog.search(query)[:10]
895
- if not scored:
905
+ entries = [h["entry"] for h in hits]
906
+ else: # no index yet -> today's frontmatter search, so nothing regresses
907
+ entries = [e for e, _score in catalog.search(query)[:10]]
908
+ ranker = FRONTMATTER_RANKER
909
+ if not entries:
910
+ # mcp.no_results owns the empty reply on both paths, including the
911
+ # untapped-machine branch that must not read as a genuine miss.
896
912
  return mcp.no_results(query, tapped=tapped), False
897
- return "\n".join(mcp.hit_line(e) for e, _score in scored), False
913
+ # Name-keyed, the same test `lockfile.find_any` and `store.install` apply —
914
+ # those are the tools this marker is advising about. mcp.hit_line's
915
+ # docstring records why the imprecision is disclosed rather than removed,
916
+ # and mcp.overlap_note is where the agent is told.
917
+ #
918
+ # One lock read for the whole reply, not one per hit: `find_any` re-reads
919
+ # and re-parses the file on every call, so the obvious `find_any(name)`
920
+ # inside this comprehension is ten reads of the same bytes. The union of
921
+ # the three sections is that same predicate, once.
922
+ installed_names = set(chain.from_iterable(lockfile.all_installed().values()))
923
+ marks = [e.get("name", "") in installed_names for e in entries]
924
+ lines = [mcp.hit_line(e, installed=m)
925
+ for e, m in zip(entries, marks, strict=True)]
926
+ note = mcp.overlap_note(sum(marks), len(entries))
927
+ if note:
928
+ lines.append(note)
929
+ lines.append(_ranking_note(ranker))
930
+ return "\n".join(lines), False
898
931
 
899
932
 
900
933
  def _tool_list(args: dict):
901
934
  # All three lock sections: "no skills installed" while `boost list` shows
902
935
  # a rule is the exact disagreement this surface must not have.
903
936
  everything = lockfile.all_installed()
937
+ # The footer reads the lock file and the tap list and nothing else — no
938
+ # catalog scan — so boost_list stays the instant, threshold-free tool that
939
+ # INSTRUCTIONS and its own description both promise. It lands in the empty
940
+ # state too: a machine with nothing installed is exactly where "what do I
941
+ # have" is least useful on its own.
942
+ footer = mcp.coverage_line(everything, tapped=builtin.configured_tap_count())
904
943
  if not any(everything.values()):
905
- return "nothing installed", False
944
+ return "nothing installed\n" + footer, False
906
945
  lines = []
907
946
  for kind, section in everything.items():
908
947
  for n, e in sorted(section.items()):
@@ -910,6 +949,7 @@ def _tool_list(args: dict):
910
949
  % (n, e.get("version", "?"), e.get("tap", "?"),
911
950
  "" if kind == "skill" else " [%s]" % kind,
912
951
  " [pinned]" if e.get("pinned") else ""))
952
+ lines.append(footer)
913
953
  return "\n".join(lines), False
914
954
 
915
955
 
@@ -991,7 +1031,13 @@ def _tool_doctor(args: dict):
991
1031
  # "items", not "skills": the default taps now carry rules and
992
1032
  # workflows too, so counting all of them as skills overstates one
993
1033
  # kind and hides the other two in the same breath.
994
- "taps: %d (%d items available)" % (len(taps), len(catalog.all_entries()))]
1034
+ #
1035
+ # Counted rather than measured off a list. `len(all_entries())`
1036
+ # concatenated every tap's cache — 71,655 entries on a real
1037
+ # install — to produce this one integer; `kind_counts` does the
1038
+ # same reads without the accumulation.
1039
+ "taps: %d (%d items available)"
1040
+ % (len(taps), sum(catalog.kind_counts().values()))]
995
1041
  for key, vals in plan.items():
996
1042
  if vals:
997
1043
  lines.append("%s: %s" % (key, ", ".join(str(v) for v in vals)))
@@ -1080,7 +1126,21 @@ REGISTRY.register(
1080
1126
  "locked in for everything after it: a new project or subsystem, an "
1081
1127
  "architecture decision, environment and tooling config, a linter or "
1082
1128
  "formatter, tests, CI. Also before writing a skill, subagent, "
1083
- "slash-command or rule from scratch. Read-only where it counts: it "
1129
+ "slash-command or rule from scratch. "
1130
+ # The defeater, sitting against the trigger list it defends rather than in
1131
+ # a paragraph of its own. A Gemini CLI session paraphrased that list back
1132
+ # — "a new project or subsystem, an architecture decision, environment and
1133
+ # tooling config" — and had still skipped the call, because two
1134
+ # pre-installed skills had already activated. The trigger fired and lost to
1135
+ # a predicate over the model's own context that boost had never written
1136
+ # down. It is a description, not a denial: an agent told "an active skill
1137
+ # is never enough" has been handed a standing order to search, which is the
1138
+ # capture the skip list and the stated cost exist to prevent.
1139
+ "What is already loaded is a different question: "
1140
+ "a skill that activated here was installed before this request existed, "
1141
+ "matched on its own description, and is one kind of three. Hits you "
1142
+ "already have come back marked [installed], so the reply keeps the two "
1143
+ "apart. Read-only where it counts: it "
1084
1144
  "installs nothing and touches nothing you are working on, though the first "
1085
1145
  "search builds a local index under ~/.boost. A hit commits you to nothing "
1086
1146
  "either: take what fits, discard the rest, the task stays yours. It costs "
@@ -1103,7 +1163,11 @@ REGISTRY.register(
1103
1163
  "The skills, rules and workflows already installed on this machine and "
1104
1164
  "usable this second — capability you own and may not know you own. "
1105
1165
  "Returns one line each: name, version, tap, a [rule] or [workflow] marker "
1106
- "where it is not a skill, and [pinned] where the version is held. "
1166
+ "where it is not a skill, and [pinned] where the version is held, then a "
1167
+ "closing count per kind. That count is the other half of the answer: it is "
1168
+ "what this machine holds, not what exists, and a kind sitting at zero is a "
1169
+ "kind nothing here could have loaded. boost_search is what reads the "
1170
+ "registries themselves. "
1107
1171
  "Read-only, instant, installs nothing — so unlike boost_search there is "
1108
1172
  "no threshold worth applying: call it whenever you are about to plan "
1109
1173
  "something. Planning from memory while "
@@ -1250,6 +1314,78 @@ def _seed_catalog_for_mcp(force: bool) -> None:
1250
1314
  out.warn(res.summary())
1251
1315
 
1252
1316
 
1317
+ #: Escape hatch, same shape as BOOST_NO_MCP_OFFER and BOOST_NO_SEED. It is
1318
+ #: checked BEFORE `out.confirm`, which is load-bearing: confirm returns True
1319
+ #: under BOOST_ASSUME_YES or a bare `--yes` anywhere in argv, and the test
1320
+ #: fixtures set BOOST_ASSUME_YES=1 — so without this guard every existing
1321
+ #: `boost mcp register` test, and every provisioning script, would silently
1322
+ #: write a standing block into a real CLAUDE.md.
1323
+ NO_RULE_ENV = "BOOST_NO_RULE"
1324
+
1325
+
1326
+ def _offer_boost_first(hosts: list[str]) -> None:
1327
+ """Offer to install boost's own rule into the agent's standing instructions.
1328
+
1329
+ This is the most invasive thing boost can propose, and the only text it
1330
+ asks to put in a file the user reads every session, in every project — so
1331
+ the consent has to be real rather than procedural. The body is printed in
1332
+ full BEFORE the question, the target paths are named, the answer defaults
1333
+ to NO, and the reversal command is shown whether or not they accept.
1334
+
1335
+ Why it exists at all: Gemini never delivers MCP server `instructions` in
1336
+ interactive mode, and in an untrusted folder — which a brand-new project
1337
+ directory is by default — it does not start the server, so boost has no
1338
+ tools there either. `~/.gemini/GEMINI.md` is loaded unconditionally and is
1339
+ the only boost surface that survives both. Declining is a perfectly good
1340
+ answer; the tool descriptions still carry the trigger on every host that
1341
+ delivers them.
1342
+
1343
+ Non-fatal by construction. The user asked to register an MCP server; a
1344
+ failure to materialise an optional rule must never turn that into an
1345
+ error, so everything below degrades to a warning.
1346
+ """
1347
+ from ..core import builtin
1348
+
1349
+ if os.environ.get(NO_RULE_ENV):
1350
+ return
1351
+ # Scoped to hosts where boost actually registered a server. Offering it for
1352
+ # an agent with no boost tools would install standing text naming
1353
+ # `boost_search` to an agent that does not have it.
1354
+ if not hosts or not builtin.rule_is_available():
1355
+ return
1356
+ if lockfile.get_rule(builtin.BUILTIN_RULES[0]):
1357
+ return # already installed; do not re-ask
1358
+ body = (builtin.source_dir() / (builtin.BUILTIN_RULES[0] + ".mdc"))
1359
+ targets = [str(rules.rule_target(agent, skills_dir,
1360
+ builtin.BUILTIN_RULES[0])[1])
1361
+ for agent, skills_dir in agents.enabled_agents().items()
1362
+ if agent in {builtin.AGENT_FOR_HOST.get(h) for h in hosts}]
1363
+ if not targets:
1364
+ return
1365
+ out.info("")
1366
+ out.info("boost can also add its own rule, `%s`, to your agents' standing "
1367
+ "instructions:" % builtin.BUILTIN_RULES[0])
1368
+ for target in targets:
1369
+ out.info(" %s" % target)
1370
+ out.info("")
1371
+ for line in body.read_text(encoding="utf-8").splitlines():
1372
+ out.info(" | %s" % line)
1373
+ out.info("")
1374
+ if not out.confirm("Install it?", default=False):
1375
+ out.info("Not installed. `boost install %s` any time."
1376
+ % builtin.BUILTIN_RULES[0])
1377
+ return
1378
+ try:
1379
+ builtin.ensure_tap()
1380
+ catalog.rebuild_tap(registry.get(builtin.BUILTIN_TAP))
1381
+ store.install(catalog.resolve_one(builtin.BUILTIN_RULES[0]))
1382
+ except (BoostError, OSError) as exc:
1383
+ out.warn("could not install %s: %s" % (builtin.BUILTIN_RULES[0], exc))
1384
+ return
1385
+ out.ok("installed %s — remove it with `boost uninstall %s`"
1386
+ % (builtin.BUILTIN_RULES[0], builtin.BUILTIN_RULES[0]))
1387
+
1388
+
1253
1389
  def cmd_mcp(argv) -> int:
1254
1390
  """boost mcp [register|unregister] [--host H] [--stdio] [--seed|--no-seed]"""
1255
1391
  p = cliparse.parser(
@@ -1324,6 +1460,8 @@ def cmd_mcp(argv) -> int:
1324
1460
  out.info(" ".join(mcphost.argv(host, args.action, shim)))
1325
1461
  journal.log("mcp", args.action, hosts="")
1326
1462
  return 0
1463
+ if args.action == "register":
1464
+ _offer_boost_first(done)
1327
1465
  journal.log("mcp", args.action, hosts=",".join(done))
1328
1466
  return 0
1329
1467
 
@@ -0,0 +1,114 @@
1
+ """The one tap boost ships itself, and the rule inside it.
2
+
3
+ boost's whole product is asking a user to accept standing text written by
4
+ strangers, under ``boost install`` and reversible with ``boost uninstall``. Its
5
+ OWN standing text has to be the same kind of thing, subject to the same
6
+ commands — a privileged block that ``boost list`` cannot see and
7
+ ``boost uninstall`` cannot remove is exactly the asymmetry a user is entitled
8
+ to resent. So ``boost-first`` is not a special case bolted onto the register
9
+ path: it is an ordinary rule, in an ordinary tap, that happens to arrive with
10
+ the wheel instead of over the network.
11
+
12
+ **The tap directory is under ``~/.boost/repos/`` and never inside the wheel.**
13
+ That is not an implementation detail, it is the whole safety argument. A
14
+ ``Tap`` whose ``path`` pointed at package data would sit one ``boost untap``
15
+ away from :func:`registry.remove`, which ends in ``util.rmtree(tap.path)`` —
16
+ deleting part of the user's installed package. Here the worst case is that a
17
+ recreatable directory goes away and :func:`ensure_tap` rebuilds it.
18
+
19
+ The shipped files are therefore *copied out* of the wheel on first use, and the
20
+ copy is what everything else — catalog scan, install, lock file, uninstall —
21
+ sees. Nothing in ``core/`` needs to know this tap is different.
22
+ """
23
+ from __future__ import annotations
24
+
25
+ import shutil
26
+ from pathlib import Path
27
+
28
+ from . import config, paths, registry
29
+
30
+ #: The tap name. Contains a ``/`` like any other, so ``Tap.safe_name`` maps it
31
+ #: to ``boost__builtin`` under ``~/.boost/repos/``.
32
+ BUILTIN_TAP = "boost/builtin"
33
+
34
+ #: A sentinel URL rather than a real one. ``boost update`` must not try to
35
+ #: fetch this tap: its source of truth is the installed wheel, so it refreshes
36
+ #: when boost itself does. The scheme is deliberately not ``https`` so any code
37
+ #: that hands it to git fails loudly instead of reaching the network.
38
+ BUILTIN_URL = "builtin:boost"
39
+
40
+ #: The rule boost authors. One entry today; the list is what makes adding a
41
+ #: second a data change rather than a code change.
42
+ BUILTIN_RULES = ("boost-first",)
43
+
44
+ #: MCP host id -> boost agent id. The two vocabularies genuinely differ
45
+ #: (``mcphost.CLAUDE`` is ``"claude"``; the agent is ``"claude-code"``), and
46
+ #: the offer is scoped through this so standing text naming ``boost_search``
47
+ #: only reaches an agent boost actually registered a server with. Cursor and
48
+ #: Windsurf are absent on purpose: boost registers no MCP server for them, so
49
+ #: the rule would advertise tools they do not have.
50
+ AGENT_FOR_HOST = {"claude": "claude-code", "gemini": "gemini"}
51
+
52
+
53
+ def source_dir() -> Path:
54
+ """The shipped rules inside the installed package. **Read-only.**
55
+
56
+ Never returned as a ``Tap.path`` and never written to — a wheel is not
57
+ guaranteed writable, and on a system install it is not guaranteed to be
58
+ the user's to modify.
59
+ """
60
+ return Path(__file__).resolve().parent.parent / "data" / "rules"
61
+
62
+
63
+ def is_builtin(tap_name: str) -> bool:
64
+ """Whether ``tap_name`` is boost's own tap rather than a user's."""
65
+ return tap_name == BUILTIN_TAP
66
+
67
+
68
+ def configured_tap_count() -> int:
69
+ """Taps the USER configured — the builtin does not count.
70
+
71
+ ``mcp.no_results`` and ``boost_doctor`` both ask "has this user configured
72
+ anything yet" by counting taps, and print the one-command setup path when
73
+ the answer is zero. boost's own tap must not answer that question for
74
+ them: a machine holding nothing but ``boost-first`` has an effectively
75
+ empty catalog, and suppressing the setup message there would strand a new
76
+ user with a search that can never match.
77
+ """
78
+ return sum(1 for tap in registry.list_taps() if not is_builtin(tap.name))
79
+
80
+
81
+ def ensure_tap() -> registry.Tap:
82
+ """Materialize the shipped rules on disk and register the tap. Idempotent.
83
+
84
+ Copies each shipped ``.mdc`` into ``~/.boost/repos/boost__builtin/`` and
85
+ appends the config row if it is not already there. Safe to call on every
86
+ install: an existing file is overwritten from the wheel, which is what
87
+ makes the rule track boost's own version rather than drifting once written.
88
+ """
89
+ tap = registry.Tap(name=BUILTIN_TAP, url=BUILTIN_URL, curated=True)
90
+ paths.ensure_dirs()
91
+ tap.path.mkdir(parents=True, exist_ok=True)
92
+ src = source_dir()
93
+ for rule in BUILTIN_RULES:
94
+ origin = src / (rule + ".mdc")
95
+ if origin.is_file():
96
+ shutil.copyfile(origin, tap.path / (rule + ".mdc"))
97
+ cfg = config.load()
98
+ rows = cfg.setdefault("taps", [])
99
+ if not any(str(row.get("name")) == BUILTIN_TAP for row in rows):
100
+ rows.append({"name": BUILTIN_TAP, "url": BUILTIN_URL, "curated": True})
101
+ config.save(cfg)
102
+ return tap
103
+
104
+
105
+ def rule_is_available() -> bool:
106
+ """Whether the wheel actually carries the rule.
107
+
108
+ Package data is a packaging decision that can regress silently — a missing
109
+ ``package-data`` entry makes this a dev-checkout-only feature that is
110
+ simply absent for every pip and pipx user. The offer checks this rather
111
+ than assuming, so a packaging mistake degrades to "no offer" instead of a
112
+ traceback on the one command new users are told to run.
113
+ """
114
+ return (source_dir() / (BUILTIN_RULES[0] + ".mdc")).is_file()
@@ -270,6 +270,28 @@ def all_entries() -> list[dict]:
270
270
  return out
271
271
 
272
272
 
273
+ def kind_counts() -> dict[str, int]:
274
+ """Per-kind entry counts across every configured tap.
275
+
276
+ The same reads :func:`all_entries` does, one tap's cache at a time, without
277
+ the concatenation. A caller that only wants the size of the corpus should
278
+ not have to materialise it: the MCP ``boost_doctor`` handler took
279
+ ``len(all_entries())``, which builds a 71,655-element list on a real
280
+ install to produce one integer.
281
+
282
+ An entry with no ``kind`` counts as a skill, the way it renders everywhere
283
+ else. An unrecognised kind gets its own key rather than being dropped, so
284
+ ``sum(kind_counts().values())`` equals ``len(all_entries())`` for any cache
285
+ — including one written before a kind existed.
286
+ """
287
+ counts: dict[str, int] = {KIND_SKILL: 0, KIND_RULE: 0, KIND_WORKFLOW: 0}
288
+ for tap in registry.list_taps():
289
+ for entry in load_tap(tap):
290
+ kind = entry.get("kind") or KIND_SKILL
291
+ counts[kind] = counts.get(kind, 0) + 1
292
+ return counts
293
+
294
+
273
295
  def split_name(name: str) -> tuple[str | None, str]:
274
296
  """Split a possibly tap-qualified name into ``(tap, bare_name)``.
275
297
 
@@ -145,6 +145,33 @@ PROTOCOL_VERSION = "2024-11-05"
145
145
  # capture this whole surface is written to avoid. The nameable-task trigger
146
146
  # stays as the cheapest test of all.
147
147
  #
148
+ # THE DEFEATER, and it is the one clause here that is not a trigger. Forensics
149
+ # on a Gemini CLI session: asked to build a RAG app with LangGraph, LangChain
150
+ # and LangSmith, the agent shipped it without calling a single boost tool, and
151
+ # explained afterwards that it had "immediately activated the pre-installed
152
+ # local skills — langchain-rag and rag-engineer" and "overlooked calling
153
+ # mcp_boost_boost_search". boost_search's description already named that exact
154
+ # moment — "a new project or subsystem, an architecture decision, environment
155
+ # and tooling config" — and the agent paraphrased the list back when asked.
156
+ #
157
+ # So the trigger did not fail to fire. It fired and was overruled. Every
158
+ # trigger boost ships is a predicate over the REQUEST; the gate the model
159
+ # actually applied was a predicate over its OWN CONTEXT — something already
160
+ # matched, so I am covered. That proposition appears nowhere in boost's
161
+ # agent-facing text ('already loaded' 0 hits, 'already matched' 0, 'even if' 0,
162
+ # 'enough' 0, 'sufficient' 0, 'covered' 0, 'active skill' 0 across INSTRUCTIONS
163
+ # and all six tool descriptions), and a clause that does not exist cannot have
164
+ # failed. This paragraph adds it.
165
+ #
166
+ # It is placed DOWNSTREAM of the two signals rather than beside them, because a
167
+ # fourth signal would widen the gate and this narrows an exception to it. And
168
+ # it is written as a description rather than a denial. An earlier draft said
169
+ # "an active skill does not answer this question", which compresses to "an
170
+ # active skill is never enough" — a standing order to search, i.e. the same
171
+ # capture the skip list and the stated cost exist to prevent. What ships says
172
+ # what an active skill IS (installed earlier, matched on its own description,
173
+ # one kind of three) and leaves the conclusion to the reader.
174
+ #
148
175
  # NON-CAPTURING, and this is a measured knife edge rather than a manner.
149
176
  # Editing only a tool's description moves how often a model calls it by more
150
177
  # than 10x ("Tool Preferences in Agentic LLMs are Unreliable", EMNLP 2025),
@@ -178,6 +205,14 @@ INSTRUCTIONS = (
178
205
  "recognized at the time, and a question that became an investigation "
179
206
  "never got one.\n"
180
207
  "\n"
208
+ "ALREADY HOLDING A MATCH is not one of those two signals, though it reads "
209
+ "like an answer to the same question. A skill that activated here was "
210
+ "installed on an earlier day and matched on its own description — what it "
211
+ "covers, not what this request needs — and it is one kind of three: a rule "
212
+ "you never installed cannot activate, and a workflow waits to be called by "
213
+ "name. The two signals stay properties of the request, and an active skill "
214
+ "leaves them as it found them.\n"
215
+ "\n"
181
216
  "Finding nothing is a good outcome, not a wasted call: it tells you to "
182
217
  "build it yourself, now knowing that nothing already covers it. Finding "
183
218
  "something is a head start, not an instruction — read it, take what fits, "
@@ -188,7 +223,7 @@ INSTRUCTIONS = (
188
223
  )
189
224
 
190
225
 
191
- def hit_line(entry: dict) -> str:
226
+ def hit_line(entry: dict, *, installed: bool = False) -> str:
192
227
  """One search hit rendered for an agent: name, kind, description, tap.
193
228
 
194
229
  The kind marker is the load-bearing part. ``boost_install``'s description
@@ -202,14 +237,106 @@ def hit_line(entry: dict) -> str:
202
237
  line would spend a token per hit to say "nothing unusual here". A missing
203
238
  ``kind`` reads as a skill for the same reason it does everywhere else in
204
239
  the catalog — thin scanner output must not surface ``[None]`` to an agent.
240
+
241
+ ``installed`` adds a second marker after the kind, and is keyword-only with
242
+ a False default so every existing caller and assertion renders byte-for-byte
243
+ what it did before. It is **name-keyed** — the caller tests the name against
244
+ the lock file — which means a hit from a *different tap* that happens to
245
+ share a name is marked. That is a real false-positive rate (the corpus holds
246
+ 13 distinct skills called ``code-reviewer``) and it errs toward suppressing
247
+ a search, so it is disclosed rather than hidden: :func:`overlap_note` says
248
+ so in the reply itself, and every hit line names its own tap.
249
+
250
+ Keying it more precisely was the alternative and was rejected. The lock file
251
+ IS name-keyed (``lockfile.find_any``), and so is ``store.install``, so a
252
+ tap-qualified marker would disagree with the tool it is advising about — a
253
+ hit marked "not installed" that ``boost_install <name>`` then resolves to
254
+ the item already in the lock. One notion of identity per reply, plus the
255
+ field that resolves it, beats two that contradict each other.
205
256
  """
206
257
  kind = entry.get("kind") or "skill"
207
258
  marker = "" if kind == "skill" else " [%s]" % kind
259
+ if installed:
260
+ marker += " [installed]"
208
261
  return "%s%s — %s (%s)" % (entry.get("name", "?"), marker,
209
262
  entry.get("description", ""),
210
263
  entry.get("tap", "?"))
211
264
 
212
265
 
266
+ # The lock sections, in the order every boost surface names them. Fixed here
267
+ # rather than read off the caller's dict, so the footer's column order cannot
268
+ # drift between a machine that has rules and one that does not.
269
+ _KINDS = ("skill", "rule", "workflow")
270
+
271
+
272
+ def coverage_line(installed: dict, *, tapped: int) -> str:
273
+ """``boost_list``'s closing footer: what this machine holds, per kind.
274
+
275
+ ``installed`` is the ``lockfile.all_installed()`` shape — ``{kind: {name:
276
+ entry}}`` — and a missing section counts as zero.
277
+
278
+ boost_list used to answer "what do I have" and nothing else, which made it
279
+ the amplifier for the failure this footer exists to defeat: an agent that
280
+ stopped because something had already matched would, on calling the one
281
+ free tool, have been told only about the things it already had. This is the
282
+ other half — a kind sitting at zero is a kind nothing on this machine could
283
+ have loaded, and boost_search is what reads the registries themselves.
284
+
285
+ Only INSTALLED counts appear. An earlier draft closed with the size of the
286
+ tapped catalog, and that number cannot be substantiated: those are
287
+ un-de-duplicated index entries, and boost's own ranked list de-duplicates
288
+ on the content hash precisely because 13 distinct skills named
289
+ ``code-reviewer`` collapsing into one slot credited the ranker with a
290
+ compression that existed only in the scoring code. Printing the raw total
291
+ as the size of what the user is missing would be the only claim in this
292
+ surface an agent cannot check. Dropping it also keeps the tool honest about
293
+ its cost: with no catalog read, boost_list stays the "instant" tool
294
+ INSTRUCTIONS advertises.
295
+
296
+ ``tapped`` selects the closing sentence, keyed the way :func:`no_results`
297
+ and ``boost_doctor`` key theirs and naming the same one command in the same
298
+ order — an agent that calls two of these in one session must not see the
299
+ recommendation flip and read it as two different fixes.
300
+ """
301
+ body = " · ".join(
302
+ "%d %s%s" % (n, kind, "" if n == 1 else "s")
303
+ for kind, n in ((k, len(installed.get(k) or {})) for k in _KINDS))
304
+ if tapped > 0:
305
+ return ("%s installed here — what this machine holds, not what exists. "
306
+ "boost_search reads the tapped registries themselves, across "
307
+ "all three kinds." % body)
308
+ return ("%s installed here. Nothing is tapped yet, so there is no catalog "
309
+ "behind boost_search either — ask the user to run `boost tap "
310
+ "--defaults` to add the recommended registries." % body)
311
+
312
+
313
+ def overlap_note(installed_hits: int, total_hits: int) -> str:
314
+ """How much of a search reply this machine already has. ``""`` for no hits.
315
+
316
+ The counterpart to :func:`hit_line`'s ``[installed]`` marker: the marker
317
+ says which line, this says how many, and it is the only agent-facing place
318
+ the marker's name-keying is disclosed. Both serve one decision — "I already
319
+ have something" is a claim about the machine, and until the reply separated
320
+ the two halves it was a guess.
321
+
322
+ Zero overlap gets its own sentence rather than silence. It is the plainest
323
+ available answer to "something already matched, so I am covered", and
324
+ silence would read as absence of information rather than as the answer.
325
+
326
+ The empty reply belongs to :func:`no_results` — including its
327
+ untapped-machine branch — so nothing bolts onto it here.
328
+ """
329
+ if total_hits <= 0:
330
+ return ""
331
+ if installed_hits <= 0:
332
+ return "\n(none of these are installed on this machine.)"
333
+ return ("\n(%d of %d already installed here, marked [installed]. The match "
334
+ "is on the name alone — the same test boost_install and boost_info "
335
+ "use — so an item from a different tap that shares a name is "
336
+ "marked too; each line names its tap.)"
337
+ % (installed_hits, total_hits))
338
+
339
+
213
340
  def no_results(query: str, *, tapped: int) -> str:
214
341
  """The reply for a search that returned nothing.
215
342
 
@@ -0,0 +1,35 @@
1
+ ---
2
+ name: boost-first
3
+ description: Check the boost shelf before a choice gets locked in — including when a skill has already matched.
4
+ alwaysApply: true
5
+ globs: "**"
6
+ ---
7
+
8
+ boost is a shelf of procedures other people already wrote and debugged, in
9
+ three kinds: skills, rules and workflows. Two read-only tools reach it —
10
+ `boost_list` for what is installed on this machine, `boost_search` for what
11
+ exists across the registries you have tapped. Some hosts prefix the names, so
12
+ they may appear as `mcp_boost_boost_search`. Neither installs anything. If
13
+ neither tool is present in this session, `boost search "<what you are trying
14
+ to do>"` in the shell asks the same question.
15
+
16
+ `boost_list` is a local file read. `boost_search` takes longer because it
17
+ retrieves and then reranks, which is what makes its top result worth acting on
18
+ rather than skimming ten.
19
+
20
+ Reach for the shelf when the request would lock something in for everything
21
+ after it: a new project or subsystem, an architecture or dependency choice,
22
+ environment and tooling config, a linter, tests, CI.
23
+
24
+ What is already loaded is a different question. A skill that activated here was
25
+ installed before this request existed and matched on its own description — what
26
+ it covers, not what this request needs — and it is one kind of three: a rule you
27
+ never installed cannot activate, and a workflow waits to be called by name. So
28
+ an active skill leaves the question of what exists exactly where it found it.
29
+
30
+ Coming back empty is a real answer: build it yourself, now knowing nothing
31
+ already covers it. Coming back with something is a head start, not an
32
+ instruction — read it, take what fits, discard the rest. The task stays yours.
33
+
34
+ Not for: a question, a one-line edit, a command you were just handed, or a
35
+ change that follows conventions already visible in this repo.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.421
3
+ Version: 1.0.423
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -53,6 +53,7 @@ boost_cli/core/agents.py
53
53
  boost_cli/core/ai.py
54
54
  boost_cli/core/bmad.py
55
55
  boost_cli/core/bootstrap.py
56
+ boost_cli/core/builtin.py
56
57
  boost_cli/core/capabilities.py
57
58
  boost_cli/core/catalog.py
58
59
  boost_cli/core/chat.py
@@ -100,6 +101,7 @@ boost_cli/core/updatediff.py
100
101
  boost_cli/core/util.py
101
102
  boost_cli/core/workflows.py
102
103
  boost_cli/data/registries.json
104
+ boost_cli/data/rules/boost-first.mdc
103
105
  boost_langchain/__init__.py
104
106
  boost_langchain/_compat.py
105
107
  boost_langchain/graph.py
@@ -189,6 +191,7 @@ docs/roadmap/items/atomic-skill-install-temp-dir-swap.md
189
191
  docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md
190
192
  docs/roadmap/items/bm25-index-is-one-json-blob.md
191
193
  docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md
194
+ docs/roadmap/items/boost-first-rule.md
192
195
  docs/roadmap/items/boost-langchain-publishing.md
193
196
  docs/roadmap/items/boost-run-live-agents.md
194
197
  docs/roadmap/items/bring-commands-under-mutation-testing.md
@@ -282,6 +285,7 @@ docs/roadmap/items/make-lint-masks-actionlint-failures.md
282
285
  docs/roadmap/items/make-the-roadmaps-discoverable.md
283
286
  docs/roadmap/items/markdown-consistency-markdownlint-cli2.md
284
287
  docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md
288
+ docs/roadmap/items/mcp-already-covered-defeater.md
285
289
  docs/roadmap/items/mcp-aware-skills.md
286
290
  docs/roadmap/items/mcp-check-skills-before-starting-a-task.md
287
291
  docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md
@@ -541,7 +545,9 @@ tests/unit/test_adapters_runner.py
541
545
  tests/unit/test_agents.py
542
546
  tests/unit/test_ai.py
543
547
  tests/unit/test_bmad_core.py
548
+ tests/unit/test_boost_first_offer.py
544
549
  tests/unit/test_bootstrap.py
550
+ tests/unit/test_builtin.py
545
551
  tests/unit/test_capabilities.py
546
552
  tests/unit/test_catalog.py
547
553
  tests/unit/test_chat.py