boost-skill-cli 1.2.20__tar.gz → 1.2.22__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 (746) hide show
  1. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.vale/styles/config/vocabularies/boost/accept.txt +4 -0
  2. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/CLAUDE.md +18 -0
  3. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/PKG-INFO +1 -1
  4. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/_version.py +2 -2
  5. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/discovery.py +28 -5
  6. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/info.py +1 -1
  7. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/intelligence.py +11 -5
  8. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/quality.py +10 -7
  9. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/team.py +10 -4
  10. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/output.py +124 -9
  11. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/rag.py +65 -0
  12. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  13. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_skill_cli.egg-info/SOURCES.txt +1 -0
  14. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/eval-latest.json +2 -2
  15. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/rag-architecture.md +14 -0
  16. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/bm25-has-no-stemming.md +28 -10
  17. boost_skill_cli-1.2.22/docs/roadmap/items/long-hints-overflow-narrow-panes.md +69 -0
  18. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap.html +79 -30
  19. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/explain.feature +2 -2
  20. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/steps/cli_steps.py +14 -0
  21. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_discovery.py +24 -1
  22. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_info.py +1 -1
  23. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_intelligence.py +25 -12
  24. boost_skill_cli-1.2.22/tests/functional/test_cli_pane_width.py +137 -0
  25. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_quality.py +2 -2
  26. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_team.py +6 -2
  27. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_output.py +217 -0
  28. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_rag.py +123 -0
  29. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/visual/package-lock.json +12 -12
  30. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/visual/package.json +1 -1
  31. boost_skill_cli-1.2.20/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -38
  32. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.gitattributes +0 -0
  33. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.gitignore +0 -0
  34. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.gitleaks.toml +0 -0
  35. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.htmlvalidate.json +0 -0
  36. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.lighthouserc.json +0 -0
  37. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.lycheeignore +0 -0
  38. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.markdownlint-cli2.jsonc +0 -0
  39. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.pre-commit-config.yaml +0 -0
  40. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.stylelintrc.json +0 -0
  41. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.vale/styles/boost/Terminology.yml +0 -0
  42. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.vale.ini +0 -0
  43. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/CODE_OF_CONDUCT.md +0 -0
  44. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/CONTRIBUTING.md +0 -0
  45. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/LICENSE +0 -0
  46. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/MANIFEST.in +0 -0
  47. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/Makefile +0 -0
  48. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/README.md +0 -0
  49. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/SECURITY.md +0 -0
  50. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost +0 -0
  51. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/__init__.py +0 -0
  52. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/__main__.py +0 -0
  53. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/cli.py +0 -0
  54. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/cliparse.py +0 -0
  55. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/__init__.py +0 -0
  56. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/_common.py +0 -0
  57. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/bmad.py +0 -0
  58. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/configuration.py +0 -0
  59. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/hooks.py +0 -0
  60. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/pkg.py +0 -0
  61. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/run.py +0 -0
  62. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/safety.py +0 -0
  63. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/taps.py +0 -0
  64. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/__init__.py +0 -0
  65. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/adapters.py +0 -0
  66. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/agents.py +0 -0
  67. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/ai.py +0 -0
  68. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/bmad.py +0 -0
  69. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/bootstrap.py +0 -0
  70. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/browse.py +0 -0
  71. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/builtin.py +0 -0
  72. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/capabilities.py +0 -0
  73. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/catalog.py +0 -0
  74. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/catalogbundle.py +0 -0
  75. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/chat.py +0 -0
  76. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/claude_settings.py +0 -0
  77. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/complete.py +0 -0
  78. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/config.py +0 -0
  79. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/dense.py +0 -0
  80. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/ed25519.py +0 -0
  81. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/embed.py +0 -0
  82. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/faithfulness.py +0 -0
  83. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/frontmatter.py +0 -0
  84. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/gitutil.py +0 -0
  85. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/imperative.py +0 -0
  86. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/injectscan.py +0 -0
  87. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/installscan.py +0 -0
  88. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/integrity.py +0 -0
  89. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/journal.py +0 -0
  90. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/localembed.py +0 -0
  91. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/lockfile.py +0 -0
  92. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/logs.py +0 -0
  93. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/mcp.py +0 -0
  94. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/mcpdecl.py +0 -0
  95. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/mcphost.py +0 -0
  96. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/minisign.py +0 -0
  97. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/nethttp.py +0 -0
  98. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/paths.py +0 -0
  99. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/policy.py +0 -0
  100. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/projectlock.py +0 -0
  101. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/provenance.py +0 -0
  102. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/registry.py +0 -0
  103. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/resolve.py +0 -0
  104. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/rules.py +0 -0
  105. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/scopes.py +0 -0
  106. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/secretscan.py +0 -0
  107. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/selfupdate.py +0 -0
  108. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/serve.py +0 -0
  109. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/stackprobe.py +0 -0
  110. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/staleness.py +0 -0
  111. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/store.py +0 -0
  112. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/trustaudit.py +0 -0
  113. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/typosquat.py +0 -0
  114. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/updatediff.py +0 -0
  115. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/util.py +0 -0
  116. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/workflows.py +0 -0
  117. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/data/registries.json +0 -0
  118. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/data/rules/boost-first.mdc +0 -0
  119. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/errors.py +0 -0
  120. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/spin.py +0 -0
  121. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_langchain/__init__.py +0 -0
  122. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_langchain/_compat.py +0 -0
  123. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_langchain/graph.py +0 -0
  124. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_langchain/loader.py +0 -0
  125. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_langchain/py.typed +0 -0
  126. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_langchain/retriever.py +0 -0
  127. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  128. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  129. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_skill_cli.egg-info/requires.txt +0 -0
  130. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_skill_cli.egg-info/top_level.txt +0 -0
  131. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/codecov.yml +0 -0
  132. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/.claude/settings.local.json +0 -0
  133. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/DEBUGGING.md +0 -0
  134. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/adapters.html +0 -0
  135. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/architecture/README.md +0 -0
  136. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/architecture/c4-components-core.md +0 -0
  137. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/architecture/c4-containers.md +0 -0
  138. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/architecture/c4-context.md +0 -0
  139. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/architecture/c4-dynamic-install.md +0 -0
  140. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/gifs/distill.gif +0 -0
  141. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/gifs/doctor.gif +0 -0
  142. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/gifs/explain.gif +0 -0
  143. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/gifs/hooks.gif +0 -0
  144. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/gifs/install.gif +0 -0
  145. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/gifs/pulse.gif +0 -0
  146. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/gifs/search.gif +0 -0
  147. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/gifs/tap.gif +0 -0
  148. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/tapes/distill.tape +0 -0
  149. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/tapes/doctor.tape +0 -0
  150. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/tapes/explain.tape +0 -0
  151. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/tapes/hooks.tape +0 -0
  152. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/tapes/install.tape +0 -0
  153. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/tapes/pulse.tape +0 -0
  154. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/tapes/search.tape +0 -0
  155. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/tapes/tap.tape +0 -0
  156. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel.html +0 -0
  157. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/chat.html +0 -0
  158. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/commands.html +0 -0
  159. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/demo-index.json +0 -0
  160. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/demo.gif +0 -0
  161. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/demo.html +0 -0
  162. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/demo.tape +0 -0
  163. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/design-roadmap.html +0 -0
  164. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/eval.html +0 -0
  165. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/index.html +0 -0
  166. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/langchain.html +0 -0
  167. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/mcp-hub.html +0 -0
  168. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D01.md +0 -0
  169. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D02.md +0 -0
  170. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D03.md +0 -0
  171. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D04.md +0 -0
  172. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D05.md +0 -0
  173. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D06.md +0 -0
  174. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D07.md +0 -0
  175. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D08.md +0 -0
  176. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D09.md +0 -0
  177. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D10.md +0 -0
  178. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D11.md +0 -0
  179. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D12.md +0 -0
  180. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D13.md +0 -0
  181. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D14.md +0 -0
  182. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D15.md +0 -0
  183. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D16.md +0 -0
  184. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D17.md +0 -0
  185. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D18.md +0 -0
  186. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D19.md +0 -0
  187. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D20.md +0 -0
  188. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D21.md +0 -0
  189. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D22.md +0 -0
  190. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D23.md +0 -0
  191. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D24.md +0 -0
  192. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D25.md +0 -0
  193. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D26.md +0 -0
  194. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  195. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  196. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  197. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  198. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  199. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  200. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  201. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  202. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  203. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  204. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  205. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  206. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
  207. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/boost-first-rule.md +0 -0
  208. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  209. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  210. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  211. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  212. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
  213. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  214. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  215. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  216. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  217. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
  218. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  219. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  220. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  221. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  222. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  223. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  224. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
  225. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  226. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  227. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
  228. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/command-carousel-page.md +0 -0
  229. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  230. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  231. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
  232. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  233. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  234. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  235. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  236. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  237. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  238. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
  239. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  240. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  241. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  242. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  243. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
  244. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  245. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  246. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  247. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  248. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  249. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
  250. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  251. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  252. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  253. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  254. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  255. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  256. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  257. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  258. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  259. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  260. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  261. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  262. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  263. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  264. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  265. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  266. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  267. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  268. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  269. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  270. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  271. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  272. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  273. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  274. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  275. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  276. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/github-community-health-files.md +0 -0
  277. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  278. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  279. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  280. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  281. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  282. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  283. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  284. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  285. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  286. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  287. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  288. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  289. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  290. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  291. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  292. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  293. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  294. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  295. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  296. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  297. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  298. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  299. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  300. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  301. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  302. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  303. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  304. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  305. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  306. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  307. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  308. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  309. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  310. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  311. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  312. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  313. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  314. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  315. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  316. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  317. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
  318. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  319. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  320. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  321. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  322. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  323. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  324. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  325. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  326. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  327. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  328. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  329. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  330. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  331. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  332. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  333. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  334. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  335. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  336. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  337. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  338. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  339. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  340. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  341. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  342. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  343. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  344. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  345. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  346. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  347. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  348. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  349. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  350. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  351. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  352. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
  353. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  354. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  355. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  356. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  357. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  358. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  359. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  360. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  361. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  362. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  363. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  364. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  365. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  366. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  367. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  368. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  369. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  370. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  371. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  372. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  373. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  374. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  375. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  376. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  377. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  378. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  379. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  380. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  381. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  382. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  383. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  384. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  385. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  386. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  387. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  388. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  389. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  390. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  391. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  392. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  393. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  394. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  395. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  396. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  397. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  398. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  399. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  400. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
  401. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  402. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  403. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  404. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  405. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  406. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  407. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
  408. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
  409. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
  410. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  411. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
  412. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
  413. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  414. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  415. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  416. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
  417. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  418. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  419. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  420. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  421. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  422. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  423. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
  424. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  425. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  426. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  427. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
  428. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  429. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
  430. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
  431. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
  432. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
  433. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  434. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
  435. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
  436. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
  437. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  438. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  439. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  440. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  441. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  442. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  443. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  444. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  445. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  446. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  447. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  448. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  449. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  450. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  451. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  452. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  453. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  454. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  455. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/workspace-scope-install.md +0 -0
  456. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/zip-strict-audit.md +0 -0
  457. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  458. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  459. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
  460. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/eslint.config.mjs +0 -0
  461. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/evals/README.md +0 -0
  462. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/evals/__init__.py +0 -0
  463. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/evals/baseline.json +0 -0
  464. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/evals/faithfulness.py +0 -0
  465. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/evals/golden_set.json +0 -0
  466. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/evals/make_corpus.py +0 -0
  467. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/evals/make_golden.py +0 -0
  468. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/evals/metrics.py +0 -0
  469. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/evals/publish_golden_dataset.py +0 -0
  470. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/evals/run_evals.py +0 -0
  471. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/examples/README.md +0 -0
  472. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/examples/adapt-demo.sh +0 -0
  473. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/examples/boost-run-prototype.sh +0 -0
  474. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/index.html +0 -0
  475. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/noxfile.py +0 -0
  476. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/pyproject.toml +0 -0
  477. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/coverage-tools.in +0 -0
  478. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/coverage-tools.txt +0 -0
  479. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/lint-tools.in +0 -0
  480. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/lint-tools.txt +0 -0
  481. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/mutation-tools.in +0 -0
  482. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/mutation-tools.txt +0 -0
  483. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/platform-pins.lock +0 -0
  484. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/release-tools.in +0 -0
  485. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/release-tools.txt +0 -0
  486. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/test-tools.in +0 -0
  487. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/test-tools.txt +0 -0
  488. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/a11y_check.py +0 -0
  489. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/bench_cli.sh +0 -0
  490. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/build_command_reference.py +0 -0
  491. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/build_demo_index.py +0 -0
  492. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/build_registries.py +0 -0
  493. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/build_roadmap.py +0 -0
  494. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/build_scale_corpus.py +0 -0
  495. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/check_anchors.py +0 -0
  496. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/check_licenses.py +0 -0
  497. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/check_required_checks.py +0 -0
  498. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/ensure_eval_corpus.sh +0 -0
  499. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/eval_corpus.py +0 -0
  500. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/eval_explain.py +0 -0
  501. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/eval_gate.py +0 -0
  502. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/eval_recommend.py +0 -0
  503. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/eval_retrieval.py +0 -0
  504. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/eval_stats_summary.py +0 -0
  505. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/import_budget.py +0 -0
  506. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/lock_toolchain.py +0 -0
  507. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/measure_registry.py +0 -0
  508. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/mutation_gate.py +0 -0
  509. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/mutation_shards.py +0 -0
  510. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/mutation_weights.json +0 -0
  511. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/page_budget.py +0 -0
  512. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/perf_gate.py +0 -0
  513. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/post_deploy_smoke.py +0 -0
  514. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/publish_eval_json.py +0 -0
  515. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/release_guard.py +0 -0
  516. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/release_preflight.py +0 -0
  517. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/serve_docs.py +0 -0
  518. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/setup.cfg +0 -0
  519. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/sonar-project.properties +0 -0
  520. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/style/README.md +0 -0
  521. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/style/boost.css +0 -0
  522. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/style/boost.js +0 -0
  523. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/style/demo.html +0 -0
  524. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/adapt.feature +0 -0
  525. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/browse.feature +0 -0
  526. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/count.feature +0 -0
  527. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/discover.feature +0 -0
  528. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/doctor.feature +0 -0
  529. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/environment.py +0 -0
  530. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/index.feature +0 -0
  531. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/install.feature +0 -0
  532. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/list.feature +0 -0
  533. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/mcp.feature +0 -0
  534. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/search.feature +0 -0
  535. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/steps/discovery_steps.py +0 -0
  536. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/steps/mcp_steps.py +0 -0
  537. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/steps/quality_steps.py +0 -0
  538. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/conftest.py +0 -0
  539. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/eval/baseline.json +0 -0
  540. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/eval/explain.jsonl +0 -0
  541. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/eval/golden-natural.jsonl +0 -0
  542. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/eval/golden.jsonl +0 -0
  543. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/eval/recommend.jsonl +0 -0
  544. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/eval/taps-scale.txt +0 -0
  545. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/eval/taps.txt +0 -0
  546. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_capabilities_policy.py +0 -0
  547. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_adapt.py +0 -0
  548. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_bmad.py +0 -0
  549. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_catalog.py +0 -0
  550. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_chat.py +0 -0
  551. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_configuration.py +0 -0
  552. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_hooks.py +0 -0
  553. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_pkg.py +0 -0
  554. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_taps.py +0 -0
  555. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_everyday_loop.py +0 -0
  556. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_integrity_enforce.py +0 -0
  557. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_kind_conformance.py +0 -0
  558. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_property_parsers.py +0 -0
  559. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_run.py +0 -0
  560. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_tap_signing.py +0 -0
  561. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_workspace_scope.py +0 -0
  562. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/README.md +0 -0
  563. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  564. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  565. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  566. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  567. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  568. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  569. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  570. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  571. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  572. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  573. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  574. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  575. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  576. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  577. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  578. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  579. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  580. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  581. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  582. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  583. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
  584. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
  585. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
  586. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/fuzz_frontmatter.py +0 -0
  587. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/fuzz_registry.py +0 -0
  588. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/langchain/conftest.py +0 -0
  589. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/langchain/test_graph.py +0 -0
  590. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/langchain/test_loader.py +0 -0
  591. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/langchain/test_retriever.py +0 -0
  592. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/make_fixture.py +0 -0
  593. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/perf/test_benchmarks.py +0 -0
  594. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/smoke.sh +0 -0
  595. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_a11y_check.py +0 -0
  596. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_action_pin_lockstep.py +0 -0
  597. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_adapters.py +0 -0
  598. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_adapters_multi.py +0 -0
  599. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_adapters_runner.py +0 -0
  600. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_agents.py +0 -0
  601. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_ai.py +0 -0
  602. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_bmad_core.py +0 -0
  603. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_boost_first_offer.py +0 -0
  604. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_bootstrap.py +0 -0
  605. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_browse.py +0 -0
  606. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_builtin.py +0 -0
  607. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_capabilities.py +0 -0
  608. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_catalog.py +0 -0
  609. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_catalogbundle.py +0 -0
  610. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_chat.py +0 -0
  611. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_check_anchors.py +0 -0
  612. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_check_licenses.py +0 -0
  613. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_claude_settings.py +0 -0
  614. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_clean_internal_cache.py +0 -0
  615. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_cliparse.py +0 -0
  616. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_codeql_analysis_key.py +0 -0
  617. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_command_reference_fresh.py +0 -0
  618. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_community_health_files.py +0 -0
  619. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_compact.py +0 -0
  620. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_complete.py +0 -0
  621. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_complete_rc_block.py +0 -0
  622. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_config.py +0 -0
  623. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_content_dedupe.py +0 -0
  624. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_content_identity.py +0 -0
  625. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_crash_redaction.py +0 -0
  626. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dedup_trust.py +0 -0
  627. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_demo_index.py +0 -0
  628. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense.py +0 -0
  629. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense_embed_dedupe.py +0 -0
  630. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense_fallback.py +0 -0
  631. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense_fix_hint.py +0 -0
  632. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense_quantized.py +0 -0
  633. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense_ready_order.py +0 -0
  634. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense_shard_real_schema.py +0 -0
  635. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
  636. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense_shards.py +0 -0
  637. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense_status.py +0 -0
  638. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense_status_cheap.py +0 -0
  639. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dependabot_config.py +0 -0
  640. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_docs_pages_linked.py +0 -0
  641. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_docsite_chrome.py +0 -0
  642. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_ed25519.py +0 -0
  643. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_embed.py +0 -0
  644. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_embed_local.py +0 -0
  645. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_embed_truncated_response.py +0 -0
  646. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_entry_key.py +0 -0
  647. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_errors_and_cli_table.py +0 -0
  648. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_eval_baseline.py +0 -0
  649. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_eval_corpus.py +0 -0
  650. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_eval_faithfulness.py +0 -0
  651. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_eval_gate.py +0 -0
  652. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_eval_grading.py +0 -0
  653. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_eval_metrics.py +0 -0
  654. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_eval_stats_summary.py +0 -0
  655. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  656. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_faithfulness.py +0 -0
  657. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_frontmatter.py +0 -0
  658. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_fuzz_targets.py +0 -0
  659. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  660. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_gitleaks_config.py +0 -0
  661. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_gitutil.py +0 -0
  662. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_gitutil_lfs.py +0 -0
  663. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_gitutil_sparse.py +0 -0
  664. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_imperative.py +0 -0
  665. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_import_budget.py +0 -0
  666. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_injectscan.py +0 -0
  667. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_install_permission_error.py +0 -0
  668. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_installscan.py +0 -0
  669. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_integrity.py +0 -0
  670. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_journal.py +0 -0
  671. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_langchain_packaging.py +0 -0
  672. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_link_ownership.py +0 -0
  673. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_localembed.py +0 -0
  674. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_localembed_e2e.py +0 -0
  675. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_lockfile.py +0 -0
  676. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_logs.py +0 -0
  677. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_marketing_counts.py +0 -0
  678. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_mcp.py +0 -0
  679. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_mcp_install_scan.py +0 -0
  680. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_mcpdecl.py +0 -0
  681. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_mcphost.py +0 -0
  682. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_measure_registry.py +0 -0
  683. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_minisign.py +0 -0
  684. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_mutation_hardening.py +0 -0
  685. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_mutation_shards.py +0 -0
  686. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_mutation_subfile_shards.py +0 -0
  687. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_mutmut_source_paths.py +0 -0
  688. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_nethttp.py +0 -0
  689. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_page_budget.py +0 -0
  690. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_paths.py +0 -0
  691. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_perf_gate.py +0 -0
  692. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_pkg_confusions.py +0 -0
  693. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_pkg_injection.py +0 -0
  694. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_pkg_secrets.py +0 -0
  695. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_platform_pins.py +0 -0
  696. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_policy.py +0 -0
  697. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_post_deploy_smoke.py +0 -0
  698. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_project_mcp_sidecar.py +0 -0
  699. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_projectlock.py +0 -0
  700. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_provenance.py +0 -0
  701. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_publish_golden_dataset.py +0 -0
  702. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_rag_fastpath.py +0 -0
  703. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_rag_fusion.py +0 -0
  704. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_registries_fresh.py +0 -0
  705. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_registry.py +0 -0
  706. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_registry_categories.py +0 -0
  707. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_registry_control_chars.py +0 -0
  708. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_release_guard.py +0 -0
  709. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_release_preflight.py +0 -0
  710. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_required_checks.py +0 -0
  711. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_rerank_cache.py +0 -0
  712. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_resolve.py +0 -0
  713. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_roadmap_fresh.py +0 -0
  714. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_rules.py +0 -0
  715. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_scale_corpus.py +0 -0
  716. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_scopes.py +0 -0
  717. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_secretscan.py +0 -0
  718. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_selfupdate.py +0 -0
  719. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_serve.py +0 -0
  720. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_serve_docs.py +0 -0
  721. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_shards_matrix.py +0 -0
  722. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_smoke_covers_every_command.py +0 -0
  723. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_spin.py +0 -0
  724. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_stackprobe.py +0 -0
  725. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_staleness.py +0 -0
  726. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_store.py +0 -0
  727. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_store_materialize.py +0 -0
  728. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_sync_blocked_links.py +0 -0
  729. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  730. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_token_parity.py +0 -0
  731. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_toolchain_lock.py +0 -0
  732. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_trustaudit.py +0 -0
  733. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_typosquat.py +0 -0
  734. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_updatediff.py +0 -0
  735. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_util.py +0 -0
  736. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_version.py +0 -0
  737. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_visual_harness_flags.py +0 -0
  738. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_workflow_concurrency.py +0 -0
  739. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  740. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  741. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_workflow_timeouts.py +0 -0
  742. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_workflows.py +0 -0
  743. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  744. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/visual/a11y_check.mjs +0 -0
  745. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/visual/console_check.mjs +0 -0
  746. {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/visual/visual_check.mjs +0 -0
@@ -5,6 +5,8 @@ allowlisted
5
5
  argparse
6
6
  Arize
7
7
  Attio
8
+ backtick
9
+ backticks
8
10
  Bagisto
9
11
  bmad
10
12
  bookended
@@ -98,6 +100,8 @@ stderr
98
100
  Stdlib
99
101
  stdlib
100
102
  stdout
103
+ stemmer
104
+ stemming
101
105
  subagents
102
106
  subcommand
103
107
  tappable
@@ -212,6 +212,24 @@ line coverage. Target `boost_cli/core` behavior with assertions, not just import
212
212
  a workflow is rendered per agent (TOML for Gemini, see
213
213
  `workflows.TOML_COMMAND_AGENTS`). Installing a rule therefore edits a file the
214
214
  user reads every session — treat it as more invasive than a skill, not less.
215
+ - **A long line is either chrome or data, and only chrome may be wrapped.**
216
+ `out.wrap()` folds prose to the pane, and the emitters take it opt-in —
217
+ `warn`/`info`/`dim`/`kv` accept `wrap=True` and each pays for its own prefix,
218
+ so continuations align under the message rather than folding to column zero.
219
+ It is opt-in because always-on wrapping would fold the lines that must stay
220
+ long: `pulse`'s `source=` paths and `fingerprint`'s 64-character hash are the
221
+ information the line exists to carry, and a hash split across two lines
222
+ cannot be compared by eye. **A backtick span is one atomic token**, spaces
223
+ and all — `doctor` and `search` both interpolate `dense.fix_hint()`, whose
224
+ answers end in `pip install 'boost-skill-cli[rag]'`, and a wrap that splits
225
+ that hands the user a command which does not run. A token wider than the pane
226
+ overflows whole rather than breaking. Wrap *before* adding color: `out.role`
227
+ brackets its argument with a start code and a reset, so coloring first and
228
+ splitting after leaves line one unterminated and line two plain. And
229
+ budget the emitter's own indent — wrapping to the full `term_width()` and
230
+ then letting `out.info` add two spaces is what put `boost search`'s hint one
231
+ column past the pane it had just been fitted to.
232
+
215
233
  - **Sub-actions of one action repo move in lockstep.** `github/codeql-action/{init,
216
234
  analyze,upload-sarif}` and `actions/cache{,/save,/restore}` are each *one repo at
217
235
  one commit*, but Dependabot tracks one `uses:` path as one dependency and raises a
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.20
3
+ Version: 1.2.22
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.2.20'
22
- __version_tuple__ = version_tuple = (1, 2, 20)
21
+ __version__ = version = '1.2.22'
22
+ __version_tuple__ = version_tuple = (1, 2, 22)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -12,7 +12,6 @@ import re
12
12
  import shutil
13
13
  import subprocess
14
14
  import sys
15
- import textwrap
16
15
  import threading
17
16
  import time
18
17
  import urllib.parse
@@ -152,7 +151,7 @@ def cmd_search(argv):
152
151
  if reranked:
153
152
  scored, ranker = reranked, "Claude Haiku relevance"
154
153
  else:
155
- out.warn(ai.fallback_note())
154
+ out.warn(ai.fallback_note(), wrap=True)
156
155
  shown = scored[:args.limit]
157
156
  # The dot marks "a skill by this name is installed" — a name match, with
158
157
  # the known homonym caveat (13 real skills share `code-reviewer`). A lock
@@ -176,10 +175,29 @@ def cmd_search(argv):
176
175
  installed=e["name"] in installed, lay=lay))
177
176
  out.info(out.role("%d match%s · ranked by %s"
178
177
  % (len(scored), "" if len(scored) == 1 else "es", ranker), "muted"))
178
+ if use_rag:
179
+ _note_stem_expansions(query)
179
180
  _hint_semantic_search(engine)
180
181
  return 0
181
182
 
182
183
 
184
+ def _note_stem_expansions(query: str) -> None:
185
+ """Say when a query term was widened to the word actually indexed.
186
+
187
+ Staying quiet would be a worse answer than the old empty one: the user
188
+ asked for `brainstorm` and is looking at results for `brainstorming`, and
189
+ only one of those is a word they typed.
190
+ """
191
+ subs = rag.stem_expansions(rag.tokenize(query))
192
+ if not subs:
193
+ return
194
+ said = ", ".join("%r" % term for term in subs)
195
+ shown = ", ".join("%r" % term for term in subs.values())
196
+ out.info(out.role(out.truncate(
197
+ "no exact match for %s — showing %s" % (said, shown),
198
+ max(0, out.term_width() - 2)), "muted"))
199
+
200
+
183
201
  def _hint_semantic_search(engine: str) -> None:
184
202
  """Say that a better engine exists, when BM25 answered alone.
185
203
 
@@ -209,8 +227,12 @@ def _hint_semantic_search(engine: str) -> None:
209
227
  # runnable — a copy-pasteable `pip install ...` matters more than a hard
210
228
  # clamp, and _FIX is tested to hold no token long enough to overflow.
211
229
  msg = "semantic search is off — %s" % dense.fix_hint(st.get("reason", ""), st)
212
- for line in textwrap.wrap(msg, max(out.term_width(), 20),
213
- break_long_words=False, break_on_hyphens=False):
230
+ # `- 2` pays for the indent `out.info` adds: wrapping to the full width and
231
+ # then indenting is what put this hint one column over the pane. Wrap
232
+ # first, colour each line after — `out.role` brackets its argument with a
233
+ # start code and a reset, so colouring first and splitting after leaves the
234
+ # first line unterminated and the second uncoloured.
235
+ for line in out.wrap(msg, max(out.term_width() - 2, 20)):
214
236
  out.info(out.role(line, "muted"))
215
237
 
216
238
 
@@ -296,7 +318,8 @@ def cmd_reindex(argv):
296
318
  ", ".join(stats["reindexed"]) or "none"), "muted"))
297
319
  if args.dense:
298
320
  if dense_stats is None:
299
- out.warn("dense index skipped — %s" % embed.fallback_note())
321
+ out.warn("dense index skipped — %s" % embed.fallback_note(),
322
+ wrap=True)
300
323
  else:
301
324
  failed = dense_stats.get("failed") or []
302
325
  if failed:
@@ -694,7 +694,7 @@ def cmd_explain(argv):
694
694
  "extractive summary instead"
695
695
  % ", ".join(faithfulness.ungrounded_terms(reply, text)[:4]))
696
696
  else:
697
- out.warn(ai.fallback_note())
697
+ out.warn(ai.fallback_note(), wrap=True)
698
698
  meta, body = frontmatter.parse(text)
699
699
  desc = str(meta.get("description") or "").strip()
700
700
  if desc:
@@ -46,7 +46,7 @@ def _note_fallback() -> None:
46
46
  """Warn once per invocation that the AI path is unavailable."""
47
47
  global _warned_fallback
48
48
  if not _warned_fallback:
49
- out.warn(ai.fallback_note())
49
+ out.warn(ai.fallback_note(), wrap=True)
50
50
  _warned_fallback = True
51
51
 
52
52
 
@@ -279,8 +279,12 @@ def cmd_simulate(argv: list[str]) -> int:
279
279
  out.info(" • (no imperative rules found in the skill body)")
280
280
  desc = str(meta.get("description") or "").strip()
281
281
  if desc:
282
- out.info(out.role('likely triggers when the task involves: "%s"'
283
- % desc[:100], "muted"))
282
+ # Clipped to 100 characters, which is a length and not a width: at
283
+ # 80 columns the quoted description ran seven past the pane. Wrapping
284
+ # shows the same clipped text and fits it.
285
+ trigger = 'likely triggers when the task involves: "%s"' % desc[:100]
286
+ for line in out.wrap(trigger, max(out.term_width() - 2, 20)):
287
+ out.info(out.role(line, "muted"))
284
288
  return 0
285
289
 
286
290
 
@@ -1191,8 +1195,10 @@ def _chat_session(args) -> int:
1191
1195
  if not ai.available():
1192
1196
  # Worth saying up front rather than letting every answer look terse for
1193
1197
  # an unexplained reason.
1194
- out.info(out.role("no AI configured — answers are the grounded matches "
1195
- "themselves (%s)" % ai.fallback_note(), "muted"))
1198
+ note = ("no AI configured — answers are the grounded matches "
1199
+ "themselves (%s)" % ai.fallback_note())
1200
+ for line in out.wrap(note, max(out.term_width() - 2, 20)):
1201
+ out.info(out.role(line, "muted"))
1196
1202
  out.info(out.role("ask about skills; blank line or Ctrl-D to exit", "muted"))
1197
1203
  history: list[chat_engine.Turn] = []
1198
1204
  while True:
@@ -364,10 +364,10 @@ def cmd_doctor(argv):
364
364
 
365
365
  out.heading("boost doctor")
366
366
 
367
- def bad(msg):
367
+ def bad(msg, wrap=False):
368
368
  nonlocal issues
369
369
  issues += 1
370
- out.warn(msg)
370
+ out.warn(msg, wrap=wrap)
371
371
 
372
372
  if gitutil.has_git():
373
373
  out.ok("git on PATH")
@@ -633,11 +633,12 @@ def _report_search_engine(bad) -> None:
633
633
  elif st["reason"] == "empty":
634
634
  detail += " but holds no vectors"
635
635
  bad("semantic search silently off — %d-chunk vector store %s; "
636
- "searches are using BM25. %s" % (st["chunks"], detail, fix))
636
+ "searches are using BM25. %s" % (st["chunks"], detail, fix),
637
+ wrap=True)
637
638
  return
638
639
 
639
640
  out.info("semantic search not configured — using the full-content BM25 "
640
- "engine (%s)" % fix)
641
+ "engine (%s)" % fix, wrap=True)
641
642
 
642
643
 
643
644
  def _print_skipped(skipped: list[dict]) -> None:
@@ -1010,7 +1011,7 @@ def cmd_conflict(argv):
1010
1011
  if i in confirmed:
1011
1012
  p["kind"] = "ai-confirmed"
1012
1013
  elif heuristic and not args.json:
1013
- out.warn(ai.fallback_note())
1014
+ out.warn(ai.fallback_note(), wrap=True)
1014
1015
 
1015
1016
  if args.json:
1016
1017
  print(json.dumps({"pairs": pairs}))
@@ -1058,8 +1059,10 @@ def cmd_changelog(argv):
1058
1059
  if not lines:
1059
1060
  out.warn("no history found for %s in %s" % (rel, tap.name))
1060
1061
  if len(lines) < 3:
1061
- print(out.role(" (shallow clone: run `git -C %s fetch --unshallow` "
1062
- "for full history)" % _tilde(tap.path), "muted"))
1062
+ note = ("(shallow clone: run `git -C %s fetch --unshallow` "
1063
+ "for full history)" % _tilde(tap.path))
1064
+ for line in out.wrap(note, max(out.term_width() - 2, 20)):
1065
+ print(out.role(" " + line, "muted"))
1063
1066
  return 0
1064
1067
 
1065
1068
 
@@ -481,8 +481,14 @@ def cmd_protocol(argv) -> int:
481
481
  if system == "Linux":
482
482
  out.kv("desktop", _tilde(_desktop_file())
483
483
  if _desktop_file().exists() else "not registered")
484
- out.kv("URL forms", "boost://install/<skill> · boost://install/<tap>:<skill> "
485
- "· boost://tap/<owner>/<repo>")
484
+ # One form per row rather than a `·`-joined run: the run was 100 columns,
485
+ # and wrapping it strands a bare `·` at the start of a line, because the
486
+ # separator is a word to any wrapper. A form per row needs no separator and
487
+ # reads the same at every width.
488
+ for i, form in enumerate(("boost://install/<skill>",
489
+ "boost://install/<tap>:<skill>",
490
+ "boost://tap/<owner>/<repo>")):
491
+ out.kv("URL forms" if i == 0 else "", form)
486
492
  out.dim(" try it: boost protocol open boost://install/brainstorming")
487
493
  return 0
488
494
 
@@ -713,7 +719,7 @@ def cmd_who(argv) -> int:
713
719
  out.table(rows[:20], headers=("WHEN", "USER", "ACTION"))
714
720
  print()
715
721
  out.dim("based on the local journal — in a team setup, pulse feeds "
716
- "aggregate via `boost onboard`")
722
+ "aggregate via `boost onboard`", wrap=True)
717
723
  return 0
718
724
 
719
725
  users: dict[str, dict] = {}
@@ -738,5 +744,5 @@ def cmd_who(argv) -> int:
738
744
  out.table(board, headers=("USER", "EVENTS", "SKILLS", "INSTALLS", "LAST ACTIVE"))
739
745
  print()
740
746
  out.dim("based on the local journal — in a team setup, pulse feeds aggregate "
741
- "via `boost onboard`")
747
+ "via `boost onboard`", wrap=True)
742
748
  return 0
@@ -200,20 +200,38 @@ def gradient(text: str, stream=None) -> str:
200
200
  return "".join(out)
201
201
 
202
202
 
203
+ def _wrap_lines(msg: str, lead: int) -> list[str]:
204
+ """Wrap `msg` for an emitter whose own prefix costs `lead` columns.
205
+
206
+ Returns at least one line so an emitter never silently prints nothing for a
207
+ message it was given; the emitter decides what its prefix and continuation
208
+ padding look like.
209
+ """
210
+ return wrap(msg, term_width() - lead) or [msg]
211
+
212
+
203
213
  def ok(msg: str) -> None:
204
214
  """Print msg as an indented success line with a green check mark."""
205
215
  print(" " + role("✓", "success") + " " + msg)
206
216
 
207
217
 
208
- def warn(msg: str, stream=None) -> None:
218
+ def warn(msg: str, stream=None, wrap: bool = False) -> None:
209
219
  """Print msg as an indented `!` warning line, all in the warn role.
210
220
 
211
221
  ``stream`` exists for the commands that also speak JSON on stdout: a notice
212
222
  about *which corpus answered* has to survive `--json`, and the old choice
213
223
  was between corrupting the JSON and suppressing the notice entirely. Passing
214
224
  ``sys.stderr`` keeps both.
225
+
226
+ ``wrap`` is opt-in per call site rather than always-on, because not every
227
+ long line is prose: `pulse`'s `source=` paths and `fingerprint`'s hash are
228
+ data, and folding those destroys the information the line exists to carry.
229
+ Prose hints pass it; data lines do not.
215
230
  """
216
- print(" " + role("!", "warn") + " " + role(msg, "warn"), file=stream)
231
+ body = _wrap_lines(msg, 4) if wrap else [msg]
232
+ for i, line in enumerate(body):
233
+ lead = " " + role("!", "warn") + " " if i == 0 else " "
234
+ print(lead + role(line, "warn"), file=stream)
217
235
 
218
236
 
219
237
  def err(msg: str, hint: str | None = None) -> None:
@@ -223,11 +241,17 @@ def err(msg: str, hint: str | None = None) -> None:
223
241
  print(c(" hint: " + hint, DIM), file=sys.stderr)
224
242
 
225
243
 
226
- def info(msg: str = "", stream=None) -> None:
244
+ def info(msg: str = "", stream=None, wrap: bool = False) -> None:
227
245
  """Print msg indented two spaces; a blank line when msg is empty.
228
246
 
229
247
  ``stream`` as in :func:`warn` — so a hint can accompany a stderr notice.
248
+ ``wrap`` as in :func:`warn`, and it never turns the empty message into no
249
+ output at all: a caller printing a blank spacer still gets its blank line.
230
250
  """
251
+ if wrap and msg:
252
+ for line in _wrap_lines(msg, 2):
253
+ print(" " + line, file=stream)
254
+ return
231
255
  print(" " + msg if msg else "", file=stream)
232
256
 
233
257
 
@@ -252,9 +276,14 @@ def plain(text: object) -> str:
252
276
  return _CONTROL_RE.sub("", str(text))
253
277
 
254
278
 
255
- def dim(msg: str) -> None:
256
- """Print msg in the muted role (dim when color is on)."""
257
- print(role(msg, "muted"))
279
+ def dim(msg: str, wrap: bool = False) -> None:
280
+ """Print msg in the muted role (dim when color is on).
281
+
282
+ ``wrap`` as in :func:`warn`. `dim` prints flush left, so the wrapped
283
+ continuations are flush left too — there is no marker to align under.
284
+ """
285
+ for line in (_wrap_lines(msg, 0) if wrap else [msg]):
286
+ print(role(line, "muted"))
258
287
 
259
288
 
260
289
  def heading(msg: str) -> None:
@@ -310,6 +339,80 @@ def visible_len(s: str) -> int:
310
339
  return len(_ANSI_RE.sub("", s))
311
340
 
312
341
 
342
+ _CODE_SPAN_RE = re.compile(r"`[^`]*`")
343
+
344
+
345
+ def _wrap_tokens(text: str) -> list[str]:
346
+ """Split text into wrap units, keeping each `code span` whole.
347
+
348
+ A backtick span is one token even though it contains spaces, because the
349
+ spans in boost's hints are shell commands the user is meant to select and
350
+ paste — `pip install 'boost-skill-cli[rag]'`. Everything outside a span is
351
+ split on whitespace, which collapses runs and newlines the way
352
+ :func:`truncate` does; the span itself is copied verbatim, so a command
353
+ that legitimately holds two spaces survives.
354
+
355
+ An unterminated backtick simply never matches, and its text wraps as
356
+ ordinary words. That is the right failure: a half-open span is a typo in
357
+ the message, not a reason to refuse to render it.
358
+ """
359
+ parts: list[str] = []
360
+ pos = 0
361
+ for m in _CODE_SPAN_RE.finditer(text):
362
+ parts.extend(text[pos:m.start()].split())
363
+ parts.append(m.group(0))
364
+ pos = m.end()
365
+ parts.extend(text[pos:].split())
366
+ return parts
367
+
368
+
369
+ def wrap(text: str, width: int | None = None, indent: str = "") -> list[str]:
370
+ """Greedy word-wrap to `width` visible columns, never splitting a code span.
371
+
372
+ Returns one string per line: the first bare, the rest prefixed with
373
+ `indent`, and every one measured with :func:`visible_len` so a coloured
374
+ message is bounded by what the pane shows rather than by its byte count.
375
+ ``width`` defaults to the live terminal.
376
+
377
+ **A token wider than the line is emitted whole and overflows.** That is
378
+ deliberate and it is the reason this is not `textwrap.wrap(break_long_words
379
+ =True)`: the tokens that hit this case are the backticked commands, and a
380
+ command chopped at column 80 is worse than useless — the user pastes it and
381
+ it fails. One long line the terminal soft-wraps still yields the right text
382
+ on a copy.
383
+
384
+ Empty (or all-whitespace) text wraps to no lines at all, so a caller can
385
+ tell "nothing to say" from "one blank line".
386
+ """
387
+ width = term_width() if width is None else width
388
+ tokens = _wrap_tokens(text)
389
+ if not tokens:
390
+ return []
391
+ pad = visible_len(indent)
392
+ lines: list[str] = []
393
+ cur = ""
394
+ for tok in tokens:
395
+ # The first line spends the full width; every later one pays for the
396
+ # indent. No floor under the subtraction: a pane narrower than its own
397
+ # indent yields a limit no token can meet, and each token lands on its
398
+ # own line — which is the same answer a floor of 1 gives, because the
399
+ # fit test below is never satisfiable below 3 columns anyway.
400
+ limit = width if not lines else width - pad
401
+ if cur and visible_len(cur) + 1 + visible_len(tok) <= limit:
402
+ cur += " " + tok
403
+ else:
404
+ if cur:
405
+ lines.append(cur)
406
+ cur = tok
407
+ lines.append(cur)
408
+ return [lines[0]] + [indent + ln for ln in lines[1:]]
409
+
410
+
411
+ #: Alias for callers that take a ``wrap`` keyword argument of their own, which
412
+ #: would otherwise shadow the function inside their own body.
413
+ wrap_text = wrap
414
+
415
+
313
416
  def panel(lines, title: str | None = None, hue: str = "cyan") -> str:
314
417
  """A rounded box around one or more lines, with an Aurora-tinted border and
315
418
  an optional title set into the top rule — the terminal echo of the web
@@ -506,11 +609,23 @@ def format_search_row(name: str, desc: str, kind: str, tap: str, frac: float,
506
609
  return row.rstrip()
507
610
 
508
611
 
509
- def kv(key: str, value: str, width: int = 14) -> None:
510
- """Print an indented key/value line: dim key padded to width, then value."""
612
+ def kv(key: str, value: str, width: int = 14, wrap: bool = False) -> None:
613
+ """Print an indented key/value line: dim key padded to width, then value.
614
+
615
+ ``wrap`` as in :func:`warn`, and the continuations align under the *value*
616
+ rather than the key — a value folded back to column 0 reads as a new row.
617
+ """
511
618
  # The str() is NOT redundant despite the annotation: callers pass raw ints
512
619
  # (e.g. `boost impact` prints files_touched), which would raise TypeError.
513
- print(" " + c(key.ljust(width), DIM) + str(value)) # noqa: FURB123
620
+ text = str(value) # noqa: FURB123
621
+ if not wrap:
622
+ print(" " + c(key.ljust(width), DIM) + text)
623
+ return
624
+ lead = 2 + width
625
+ lines = wrap_text(text, term_width() - lead) or [text]
626
+ print(" " + c(key.ljust(width), DIM) + lines[0])
627
+ for line in lines[1:]:
628
+ print(" " * lead + line)
514
629
 
515
630
 
516
631
  def _pad(cell: str, width: int) -> str:
@@ -383,6 +383,65 @@ def read_postings(terms: Sequence[str]) -> dict[str, list[list[int]]]:
383
383
  return dict(out) # noqa: FURB123 out is a defaultdict; .copy() would keep the factory
384
384
 
385
385
 
386
+ # A query term shorter than this expands to noise: `cal` prefixes `calendar`,
387
+ # `calculate` and `callbacks` alike, and picking one of them for the user is a
388
+ # guess rather than a correction.
389
+ STEM_MIN_LEN = 4
390
+
391
+
392
+ def stem_expansions(terms: Sequence[str]) -> dict[str, str]:
393
+ """Map each term that indexes *nothing* to the commonest term it prefixes.
394
+
395
+ `tokenize` is exact-match, so a query term and its own inflection are
396
+ unrelated strings: `boost search brainstorm` returned zero matches while
397
+ `brainstorming` returned the skill, and `boost chat` had the same hole.
398
+ Measured over the 461 tap caches on one real machine, 4,663 of 29,607 item
399
+ names (15.7%) were unreachable by an attested stem — `pattern` missed 474
400
+ names ending `-patterns`, `skill` missed 252 ending `-skills`.
401
+
402
+ **A term that has postings is never expanded.** That is the whole safety
403
+ argument: this can only ever add signal where `_bm25` scored exactly none
404
+ (it skips a term with no posting list), so a query whose terms all exist
405
+ ranks byte-identically and the retrieval floors cannot move. It is also why
406
+ this is a fallback rather than a stemmer — a real stemmer conflates terms
407
+ that both exist, which changes established rankings and needs an index
408
+ format bump and a regenerated baseline.
409
+
410
+ Returns ``{}`` — never raises — when the store is missing or unreadable,
411
+ matching :func:`read_postings`.
412
+ """
413
+ uniq = [t for t in dict.fromkeys(terms) if len(t) >= STEM_MIN_LEN]
414
+ if not uniq:
415
+ return {}
416
+ indexed = read_postings(uniq)
417
+ missing = [t for t in uniq if not indexed.get(t)]
418
+ if not missing:
419
+ return {}
420
+ try:
421
+ con = sqlite3.connect("file:%s?mode=ro" % postings_path(), uri=True)
422
+ except sqlite3.Error:
423
+ return {}
424
+ out: dict[str, str] = {}
425
+ try:
426
+ for term in missing:
427
+ # `tokenize` emits only [a-z0-9]+, and "~" sorts above every
428
+ # character it can produce — so this half-open range is exactly the
429
+ # terms beginning with `term`, and it rides the postings_term index
430
+ # instead of scanning. Ties break on the term itself so the choice
431
+ # is deterministic across machines.
432
+ row = con.execute(
433
+ "SELECT term FROM postings WHERE term > ? AND term < ? "
434
+ "GROUP BY term ORDER BY COUNT(*) DESC, term LIMIT 1",
435
+ (term, term + "~")).fetchone()
436
+ if row:
437
+ out[term] = row[0]
438
+ except sqlite3.Error:
439
+ return {}
440
+ finally:
441
+ con.close()
442
+ return out
443
+
444
+
386
445
  def _all_postings() -> dict[str, list[list[int]]]:
387
446
  """Every posting — only the incremental rebuild path needs this."""
388
447
  try:
@@ -804,6 +863,12 @@ def retrieve(query: str, k: int = 60, kind: str | None = None,
804
863
  terms = tokenize(query)
805
864
  if not terms:
806
865
  return []
866
+ # Substitute before scoring, not after: the expanded term has to reach the
867
+ # snippet windowing too, or the hit is highlighted on a word it does not
868
+ # contain.
869
+ substitutions = stem_expansions(terms)
870
+ if substitutions:
871
+ terms = [substitutions.get(t, t) for t in terms]
807
872
  docs = raw["docs"]
808
873
  scores = _bm25(terms, raw, read_postings(terms))
809
874
  if entries is None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.20
3
+ Version: 1.2.22
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -543,6 +543,7 @@ tests/functional/test_cli_discovery.py
543
543
  tests/functional/test_cli_hooks.py
544
544
  tests/functional/test_cli_info.py
545
545
  tests/functional/test_cli_intelligence.py
546
+ tests/functional/test_cli_pane_width.py
546
547
  tests/functional/test_cli_pkg.py
547
548
  tests/functional/test_cli_quality.py
548
549
  tests/functional/test_cli_taps.py
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema": 1,
3
- "generated": "2026-08-18T06:55:00Z",
4
- "commit": "3a28b3f",
3
+ "generated": "2026-08-25T06:59:06Z",
4
+ "commit": "1167bcd",
5
5
  "engine": "bm25",
6
6
  "corpus": {
7
7
  "entries": 57,
@@ -135,6 +135,20 @@ normalization, which matters when bodies vary from 3 lines to 300). Sparse term
135
135
  Scoring is standard BM25 (`k1≈1.2`, `b≈0.75`). At ~9k items / tens of thousands of chunks this is a
136
136
  dict-of-postings scan — comfortably sub-second per query in Python.
137
137
 
138
+ **Tokenization is exact-match, and `stem_expansions` is the one concession to that.**
139
+ A query term and its own inflection are unrelated strings, so `boost search brainstorm`
140
+ returned nothing while `brainstorming` returned the skill. Measured over 461 tap caches,
141
+ 4,663 of 29,607 item names (15.7%) were unreachable by an attested stem — `pattern` missed
142
+ 474 names ending `-patterns`. Before scoring, any term with **no** posting list is replaced
143
+ by the commonest term it prefixes, found with an index-backed range scan over the postings
144
+ table. A term that *has* postings is never touched: expansion only ever adds signal where
145
+ `_bm25` scored exactly none, so a query whose terms all exist ranks byte-identically and the
146
+ retrieval floors cannot move. That is what makes it a fallback rather than a stemmer — a real
147
+ stemmer conflates terms that both exist, which changes established rankings and would need an
148
+ index-format bump and a regenerated baseline. Terms shorter than `STEM_MIN_LEN` (4) are left
149
+ alone, because a three-letter prefix expands to a guess. `boost search` states the
150
+ substitution rather than silently answering a different question.
151
+
138
152
  **Query path as shipped** (post `cold-search-reads-the-whole-catalogue`): with
139
153
  `entries=None` — the CLI, MCP and eval path — `rag.retrieve` ranks straight off
140
154
  the index's own doc metadata and materialises real catalog entries only for the
@@ -2,14 +2,14 @@
2
2
  id: bm25-has-no-stemming
3
3
  board: code
4
4
  section: pipeline
5
- status: next
5
+ status: inflight
6
6
  category: Search · Retrieval
7
7
  complexity: M
8
8
  impact: High
9
9
  wow: 4
10
- note: boost search brainstorm finds nothing while brainstorming finds it; 15.7% of catalog names are unreachable by their own stem
10
+ note: a term with no postings is now replaced by the commonest term it prefixes; a term that has postings is never touched, which is what keeps the eval floors still
11
11
  order: 127
12
- owner:
12
+ owner: loop/bm25-stem-fallback
13
13
  pr:
14
14
  title: <code>boost search brainstorm</code> finds nothing, and <code>brainstorming</code> finds it
15
15
  ---
@@ -41,10 +41,28 @@ BM25 path — which is what every user without the extra runs, what
41
41
  <code>eval</code> gate floors. There is no <code>--engine</code> flag, so a maintainer cannot
42
42
  easily reproduce a plain user's result.
43
43
 
44
- <b>Two fixes, and they are not the same size.</b> A <b>zero-match prefix fallback</b> — on 0
45
- hits, retry against vocabulary tokens by prefix — touches no index format, needs no baseline
46
- regeneration, and fires only where BM25 currently returns nothing, so it cannot move a single
47
- eval metric; it fixes the exact observed symptom in both <code>search</code> and
48
- <code>chat</code>. A <b>real stemmer</b> is the better answer and costs an index-format bump plus
49
- a regenerated <code>tests/eval/baseline.json</code>, and would move all four floored metrics.
50
- Either lands in <code>core/rag.py</code>, so the tests must kill mutants, not merely cover lines.
44
+ <b>What shipped: per-term expansion, not per-query.</b> The obvious design — widen only when the
45
+ whole query returns zero hits — was drafted and rejected, because it does not fix the reported
46
+ case. <code>boost chat &ldquo;what helps me brainstorm&rdquo;</code> already returns non-empty
47
+ results from its other words, so a zero-hit trigger never fires and chat stays broken.
48
+ Expansion is therefore per-term: a term with <b>no</b> posting list is replaced by the commonest
49
+ term it prefixes, found by an index-backed range scan (<code>term &gt; ? AND term &lt; ?</code>,
50
+ upper bound <code>term + "~"</code> because <code>~</code> outranks every character
51
+ <code>tokenize</code> can emit — a bound of <code>"z"</code> silently loses
52
+ <code>analy</code> &rarr; <code>analyze</code>). Measured after: <code>search brainstorm</code>
53
+ returns the skill, and the chat question promotes it from <em>absent</em> to <b>rank 1</b>.
54
+
55
+ <b>The invariant is the whole safety argument, and it is a test rather than a comment.</b>
56
+ <em>A term that has postings is never expanded.</em> <code>_bm25</code> already skips a term with
57
+ no posting list, so expansion can only add signal where there was exactly none — meaning any
58
+ query whose terms all exist ranks byte-identically and the four retrieval floors cannot move.
59
+ <code>test_a_term_that_has_postings_is_never_expanded</code> pins it against a corpus where
60
+ <code>pattern</code> and <code>patterns</code> both exist, so a build that dropped the guard
61
+ rewrites a query that already worked and fails. Nine hand-written mutants were run against the
62
+ new lines and all nine died, including that one.
63
+
64
+ <b>Still open: a real stemmer.</b> This fallback cannot help where a term exists but is the wrong
65
+ inflection — a user typing <code>patterns</code> still will not reach an item named
66
+ <code>pattern</code>, because <code>patterns</code> has postings of its own and is left alone.
67
+ Closing that means conflating terms that both exist, which changes established rankings and costs
68
+ an index-format bump plus a regenerated <code>tests/eval/baseline.json</code>.