boost-skill-cli 1.0.293__tar.gz → 1.0.294__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 (550) hide show
  1. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.vale/styles/config/vocabularies/boost/accept.txt +3 -0
  2. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/CLAUDE.md +25 -0
  3. {boost_skill_cli-1.0.293/boost_skill_cli.egg-info → boost_skill_cli-1.0.294}/PKG-INFO +41 -3
  4. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/README.md +40 -2
  5. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/_version.py +2 -2
  6. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/cli.py +1 -1
  7. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/configuration.py +82 -43
  8. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/pkg.py +31 -14
  9. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/quality.py +11 -2
  10. boost_skill_cli-1.0.294/boost_cli/core/agents.py +80 -0
  11. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/config.py +14 -0
  12. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/mcpdecl.py +24 -12
  13. boost_skill_cli-1.0.294/boost_cli/core/mcphost.py +149 -0
  14. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/rules.py +31 -11
  15. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/store.py +30 -9
  16. boost_skill_cli-1.0.294/boost_cli/core/workflows.py +149 -0
  17. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294/boost_skill_cli.egg-info}/PKG-INFO +41 -3
  18. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_skill_cli.egg-info/SOURCES.txt +3 -0
  19. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/adapters.html +1 -1
  20. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/commands.html +7 -5
  21. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/index.html +7 -1
  22. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/mcp-hub.html +1 -1
  23. boost_skill_cli-1.0.294/docs/roadmap/items/gemini-cli-agent-target.md +16 -0
  24. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap.html +12 -1
  25. boost_skill_cli-1.0.294/tests/bdd/features/mcp.feature +63 -0
  26. boost_skill_cli-1.0.294/tests/bdd/features/steps/mcp_steps.py +72 -0
  27. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_configuration.py +169 -35
  28. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_info.py +6 -1
  29. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_pkg.py +83 -21
  30. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_quality.py +6 -3
  31. boost_skill_cli-1.0.294/tests/unit/test_agents.py +162 -0
  32. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_config.py +11 -1
  33. boost_skill_cli-1.0.294/tests/unit/test_mcphost.py +189 -0
  34. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_rules.py +80 -0
  35. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_store.py +241 -26
  36. boost_skill_cli-1.0.294/tests/unit/test_workflows.py +297 -0
  37. boost_skill_cli-1.0.293/boost_cli/core/agents.py +0 -36
  38. boost_skill_cli-1.0.293/boost_cli/core/workflows.py +0 -59
  39. boost_skill_cli-1.0.293/tests/bdd/features/mcp.feature +0 -31
  40. boost_skill_cli-1.0.293/tests/bdd/features/steps/mcp_steps.py +0 -48
  41. boost_skill_cli-1.0.293/tests/unit/test_agents.py +0 -81
  42. boost_skill_cli-1.0.293/tests/unit/test_workflows.py +0 -90
  43. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.gitattributes +0 -0
  44. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.gitignore +0 -0
  45. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.gitleaks.toml +0 -0
  46. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.htmlvalidate.json +0 -0
  47. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.lighthouserc.json +0 -0
  48. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.lycheeignore +0 -0
  49. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.markdownlint-cli2.jsonc +0 -0
  50. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.pre-commit-config.yaml +0 -0
  51. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.stylelintrc.json +0 -0
  52. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.vale/styles/boost/Terminology.yml +0 -0
  53. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.vale.ini +0 -0
  54. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/CODE_OF_CONDUCT.md +0 -0
  55. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/CONTRIBUTING.md +0 -0
  56. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/LICENSE +0 -0
  57. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/MANIFEST.in +0 -0
  58. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/Makefile +0 -0
  59. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/SECURITY.md +0 -0
  60. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost +0 -0
  61. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/__init__.py +0 -0
  62. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/__main__.py +0 -0
  63. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/cliparse.py +0 -0
  64. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/__init__.py +0 -0
  65. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/_common.py +0 -0
  66. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/bmad.py +0 -0
  67. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/discovery.py +0 -0
  68. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/hooks.py +0 -0
  69. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/info.py +0 -0
  70. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/intelligence.py +0 -0
  71. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/run.py +0 -0
  72. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/safety.py +0 -0
  73. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/taps.py +0 -0
  74. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/team.py +0 -0
  75. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/__init__.py +0 -0
  76. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/adapters.py +0 -0
  77. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/ai.py +0 -0
  78. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/capabilities.py +0 -0
  79. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/catalog.py +0 -0
  80. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/claude_settings.py +0 -0
  81. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/dense.py +0 -0
  82. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/ed25519.py +0 -0
  83. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/embed.py +0 -0
  84. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/faithfulness.py +0 -0
  85. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/frontmatter.py +0 -0
  86. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/gitutil.py +0 -0
  87. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/imperative.py +0 -0
  88. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/injectscan.py +0 -0
  89. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/installscan.py +0 -0
  90. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/integrity.py +0 -0
  91. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/journal.py +0 -0
  92. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/lockfile.py +0 -0
  93. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/logs.py +0 -0
  94. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/mcp.py +0 -0
  95. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/minisign.py +0 -0
  96. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/nethttp.py +0 -0
  97. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/output.py +0 -0
  98. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/paths.py +0 -0
  99. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/policy.py +0 -0
  100. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/projectlock.py +0 -0
  101. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/provenance.py +0 -0
  102. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/rag.py +0 -0
  103. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/registry.py +0 -0
  104. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/resolve.py +0 -0
  105. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/scopes.py +0 -0
  106. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/secretscan.py +0 -0
  107. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/selfupdate.py +0 -0
  108. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/serve.py +0 -0
  109. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/stackprobe.py +0 -0
  110. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/staleness.py +0 -0
  111. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/trustaudit.py +0 -0
  112. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/typosquat.py +0 -0
  113. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/updatediff.py +0 -0
  114. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/util.py +0 -0
  115. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/data/registries.json +0 -0
  116. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/errors.py +0 -0
  117. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/spin.py +0 -0
  118. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  119. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  120. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_skill_cli.egg-info/requires.txt +0 -0
  121. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_skill_cli.egg-info/top_level.txt +0 -0
  122. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/codecov.yml +0 -0
  123. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/.claude/settings.local.json +0 -0
  124. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/DEBUGGING.md +0 -0
  125. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/gifs/distill.gif +0 -0
  126. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/gifs/doctor.gif +0 -0
  127. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/gifs/explain.gif +0 -0
  128. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/gifs/hooks.gif +0 -0
  129. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/gifs/install.gif +0 -0
  130. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/gifs/pulse.gif +0 -0
  131. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/gifs/search.gif +0 -0
  132. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/gifs/tap.gif +0 -0
  133. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/tapes/distill.tape +0 -0
  134. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/tapes/doctor.tape +0 -0
  135. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/tapes/explain.tape +0 -0
  136. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/tapes/hooks.tape +0 -0
  137. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/tapes/install.tape +0 -0
  138. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/tapes/pulse.tape +0 -0
  139. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/tapes/search.tape +0 -0
  140. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/tapes/tap.tape +0 -0
  141. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel.html +0 -0
  142. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/demo.gif +0 -0
  143. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/demo.tape +0 -0
  144. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/design-roadmap.html +0 -0
  145. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/eval.html +0 -0
  146. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/rag-architecture.md +0 -0
  147. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D01.md +0 -0
  148. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D02.md +0 -0
  149. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D03.md +0 -0
  150. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D04.md +0 -0
  151. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D05.md +0 -0
  152. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D06.md +0 -0
  153. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D07.md +0 -0
  154. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D08.md +0 -0
  155. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D09.md +0 -0
  156. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D10.md +0 -0
  157. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D11.md +0 -0
  158. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D12.md +0 -0
  159. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D13.md +0 -0
  160. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D14.md +0 -0
  161. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D15.md +0 -0
  162. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D16.md +0 -0
  163. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D17.md +0 -0
  164. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D18.md +0 -0
  165. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D19.md +0 -0
  166. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D20.md +0 -0
  167. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D21.md +0 -0
  168. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D22.md +0 -0
  169. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D23.md +0 -0
  170. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D24.md +0 -0
  171. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D25.md +0 -0
  172. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D26.md +0 -0
  173. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  174. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  175. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  176. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  177. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  178. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  179. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  180. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  181. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  182. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  183. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  184. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  185. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  186. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  187. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  188. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  189. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  190. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  191. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  192. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  193. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  194. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/command-carousel-page.md +0 -0
  195. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  196. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  197. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  198. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  199. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  200. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  201. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  202. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  203. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  204. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  205. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  206. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  207. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  208. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  209. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  210. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  211. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  212. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  213. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  214. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  215. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  216. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  217. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  218. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  219. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  220. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  221. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  222. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/github-community-health-files.md +0 -0
  223. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  224. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  225. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  226. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  227. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  228. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  229. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  230. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  231. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  232. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  233. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  234. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  235. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  236. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  237. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  238. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  239. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  240. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  241. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  242. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  243. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  244. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  245. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  246. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  247. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  248. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  249. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  250. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  251. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  252. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  253. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  254. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  255. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  256. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  257. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  258. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  259. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  260. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  261. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  262. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  263. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  264. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  265. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  266. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  267. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  268. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  269. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  270. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  271. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  272. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  273. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  274. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  275. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  276. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  277. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  278. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  279. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  280. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  281. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  282. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  283. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  284. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  285. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  286. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  287. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  288. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  289. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  290. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  291. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  292. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  293. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  294. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  295. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  296. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  297. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  298. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  299. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  300. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  301. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  302. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  303. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  304. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  305. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  306. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  307. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  308. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  309. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  310. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  311. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  312. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  313. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  314. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  315. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  316. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  317. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  318. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  319. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  320. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  321. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  322. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  323. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  324. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  325. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  326. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  327. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  328. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  329. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  330. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  331. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  332. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  333. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  334. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  335. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  336. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  337. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  338. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  339. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  340. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  341. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  342. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  343. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  344. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  345. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  346. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  347. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  348. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/workspace-scope-install.md +0 -0
  349. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  350. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/eslint.config.mjs +0 -0
  351. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/evals/README.md +0 -0
  352. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/evals/__init__.py +0 -0
  353. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/evals/baseline.json +0 -0
  354. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/evals/faithfulness.py +0 -0
  355. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/evals/golden_set.json +0 -0
  356. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/evals/make_corpus.py +0 -0
  357. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/evals/make_golden.py +0 -0
  358. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/evals/metrics.py +0 -0
  359. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/evals/run_evals.py +0 -0
  360. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/examples/README.md +0 -0
  361. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/examples/adapt-demo.sh +0 -0
  362. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/examples/boost-run-prototype.sh +0 -0
  363. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/index.html +0 -0
  364. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/noxfile.py +0 -0
  365. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/pyproject.toml +0 -0
  366. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/requirements/coverage-tools.in +0 -0
  367. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/requirements/coverage-tools.txt +0 -0
  368. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/requirements/lint-tools.in +0 -0
  369. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/requirements/lint-tools.txt +0 -0
  370. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/requirements/mutation-tools.in +0 -0
  371. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/requirements/mutation-tools.txt +0 -0
  372. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/requirements/release-tools.in +0 -0
  373. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/requirements/release-tools.txt +0 -0
  374. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/requirements/test-tools.in +0 -0
  375. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/requirements/test-tools.txt +0 -0
  376. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/a11y_check.py +0 -0
  377. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/bench_cli.sh +0 -0
  378. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/build_command_reference.py +0 -0
  379. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/build_registries.py +0 -0
  380. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/build_roadmap.py +0 -0
  381. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/check_anchors.py +0 -0
  382. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/check_licenses.py +0 -0
  383. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/check_required_checks.py +0 -0
  384. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/ensure_eval_corpus.sh +0 -0
  385. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/eval_explain.py +0 -0
  386. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/eval_gate.py +0 -0
  387. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/eval_recommend.py +0 -0
  388. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/eval_retrieval.py +0 -0
  389. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/eval_stats_summary.py +0 -0
  390. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/import_budget.py +0 -0
  391. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/lock_toolchain.py +0 -0
  392. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/mutation_gate.py +0 -0
  393. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/mutation_shards.py +0 -0
  394. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/mutation_weights.json +0 -0
  395. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/perf_gate.py +0 -0
  396. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/post_deploy_smoke.py +0 -0
  397. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/release_guard.py +0 -0
  398. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/release_preflight.py +0 -0
  399. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/setup.cfg +0 -0
  400. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/sonar-project.properties +0 -0
  401. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/style/README.md +0 -0
  402. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/style/boost.css +0 -0
  403. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/style/boost.js +0 -0
  404. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/style/demo.html +0 -0
  405. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/adapt.feature +0 -0
  406. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/browse.feature +0 -0
  407. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/count.feature +0 -0
  408. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/discover.feature +0 -0
  409. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/doctor.feature +0 -0
  410. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/environment.py +0 -0
  411. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/explain.feature +0 -0
  412. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/index.feature +0 -0
  413. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/install.feature +0 -0
  414. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/list.feature +0 -0
  415. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/search.feature +0 -0
  416. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/steps/cli_steps.py +0 -0
  417. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/steps/discovery_steps.py +0 -0
  418. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/steps/quality_steps.py +0 -0
  419. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/conftest.py +0 -0
  420. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/eval/baseline.json +0 -0
  421. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/eval/explain.jsonl +0 -0
  422. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/eval/golden.jsonl +0 -0
  423. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/eval/recommend.jsonl +0 -0
  424. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/eval/taps.txt +0 -0
  425. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_capabilities_policy.py +0 -0
  426. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_adapt.py +0 -0
  427. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_bmad.py +0 -0
  428. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_discovery.py +0 -0
  429. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_hooks.py +0 -0
  430. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_intelligence.py +0 -0
  431. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_taps.py +0 -0
  432. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_team.py +0 -0
  433. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_everyday_loop.py +0 -0
  434. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_integrity_enforce.py +0 -0
  435. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_property_parsers.py +0 -0
  436. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_run.py +0 -0
  437. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_tap_signing.py +0 -0
  438. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_workspace_scope.py +0 -0
  439. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/README.md +0 -0
  440. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  441. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  442. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  443. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  444. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  445. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  446. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  447. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  448. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  449. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  450. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  451. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  452. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  453. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  454. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  455. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  456. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  457. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  458. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  459. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  460. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/fuzz_frontmatter.py +0 -0
  461. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/fuzz_registry.py +0 -0
  462. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/make_fixture.py +0 -0
  463. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/perf/test_benchmarks.py +0 -0
  464. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/smoke.sh +0 -0
  465. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_a11y_check.py +0 -0
  466. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_adapters.py +0 -0
  467. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_adapters_multi.py +0 -0
  468. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_adapters_runner.py +0 -0
  469. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_ai.py +0 -0
  470. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_capabilities.py +0 -0
  471. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_catalog.py +0 -0
  472. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_check_anchors.py +0 -0
  473. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_check_licenses.py +0 -0
  474. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_claude_settings.py +0 -0
  475. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_cliparse.py +0 -0
  476. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_codeql_analysis_key.py +0 -0
  477. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_command_reference_fresh.py +0 -0
  478. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_community_health_files.py +0 -0
  479. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_dense.py +0 -0
  480. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_dense_fallback.py +0 -0
  481. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_dependabot_config.py +0 -0
  482. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_docs_pages_linked.py +0 -0
  483. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_docsite_chrome.py +0 -0
  484. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_ed25519.py +0 -0
  485. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_embed.py +0 -0
  486. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_errors_and_cli_table.py +0 -0
  487. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_eval_faithfulness.py +0 -0
  488. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_eval_gate.py +0 -0
  489. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_eval_metrics.py +0 -0
  490. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_eval_stats_summary.py +0 -0
  491. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_faithfulness.py +0 -0
  492. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_frontmatter.py +0 -0
  493. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_fuzz_targets.py +0 -0
  494. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_gitleaks_config.py +0 -0
  495. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_gitutil.py +0 -0
  496. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_imperative.py +0 -0
  497. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_import_budget.py +0 -0
  498. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_injectscan.py +0 -0
  499. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_installscan.py +0 -0
  500. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_integrity.py +0 -0
  501. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_journal.py +0 -0
  502. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_lockfile.py +0 -0
  503. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_logs.py +0 -0
  504. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_marketing_counts.py +0 -0
  505. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_mcp.py +0 -0
  506. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_mcp_install_scan.py +0 -0
  507. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_mcpdecl.py +0 -0
  508. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_minisign.py +0 -0
  509. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_mutation_hardening.py +0 -0
  510. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_mutation_shards.py +0 -0
  511. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_mutmut_source_paths.py +0 -0
  512. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_nethttp.py +0 -0
  513. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_output.py +0 -0
  514. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_paths.py +0 -0
  515. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_perf_gate.py +0 -0
  516. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_pkg_confusions.py +0 -0
  517. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_pkg_injection.py +0 -0
  518. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_pkg_secrets.py +0 -0
  519. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_policy.py +0 -0
  520. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_post_deploy_smoke.py +0 -0
  521. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_projectlock.py +0 -0
  522. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_provenance.py +0 -0
  523. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_rag.py +0 -0
  524. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_registries_fresh.py +0 -0
  525. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_registry.py +0 -0
  526. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_release_guard.py +0 -0
  527. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_release_preflight.py +0 -0
  528. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_required_checks.py +0 -0
  529. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_resolve.py +0 -0
  530. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_roadmap_fresh.py +0 -0
  531. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_scopes.py +0 -0
  532. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_secretscan.py +0 -0
  533. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_selfupdate.py +0 -0
  534. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_serve.py +0 -0
  535. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_spin.py +0 -0
  536. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_stackprobe.py +0 -0
  537. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_staleness.py +0 -0
  538. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_token_parity.py +0 -0
  539. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_toolchain_lock.py +0 -0
  540. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_trustaudit.py +0 -0
  541. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_typosquat.py +0 -0
  542. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_updatediff.py +0 -0
  543. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_util.py +0 -0
  544. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_version.py +0 -0
  545. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_workflow_timeouts.py +0 -0
  546. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/visual/a11y_check.mjs +0 -0
  547. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/visual/console_check.mjs +0 -0
  548. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/visual/package-lock.json +0 -0
  549. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/visual/package.json +0 -0
  550. {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/visual/visual_check.mjs +0 -0
@@ -4,6 +4,7 @@ argparse
4
4
  bmad
5
5
  bookended
6
6
  CI's
7
+ CLIs
7
8
  Codecov
8
9
  codespell
9
10
  config
@@ -13,6 +14,7 @@ Dependabot
13
14
  deps
14
15
  Dev
15
16
  docsite
17
+ dotdir
16
18
  DSPy
17
19
  else's
18
20
  env
@@ -67,6 +69,7 @@ toolkits
67
69
  traceback
68
70
  tracebacks
69
71
  unkilled
72
+ unregister
70
73
  unstaged
71
74
  untap
72
75
  vendored
@@ -186,8 +186,33 @@ work in tests and the dev loop:
186
186
  ~/.agents/skills/ canonical store — single source of truth for installed skills
187
187
  ~/.agents/skills/.skill-lock.json v3 lock file
188
188
  ~/.claude/skills/ ~/.windsurf/skills/ ~/.cursor/skills/ symlinked out from the canonical store
189
+ ~/.gemini/ rules (GEMINI.md) + workflows only — see below
189
190
  ```
190
191
 
192
+ **Four agent targets, but only three get symlinks.** Gemini CLI implements the
193
+ Agent Skills standard and discovers `~/.agents/skills` — the canonical store —
194
+ *directly*, so it is configured with `links_skills: false`. Linking into
195
+ `~/.gemini/skills` too would put one skill in two of its discovery tiers, where
196
+ the `.agents` alias out-ranks whatever we linked, costing the user a "Skill
197
+ conflict detected" line per skill per session and buying nothing. Consequences
198
+ for code you write:
199
+
200
+ - Iterate `agents.linking_agents()` for anything symlink-shaped (link, unlink,
201
+ stale-link sweeps, coverage counts). `agents.enabled_agents()` is still right
202
+ for rules and workflows, which materialize into `~/.gemini/` like any other
203
+ agent's dotdir. `agents.native_store_agents()` is the complement, for reporting.
204
+ - Per-agent *formats* differ and are pure functions in `core/`: `rules.CONTEXT_FILES`
205
+ maps an agent with no rules dir to its context file (`claude-code` → CLAUDE.md /
206
+ CLAUDE.local.md, `gemini` → GEMINI.md for both scopes), and
207
+ `workflows.TOML_COMMAND_AGENTS` marks agents whose slash commands are TOML.
208
+ Gemini's `commands/` slot is `.toml` (`workflows.render_gemini_command`); its
209
+ `agents/` slot stays verbatim Markdown. Getting that backwards produces a file
210
+ the agent silently never loads.
211
+ - `core/mcphost.py` holds the per-host `mcp add`/`remove` grammar. Claude and
212
+ Gemini disagree on name position, the `--` separator, and whether unregister
213
+ needs an explicit scope — all three verified against the real CLIs and pinned
214
+ by `tests/unit/test_mcphost.py`. Don't "simplify" them into one shape.
215
+
191
216
  `core/catalog.scan_dir` walks a tap's clone and classifies each file into one
192
217
  of the three item kinds (see Non-obvious rules above); `core/store.py` owns
193
218
  install, uninstall and sync — copying into the canonical store, symlinking into
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.293
3
+ Version: 1.0.294
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -726,7 +726,7 @@ Dynamic: license-file
726
726
 
727
727
  **Homebrew for AI coding skills.** boost finds, installs, and version-tracks
728
728
  skills from GitHub-hosted registries — and wires each one into **Claude Code,
729
- Windsurf, and Cursor** in a single pass.
729
+ Windsurf, Cursor, and Gemini CLI** in a single pass.
730
730
 
731
731
  ```bash
732
732
  pipx install boost-skill-cli
@@ -735,7 +735,7 @@ boost search tdd # full-content BM25 over every skill
735
735
  boost install tdd-workflow # → every agent, version-pinned, one lock file
736
736
  ```
737
737
 
738
- No more copying `SKILL.md` into three agent folders and forgetting which one is
738
+ No more copying `SKILL.md` into four agent folders and forgetting which one is
739
739
  stale. The default install is **zero-dependency** — pure stdlib, no build step.
740
740
 
741
741
  <p align="center">
@@ -838,6 +838,13 @@ GitHub registries ──boost update──▶ ~/.boost/repos/ (shallow clon
838
838
  ────symlinks───▶ ~/.claude/skills/ ~/.windsurf/skills/ ~/.cursor/skills/
839
839
  ```
840
840
 
841
+ Gemini CLI is the one agent that needs no symlink: it implements the
842
+ [Agent Skills](https://agentskills.io) standard and discovers `~/.agents/skills`
843
+ — boost's canonical store — directly. Linking into `~/.gemini/skills` as well
844
+ would put the same skill in two of its discovery tiers, so boost deliberately
845
+ doesn't (`agents.gemini.links_skills` is `false`; flip it to `true` if you ever
846
+ need the copy). Rules and workflows still materialize under `~/.gemini/`.
847
+
841
848
  ### User scope vs project scope
842
849
 
843
850
  That's the default — **user scope**, the skills you want everywhere. The other
@@ -912,6 +919,37 @@ available on your PATH (or `ANTHROPIC_API_KEY` is set), and fall back to
912
919
  plain heuristics when it isn't — so the tool still works without an API key,
913
920
  just less cleverly.
914
921
 
922
+ ## boost as an MCP server
923
+
924
+ boost is itself an MCP server, so an agent can search and install skills mid-task
925
+ instead of waiting for you to shell out. `boost mcp register` wires it into every
926
+ agent CLI it finds on your PATH:
927
+
928
+ ```bash
929
+ boost mcp register # every installed host (default: --host auto)
930
+ boost mcp register --host gemini # just one
931
+ boost mcp unregister # same host selection, in reverse
932
+ ```
933
+
934
+ | Host | CLI | Registered in |
935
+ |------|-----|---------------|
936
+ | Claude Code | `claude` | `claude mcp add` → its user-scope MCP config |
937
+ | Gemini CLI | `gemini` | `gemini mcp add -s user` → `~/.gemini/settings.json` (`mcpServers`) |
938
+
939
+ A host whose CLI isn't installed is skipped, not an error — name it explicitly
940
+ (`--host gemini`) to have boost print the command for you to run later.
941
+
942
+ Six tools are exposed: `boost_search`, `boost_list`, `boost_info`,
943
+ `boost_install`, `boost_doctor`, and `boost_discover_github`. The server also
944
+ returns MCP `instructions`, which both hosts load into the model's context — it
945
+ tells the agent *when* boost is relevant, so a matching skill gets found at the
946
+ start of a task rather than after the work is already reconstructed by hand.
947
+
948
+ Verify the wiring with `claude mcp list` or `gemini mcp list` — boost should show
949
+ as **Connected**. (Gemini only connects stdio servers in a trusted folder; run
950
+ `gemini` once in the directory and accept the trust prompt if it shows
951
+ `Disabled`.)
952
+
915
953
  ## Claude Code hooks & the BMAD Method
916
954
 
917
955
  `boost hooks` manages Claude Code hooks in `settings.json` at either scope —
@@ -10,7 +10,7 @@
10
10
 
11
11
  **Homebrew for AI coding skills.** boost finds, installs, and version-tracks
12
12
  skills from GitHub-hosted registries — and wires each one into **Claude Code,
13
- Windsurf, and Cursor** in a single pass.
13
+ Windsurf, Cursor, and Gemini CLI** in a single pass.
14
14
 
15
15
  ```bash
16
16
  pipx install boost-skill-cli
@@ -19,7 +19,7 @@ boost search tdd # full-content BM25 over every skill
19
19
  boost install tdd-workflow # → every agent, version-pinned, one lock file
20
20
  ```
21
21
 
22
- No more copying `SKILL.md` into three agent folders and forgetting which one is
22
+ No more copying `SKILL.md` into four agent folders and forgetting which one is
23
23
  stale. The default install is **zero-dependency** — pure stdlib, no build step.
24
24
 
25
25
  <p align="center">
@@ -122,6 +122,13 @@ GitHub registries ──boost update──▶ ~/.boost/repos/ (shallow clon
122
122
  ────symlinks───▶ ~/.claude/skills/ ~/.windsurf/skills/ ~/.cursor/skills/
123
123
  ```
124
124
 
125
+ Gemini CLI is the one agent that needs no symlink: it implements the
126
+ [Agent Skills](https://agentskills.io) standard and discovers `~/.agents/skills`
127
+ — boost's canonical store — directly. Linking into `~/.gemini/skills` as well
128
+ would put the same skill in two of its discovery tiers, so boost deliberately
129
+ doesn't (`agents.gemini.links_skills` is `false`; flip it to `true` if you ever
130
+ need the copy). Rules and workflows still materialize under `~/.gemini/`.
131
+
125
132
  ### User scope vs project scope
126
133
 
127
134
  That's the default — **user scope**, the skills you want everywhere. The other
@@ -196,6 +203,37 @@ available on your PATH (or `ANTHROPIC_API_KEY` is set), and fall back to
196
203
  plain heuristics when it isn't — so the tool still works without an API key,
197
204
  just less cleverly.
198
205
 
206
+ ## boost as an MCP server
207
+
208
+ boost is itself an MCP server, so an agent can search and install skills mid-task
209
+ instead of waiting for you to shell out. `boost mcp register` wires it into every
210
+ agent CLI it finds on your PATH:
211
+
212
+ ```bash
213
+ boost mcp register # every installed host (default: --host auto)
214
+ boost mcp register --host gemini # just one
215
+ boost mcp unregister # same host selection, in reverse
216
+ ```
217
+
218
+ | Host | CLI | Registered in |
219
+ |------|-----|---------------|
220
+ | Claude Code | `claude` | `claude mcp add` → its user-scope MCP config |
221
+ | Gemini CLI | `gemini` | `gemini mcp add -s user` → `~/.gemini/settings.json` (`mcpServers`) |
222
+
223
+ A host whose CLI isn't installed is skipped, not an error — name it explicitly
224
+ (`--host gemini`) to have boost print the command for you to run later.
225
+
226
+ Six tools are exposed: `boost_search`, `boost_list`, `boost_info`,
227
+ `boost_install`, `boost_doctor`, and `boost_discover_github`. The server also
228
+ returns MCP `instructions`, which both hosts load into the model's context — it
229
+ tells the agent *when* boost is relevant, so a matching skill gets found at the
230
+ start of a task rather than after the work is already reconstructed by hand.
231
+
232
+ Verify the wiring with `claude mcp list` or `gemini mcp list` — boost should show
233
+ as **Connected**. (Gemini only connects stdio servers in a trusted folder; run
234
+ `gemini` once in the directory and accept the trust prompt if it shows
235
+ `Disabled`.)
236
+
199
237
  ## Claude Code hooks & the BMAD Method
200
238
 
201
239
  `boost hooks` manages Claude Code hooks in `settings.json` at either scope —
@@ -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.293'
22
- __version_tuple__ = version_tuple = (1, 0, 293)
21
+ __version__ = version = '1.0.294'
22
+ __version_tuple__ = version_tuple = (1, 0, 294)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -123,7 +123,7 @@ COMMANDS = [
123
123
  ("completions", "cfg", "configuration", "Generate shell tab-completion scripts"),
124
124
  ("schedule", "cfg", "configuration", "Manage automatic skill-sync scheduling"),
125
125
  ("serve", "cfg", "configuration", "Serve the skill catalog over HTTP (port 8787)"),
126
- ("mcp", "cfg", "configuration", "Register boost as an MCP server for Claude Code"),
126
+ ("mcp", "cfg", "configuration", "Register boost as an MCP server (Claude Code, Gemini CLI)"),
127
127
  ("hooks", "cfg", "hooks", "Manage Claude Code hooks (scope-aware) in settings.json"),
128
128
  ("bmad", "cfg", "bmad", "Install & manage the BMAD Method (scope-aware, toggleable)"),
129
129
  ("self-update", "cfg", "configuration", "Update boost itself to the latest version"),
@@ -24,6 +24,7 @@ from ..core import (
24
24
  journal,
25
25
  lockfile,
26
26
  mcp,
27
+ mcphost,
27
28
  paths,
28
29
  policy,
29
30
  rag,
@@ -870,8 +871,16 @@ def _tool_install(args: dict):
870
871
  res = store.install(entry)
871
872
  lines = ["installed %s v%s from %s → %s"
872
873
  % (res.name, entry.get("version", "?"), entry["tap"], res.dest),
873
- "linked agents: %s" % (", ".join(res.linked) or "none"),
874
- "quality score: %d/100" % res.score]
874
+ "linked agents: %s" % (", ".join(res.linked) or "none")]
875
+ # Without this an agent that reads the canonical store — Gemini CLI — sees
876
+ # only "linked agents: claude-code, windsurf, cursor", concludes the skill
877
+ # did not reach *it*, and goes back to reconstructing the work by hand.
878
+ # That is the exact failure this tool exists to prevent, so the line says
879
+ # plainly that the skill is already usable.
880
+ if res.native:
881
+ lines.append("available without linking (reads %s directly): %s"
882
+ % (res.dest.parent, ", ".join(res.native)))
883
+ lines.append("quality score: %d/100" % res.score)
875
884
  if res.conflicts:
876
885
  lines.append("conflicts (left in place): %s" % ", ".join(res.conflicts))
877
886
  # The same prompt-injection and secret scan `boost install` runs. This path
@@ -1004,59 +1013,89 @@ def _mcp_tool(tool: str, args: dict):
1004
1013
  return REGISTRY.call(tool, args)
1005
1014
 
1006
1015
 
1016
+ def _run_mcp_host(host: str, action: str, cmd) -> bool:
1017
+ """Run one host's register/unregister argv. True if it actually ran.
1018
+
1019
+ A host whose CLI is not installed is *not* an error — most machines have
1020
+ one agent CLI, not all of them — so the argv is printed for the user to run
1021
+ later and the caller moves on to the next host. A CLI that is present and
1022
+ fails is a real error and raises.
1023
+ """
1024
+ exe = mcphost.cli(host)
1025
+ if not shutil.which(exe):
1026
+ return False
1027
+ try:
1028
+ proc = subprocess.run(cmd, capture_output=True, text=True, timeout=60)
1029
+ except (OSError, subprocess.TimeoutExpired) as e:
1030
+ raise BoostError("%s mcp %s failed: %s" % (exe, action, e),
1031
+ hint="run it yourself: " + " ".join(cmd)) from e
1032
+ for ln in (proc.stdout or "").strip().splitlines():
1033
+ out.info(ln)
1034
+ if proc.returncode != 0:
1035
+ tail = (proc.stderr or "").strip().splitlines()
1036
+ raise BoostError("%s mcp %s failed: %s"
1037
+ % (exe, action, tail[-1] if tail else "unknown error"),
1038
+ hint="run it yourself: " + " ".join(cmd))
1039
+ return True
1040
+
1041
+
1007
1042
  def cmd_mcp(argv) -> int:
1008
- """boost mcp [register|unregister] [--stdio]"""
1043
+ """boost mcp [register|unregister] [--host H] [--stdio]"""
1009
1044
  p = cliparse.parser(
1010
1045
  prog="boost mcp",
1011
- description="Register boost as an MCP server for Claude Code")
1046
+ description="Register boost as an MCP server for your agent CLIs")
1012
1047
  p.add_argument("action", nargs="?", default="register",
1013
1048
  choices=("register", "unregister"),
1014
1049
  help="what to do (default: register)")
1050
+ p.add_argument("--host", metavar="H", default="auto",
1051
+ help="agent CLI to (un)register with: %s, or `auto` "
1052
+ "(default) for every one that is installed"
1053
+ % ", ".join(mcphost.hosts()))
1015
1054
  p.add_argument("--stdio", action="store_true",
1016
- help="run the MCP server on stdin/stdout (used by Claude Code)")
1055
+ help="run the MCP server on stdin/stdout (used by the agent)")
1017
1056
  args = p.parse_args(argv)
1018
1057
 
1019
1058
  if args.stdio:
1020
1059
  return mcp.serve_stdio(REGISTRY, version=__version__)
1021
1060
 
1022
- shim = paths.launcher()
1023
- if args.action == "register":
1024
- # Fork-safe launch env: a host that fork()s into `boost mcp --stdio`
1025
- # on macOS can SIGABRT on the child side *pre-exec* if Obj-C is touched
1026
- # post-fork (CFPreferences / _scproxy proxy lookup). Disabling the
1027
- # fork-safety trap and short-circuiting proxy resolution keeps the
1028
- # host's fork into boost from aborting before our Python ever runs.
1029
- #
1030
- # The server name ("boost") MUST come before the `-e` flags: `claude`'s
1031
- # `-e` is variadic, so a name placed after it is swallowed as another
1032
- # env var ("Invalid environment variable format: boost"). Order is
1033
- # `add <name> [options] -- <command>`.
1034
- cmd = ["claude", "mcp", "add", "boost", "--scope", "user",
1035
- "-e", "OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES",
1036
- "-e", "no_proxy=*",
1037
- "--", str(shim), "mcp", "--stdio"]
1038
- else:
1039
- cmd = ["claude", "mcp", "remove", "boost"]
1040
-
1041
- if shutil.which("claude"):
1042
- try:
1043
- proc = subprocess.run(cmd, capture_output=True, text=True, timeout=60)
1044
- except (OSError, subprocess.TimeoutExpired) as e:
1045
- raise BoostError("claude mcp %s failed: %s" % (args.action, e),
1046
- hint="run it yourself: " + " ".join(cmd)) from e
1047
- for ln in (proc.stdout or "").strip().splitlines():
1048
- out.info(ln)
1049
- if proc.returncode != 0:
1050
- tail = (proc.stderr or "").strip().splitlines()
1051
- raise BoostError("claude mcp %s failed: %s"
1052
- % (args.action, tail[-1] if tail else "unknown error"),
1053
- hint="run it yourself: " + " ".join(cmd))
1054
- out.ok("%sed boost as an MCP server (scope: user)"
1055
- % ("register" if args.action == "register" else "unregister"))
1056
- else:
1057
- out.warn("`claude` CLI not found — run this yourself:")
1058
- out.info(" ".join(cmd))
1059
- journal.log("mcp", args.action)
1061
+ try:
1062
+ targets = mcphost.resolve(args.host)
1063
+ except KeyError as e:
1064
+ raise BoostError("unknown MCP host %r" % args.host,
1065
+ hint="known hosts: %s" % ", ".join(mcphost.hosts())) from e
1066
+
1067
+ shim = str(paths.launcher())
1068
+ # `auto` skips hosts that are not installed; naming a host explicitly (or
1069
+ # `all`) always reports it, so a user setting up a machine can see the argv
1070
+ # for an agent CLI they have not installed yet.
1071
+ explicit = args.host not in (None, "", "auto")
1072
+ done, missing = [], []
1073
+ for host in targets:
1074
+ cmd = mcphost.argv(host, args.action, shim)
1075
+ if _run_mcp_host(host, args.action, cmd):
1076
+ done.append(host)
1077
+ else:
1078
+ missing.append(host)
1079
+ if explicit:
1080
+ out.warn("`%s` CLI not found — run this yourself:"
1081
+ % mcphost.cli(host))
1082
+ out.info(" ".join(cmd))
1083
+
1084
+ verb = "register" if args.action == "register" else "unregister"
1085
+ for host in done:
1086
+ out.ok("%sed boost as an MCP server for %s (scope: user)"
1087
+ % (verb, mcphost.label(host)))
1088
+ if not done:
1089
+ # Nothing ran. Under `auto` nothing has been printed yet, so say which
1090
+ # CLIs were looked for rather than exiting silently on success.
1091
+ if not explicit:
1092
+ out.warn("no agent CLI found (looked for: %s)"
1093
+ % ", ".join(mcphost.cli(h) for h in missing))
1094
+ for host in missing:
1095
+ out.info(" ".join(mcphost.argv(host, args.action, shim)))
1096
+ journal.log("mcp", args.action, hosts="")
1097
+ return 0
1098
+ journal.log("mcp", args.action, hosts=",".join(done))
1060
1099
  return 0
1061
1100
 
1062
1101
 
@@ -112,9 +112,13 @@ def _offer_mcp(res: store.InstallResult, no_mcp: bool = False) -> None:
112
112
  is stated at install time, and boost offers to run the registration for the
113
113
  servers that came with a runnable spec.
114
114
 
115
- Advisory, never fatal: a declined prompt, a missing ``claude`` CLI or a failed
115
+ Advisory, never fatal: a declined prompt, a missing agent CLI or a failed
116
116
  registration all leave the skill installed. Suppressed by ``--no-mcp`` (passed
117
117
  down as ``no_mcp``) or by exporting ``BOOST_NO_MCP_OFFER``.
118
+
119
+ The offer targets whichever agent CLIs are actually installed, so a machine
120
+ with only Gemini CLI is offered ``gemini mcp add`` rather than a ``claude``
121
+ command it cannot run.
118
122
  """
119
123
  rows = res.mcp_servers
120
124
  if not rows or no_mcp or os.environ.get("BOOST_NO_MCP_OFFER"):
@@ -132,22 +136,30 @@ def _offer_mcp(res: store.InstallResult, no_mcp: bool = False) -> None:
132
136
  # Name-only declarations: boost will not invent a command line.
133
137
  out.dim(" install these yourself, then `boost mcp register`")
134
138
  return
135
- if not out.confirm("register %s with Claude Code now?"
136
- % _plural(len(wirable), "server"), default=False):
137
- out.dim(" skipped — `claude mcp add …` when you're ready")
139
+ from ..core import mcphost
140
+ # Offer the CLIs that are actually here. With none installed we still fall
141
+ # back to the full list so the manual command lines get printed.
142
+ targets = [h for h in mcphost.hosts() if shutil.which(mcphost.cli(h))] \
143
+ or mcphost.hosts()
144
+ where = " · ".join(mcphost.label(h) for h in targets)
145
+ if not out.confirm("register %s with %s now?"
146
+ % (_plural(len(wirable), "server"), where), default=False):
147
+ out.dim(" skipped — `%s mcp add …` when you're ready"
148
+ % mcphost.cli(targets[0]))
138
149
  return
139
150
  for row in wirable:
140
- _register_mcp_server(row["name"], row["spec"])
151
+ for host in targets:
152
+ _register_mcp_server(row["name"], row["spec"], host=host)
141
153
 
142
154
 
143
- def _register_mcp_server(name: str, spec: dict) -> None:
144
- """Run one `claude mcp add` for a skill-declared server. Never raises."""
155
+ def _register_mcp_server(name: str, spec: dict, host: str = "claude") -> None:
156
+ """Run one `<host> mcp add` for a skill-declared server. Never raises."""
145
157
  import subprocess
146
158
 
147
- from ..core import mcpdecl
148
- argv = mcpdecl.register_argv(name, spec)
149
- if not shutil.which("claude"):
150
- out.warn("`claude` CLI not found — run this yourself:")
159
+ from ..core import mcpdecl, mcphost
160
+ argv = mcpdecl.register_argv(name, spec, host=host)
161
+ if not shutil.which(mcphost.cli(host)):
162
+ out.warn("`%s` CLI not found — run this yourself:" % mcphost.cli(host))
151
163
  out.info(" " + " ".join(argv))
152
164
  return
153
165
  try:
@@ -162,8 +174,8 @@ def _register_mcp_server(name: str, spec: dict) -> None:
162
174
  % (name, tail[-1] if tail else "unknown error"))
163
175
  out.info(" run it yourself: " + " ".join(argv))
164
176
  return
165
- out.ok("registered MCP server %s" % name)
166
- journal.log("mcp-register", name)
177
+ out.ok("registered MCP server %s with %s" % (name, mcphost.label(host)))
178
+ journal.log("mcp-register", name, host=host)
167
179
 
168
180
 
169
181
  def _report_result(res: store.InstallResult, no_mcp: bool = False) -> None:
@@ -191,8 +203,13 @@ def _report_result(res: store.InstallResult, no_mcp: bool = False) -> None:
191
203
  out.ok("copied to %s" % _tilde(res.dest))
192
204
  if res.linked:
193
205
  out.ok("linked → %s" % " · ".join(res.linked))
194
- else:
206
+ elif not res.native:
195
207
  out.warn("no agent links created (no enabled agents?)")
208
+ # Agents that read the canonical store need no link, but saying nothing
209
+ # would make a Gemini-only install look like it reached no agent at all.
210
+ if res.native:
211
+ out.ok("available to %s (reads the store directly)"
212
+ % " · ".join(agents.display_name(a) for a in res.native))
196
213
  for path in res.conflicts:
197
214
  out.warn("not linked: %s exists and is not managed by boost" % _tilde(path))
198
215
  out.ok("lock updated (.skill-lock.json)")
@@ -605,7 +605,9 @@ def cmd_heal(argv):
605
605
  dry = args.dry_run
606
606
  actions: List[str] = []
607
607
 
608
- wanted = [paths.boost_home(), paths.repos_dir(), paths.cache_dir(), paths.logs_dir(), paths.state_dir(), paths.snapshots_dir(), paths.lock_history_dir(), paths.profiles_dir(), paths.store_dir(), *list(agents.enabled_agents().values())]
608
+ # linking_agents, matching agents.ensure_agent_dirs below: a native-store
609
+ # agent's skills dir is never written to, so it is not a missing directory.
610
+ wanted = [paths.boost_home(), paths.repos_dir(), paths.cache_dir(), paths.logs_dir(), paths.state_dir(), paths.snapshots_dir(), paths.lock_history_dir(), paths.profiles_dir(), paths.store_dir(), *list(agents.linking_agents().values())]
609
611
  missing = [d for d in wanted if not d.is_dir()]
610
612
  if missing:
611
613
  if dry:
@@ -818,7 +820,7 @@ def cmd_health(argv):
818
820
 
819
821
  expected = [n for n, e in installed if not e.get("quarantined")]
820
822
  coverage_ok = True
821
- for agent, adir in agents.enabled_agents().items():
823
+ for agent, adir in agents.linking_agents().items():
822
824
  linked = sum(1 for n in expected
823
825
  if (adir / n).is_symlink() and (adir / n).exists())
824
826
  full = linked == len(expected)
@@ -826,6 +828,13 @@ def cmd_health(argv):
826
828
  out.kv(agent, "%d/%d %s" % (linked, len(expected),
827
829
  out.role("✓", "success") if full
828
830
  else out.role("!", "warn")))
831
+ # Agents that read the canonical store have no links to count — scoring
832
+ # them 0/N would report a healthy setup as broken. They are listed anyway,
833
+ # because an agent silently absent from a health report reads as "boost is
834
+ # not wired up for it".
835
+ for agent in agents.native_store_agents():
836
+ out.kv(agent, "%d/%d %s (reads the store directly)"
837
+ % (len(expected), len(expected), out.role("✓", "success")))
829
838
 
830
839
  drift_counts: dict = {}
831
840
  for name, entry in installed:
@@ -0,0 +1,80 @@
1
+ """AI agent targets: where installed skills get symlinked."""
2
+ from __future__ import annotations
3
+
4
+ from pathlib import Path
5
+ from typing import Dict
6
+
7
+ from . import config, paths
8
+
9
+ DISPLAY = {"claude-code": "Claude Code", "windsurf": "Windsurf",
10
+ "cursor": "Cursor", "gemini": "Gemini CLI"}
11
+
12
+
13
+ def known_agents() -> Dict[str, dict]:
14
+ """{name: {"dir": Path, "enabled": bool, "links_skills": bool}} per agent."""
15
+ out = {}
16
+ for name, spec in (config.get("agents") or {}).items():
17
+ out[name] = {
18
+ "dir": paths.expand(str(spec.get("dir", ""))),
19
+ "enabled": bool(spec.get("enabled", True)),
20
+ # Defaults True: an agent only reads the canonical store if it
21
+ # implements the Agent Skills standard's `~/.agents/skills` path,
22
+ # which most do not, so the symlink is the safe assumption.
23
+ "links_skills": bool(spec.get("links_skills", True)),
24
+ }
25
+ return out
26
+
27
+
28
+ def enabled_agents() -> Dict[str, Path]:
29
+ """{name: dir Path} for just the agents whose "enabled" flag is true."""
30
+ return {n: s["dir"] for n, s in known_agents().items() if s["enabled"]}
31
+
32
+
33
+ def linking_agents() -> Dict[str, Path]:
34
+ """The enabled agents that need a skill *symlinked* into their own dir.
35
+
36
+ Most agents do: they only look inside their own config directory, so a
37
+ skill is invisible until boost links it there. Gemini CLI is the exception —
38
+ it implements the Agent Skills standard and discovers ``~/.agents/skills``
39
+ directly, which is exactly :func:`paths.store_dir`. Linking for it would put
40
+ the same skill in two of its discovery tiers, and since the ``.agents``
41
+ alias out-ranks ``.gemini/skills`` within the user tier, the copy boost
42
+ linked could never win — it would only make Gemini log a "Skill conflict
43
+ detected" line per skill, every session.
44
+
45
+ So this is the set to iterate for anything symlink-shaped (link, unlink,
46
+ stale-link sweeps, coverage checks). :func:`enabled_agents` remains the set
47
+ for everything that materializes *into* an agent's dotdir — rules and
48
+ workflows — because those have no canonical store to be read from.
49
+ """
50
+ return {n: s["dir"] for n, s in known_agents().items()
51
+ if s["enabled"] and s["links_skills"]}
52
+
53
+
54
+ def native_store_agents() -> Dict[str, Path]:
55
+ """Enabled agents that read the canonical store without a symlink.
56
+
57
+ The complement of :func:`linking_agents` within :func:`enabled_agents` —
58
+ reported at install time so "linked → a · b · c" never reads as "and not
59
+ the agent you actually use".
60
+ """
61
+ return {n: s["dir"] for n, s in known_agents().items()
62
+ if s["enabled"] and not s["links_skills"]}
63
+
64
+
65
+ def display_name(agent: str) -> str:
66
+ """`claude-code` -> "Claude Code"; unknown names pass through unchanged."""
67
+ return DISPLAY.get(agent, agent)
68
+
69
+
70
+ def ensure_agent_dirs() -> None:
71
+ """Create every *linking* agent's skills dir (`mkdir -p`, idempotent).
72
+
73
+ Not :func:`enabled_agents`: this exists so a skill has somewhere to be
74
+ linked, and boost never links into a native-store agent's dir. Creating
75
+ ``~/.gemini/skills`` anyway would leave an empty directory nothing ever
76
+ writes to, which ``boost heal`` would first report as a missing directory
77
+ it needed to create.
78
+ """
79
+ for d in linking_agents().values():
80
+ d.mkdir(parents=True, exist_ok=True)
@@ -12,6 +12,20 @@ DEFAULTS = {
12
12
  "claude-code": {"dir": "~/.claude/skills", "enabled": True},
13
13
  "windsurf": {"dir": "~/.windsurf/skills", "enabled": True},
14
14
  "cursor": {"dir": "~/.cursor/skills", "enabled": True},
15
+ # Gemini CLI discovers boost's canonical store directly: its user tier
16
+ # reads `~/.gemini/skills` **or the `~/.agents/skills` alias**, and that
17
+ # alias is exactly paths.store_dir(). So skills need no symlink —
18
+ # `links_skills: false` — and linking anyway would put the same skill in
19
+ # two of Gemini's discovery tiers, where the alias out-ranks the dir we
20
+ # linked into: the link could never win, it would only cost the user a
21
+ # "Skill conflict detected" line per skill at every session start.
22
+ #
23
+ # The dir is still configured because it anchors everything that is NOT
24
+ # a store symlink: `~/.gemini` is where rules (GEMINI.md) and workflows
25
+ # (commands/, agents/) materialize. Set links_skills true to restore the
26
+ # symlink if that alias is ever narrowed.
27
+ "gemini": {"dir": "~/.gemini/skills", "enabled": True,
28
+ "links_skills": False},
15
29
  },
16
30
  "taps": [], # [{"name": "owner/repo", "url": "...", "curated": bool}]
17
31
  "ai": {