boost-skill-cli 1.0.342__tar.gz → 1.0.344__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 (591) hide show
  1. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/CLAUDE.md +1 -1
  2. {boost_skill_cli-1.0.342/boost_skill_cli.egg-info → boost_skill_cli-1.0.344}/PKG-INFO +3 -3
  3. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/README.md +2 -2
  4. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/_version.py +2 -2
  5. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/cli.py +1 -0
  6. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/intelligence.py +99 -0
  7. boost_skill_cli-1.0.344/boost_cli/core/chat.py +242 -0
  8. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344/boost_skill_cli.egg-info}/PKG-INFO +3 -3
  9. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_skill_cli.egg-info/SOURCES.txt +9 -0
  10. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel.html +2 -2
  11. boost_skill_cli-1.0.344/docs/chat.html +143 -0
  12. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/commands.html +19 -2
  13. boost_skill_cli-1.0.344/docs/demo-index.json +1 -0
  14. boost_skill_cli-1.0.344/docs/demo.gif +0 -0
  15. boost_skill_cli-1.0.344/docs/demo.html +0 -0
  16. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/index.html +6 -3
  17. boost_skill_cli-1.0.344/docs/roadmap/items/chat-command-grounded-conversational-search.md +60 -0
  18. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +32 -2
  19. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap.html +89 -3
  20. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/pyproject.toml +3 -1
  21. boost_skill_cli-1.0.344/scripts/build_demo_index.py +74 -0
  22. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/post_deploy_smoke.py +2 -0
  23. boost_skill_cli-1.0.344/tests/functional/test_cli_chat.py +99 -0
  24. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_configuration.py +3 -3
  25. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_everyday_loop.py +1 -1
  26. boost_skill_cli-1.0.344/tests/unit/test_chat.py +192 -0
  27. boost_skill_cli-1.0.344/tests/unit/test_demo_index.py +108 -0
  28. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_errors_and_cli_table.py +6 -6
  29. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/visual/a11y_check.mjs +1 -0
  30. boost_skill_cli-1.0.342/docs/demo.gif +0 -0
  31. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.gitattributes +0 -0
  32. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.gitignore +0 -0
  33. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.gitleaks.toml +0 -0
  34. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.htmlvalidate.json +0 -0
  35. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.lighthouserc.json +0 -0
  36. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.lycheeignore +0 -0
  37. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.markdownlint-cli2.jsonc +0 -0
  38. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.pre-commit-config.yaml +0 -0
  39. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.stylelintrc.json +0 -0
  40. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.vale/styles/boost/Terminology.yml +0 -0
  41. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  42. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/.vale.ini +0 -0
  43. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/CODE_OF_CONDUCT.md +0 -0
  44. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/CONTRIBUTING.md +0 -0
  45. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/LICENSE +0 -0
  46. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/MANIFEST.in +0 -0
  47. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/Makefile +0 -0
  48. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/SECURITY.md +0 -0
  49. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost +0 -0
  50. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/__init__.py +0 -0
  51. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/__main__.py +0 -0
  52. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/cliparse.py +0 -0
  53. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/__init__.py +0 -0
  54. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/_common.py +0 -0
  55. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/bmad.py +0 -0
  56. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/configuration.py +0 -0
  57. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/discovery.py +0 -0
  58. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/hooks.py +0 -0
  59. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/info.py +0 -0
  60. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/pkg.py +0 -0
  61. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/quality.py +0 -0
  62. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/run.py +0 -0
  63. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/safety.py +0 -0
  64. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/taps.py +0 -0
  65. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/commands/team.py +0 -0
  66. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/__init__.py +0 -0
  67. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/adapters.py +0 -0
  68. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/agents.py +0 -0
  69. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/ai.py +0 -0
  70. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/capabilities.py +0 -0
  71. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/catalog.py +0 -0
  72. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/claude_settings.py +0 -0
  73. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/config.py +0 -0
  74. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/dense.py +0 -0
  75. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/ed25519.py +0 -0
  76. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/embed.py +0 -0
  77. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/faithfulness.py +0 -0
  78. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/frontmatter.py +0 -0
  79. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/gitutil.py +0 -0
  80. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/imperative.py +0 -0
  81. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/injectscan.py +0 -0
  82. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/installscan.py +0 -0
  83. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/integrity.py +0 -0
  84. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/journal.py +0 -0
  85. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/localembed.py +0 -0
  86. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/lockfile.py +0 -0
  87. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/logs.py +0 -0
  88. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/mcp.py +0 -0
  89. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/mcpdecl.py +0 -0
  90. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/mcphost.py +0 -0
  91. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/minisign.py +0 -0
  92. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/nethttp.py +0 -0
  93. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/output.py +0 -0
  94. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/paths.py +0 -0
  95. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/policy.py +0 -0
  96. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/projectlock.py +0 -0
  97. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/provenance.py +0 -0
  98. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/rag.py +0 -0
  99. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/registry.py +0 -0
  100. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/resolve.py +0 -0
  101. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/rules.py +0 -0
  102. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/scopes.py +0 -0
  103. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/secretscan.py +0 -0
  104. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/selfupdate.py +0 -0
  105. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/serve.py +0 -0
  106. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/stackprobe.py +0 -0
  107. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/staleness.py +0 -0
  108. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/store.py +0 -0
  109. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/trustaudit.py +0 -0
  110. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/typosquat.py +0 -0
  111. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/updatediff.py +0 -0
  112. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/util.py +0 -0
  113. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/core/workflows.py +0 -0
  114. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/data/registries.json +0 -0
  115. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/errors.py +0 -0
  116. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_cli/spin.py +0 -0
  117. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  118. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  119. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_skill_cli.egg-info/requires.txt +0 -0
  120. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/boost_skill_cli.egg-info/top_level.txt +0 -0
  121. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/codecov.yml +0 -0
  122. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/.claude/settings.local.json +0 -0
  123. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/DEBUGGING.md +0 -0
  124. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/adapters.html +0 -0
  125. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/architecture/README.md +0 -0
  126. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/architecture/c4-components-core.md +0 -0
  127. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/architecture/c4-containers.md +0 -0
  128. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/architecture/c4-context.md +0 -0
  129. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/architecture/c4-dynamic-install.md +0 -0
  130. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/gifs/distill.gif +0 -0
  131. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/gifs/doctor.gif +0 -0
  132. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/gifs/explain.gif +0 -0
  133. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/gifs/hooks.gif +0 -0
  134. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/gifs/install.gif +0 -0
  135. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/gifs/pulse.gif +0 -0
  136. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/gifs/search.gif +0 -0
  137. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/gifs/tap.gif +0 -0
  138. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/tapes/distill.tape +0 -0
  139. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/tapes/doctor.tape +0 -0
  140. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/tapes/explain.tape +0 -0
  141. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/tapes/hooks.tape +0 -0
  142. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/tapes/install.tape +0 -0
  143. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/tapes/pulse.tape +0 -0
  144. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/tapes/search.tape +0 -0
  145. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/carousel/tapes/tap.tape +0 -0
  146. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/demo.tape +0 -0
  147. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/design-roadmap.html +0 -0
  148. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/eval.html +0 -0
  149. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/mcp-hub.html +0 -0
  150. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/rag-architecture.md +0 -0
  151. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D01.md +0 -0
  152. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D02.md +0 -0
  153. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D03.md +0 -0
  154. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D04.md +0 -0
  155. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D05.md +0 -0
  156. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D06.md +0 -0
  157. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D07.md +0 -0
  158. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D08.md +0 -0
  159. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D09.md +0 -0
  160. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D10.md +0 -0
  161. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D11.md +0 -0
  162. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D12.md +0 -0
  163. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D13.md +0 -0
  164. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D14.md +0 -0
  165. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D15.md +0 -0
  166. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D16.md +0 -0
  167. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D17.md +0 -0
  168. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D18.md +0 -0
  169. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D19.md +0 -0
  170. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D20.md +0 -0
  171. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D21.md +0 -0
  172. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D22.md +0 -0
  173. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D23.md +0 -0
  174. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D24.md +0 -0
  175. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D25.md +0 -0
  176. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/BOOST-D26.md +0 -0
  177. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  178. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  179. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  180. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  181. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  182. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  183. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  184. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  185. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  186. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  187. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  188. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  189. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  190. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  191. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  192. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  193. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  194. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  195. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  196. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  197. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  198. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  199. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  200. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/command-carousel-page.md +0 -0
  201. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  202. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  203. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  204. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  205. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  206. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  207. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  208. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  209. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  210. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  211. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  212. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  213. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  214. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  215. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  216. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  217. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  218. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  219. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  220. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  221. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  222. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  223. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  224. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  225. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  226. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  227. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  228. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  229. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  230. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/github-community-health-files.md +0 -0
  231. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  232. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  233. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  234. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  235. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  236. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  237. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  238. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  239. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  240. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  241. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  242. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  243. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  244. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  245. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  246. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  247. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  248. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  249. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  250. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  251. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  252. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  253. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  254. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  255. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  256. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  257. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  258. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  259. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  260. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  261. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  262. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  263. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  264. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  265. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  266. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  267. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  268. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  269. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  270. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  271. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  272. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  273. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  274. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  275. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  276. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  277. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  278. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  279. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  280. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  281. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  282. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  283. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  284. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  285. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  286. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  287. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  288. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  289. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  290. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  291. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  292. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  293. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  294. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  295. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  296. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  297. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  298. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  299. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  300. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  301. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  302. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  303. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  304. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  305. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  306. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  307. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  308. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  309. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  310. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  311. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  312. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  313. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  314. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  315. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  316. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  317. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  318. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  319. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  320. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  321. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  322. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  323. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  324. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  325. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  326. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  327. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  328. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  329. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  330. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  331. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  332. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  333. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  334. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  335. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  336. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  337. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  338. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  339. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  340. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  341. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  342. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  343. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  344. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  345. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  346. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  347. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  348. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  349. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  350. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  351. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  352. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  353. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  354. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  355. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  356. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  357. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  358. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  359. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  360. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  361. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  362. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  363. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  364. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  365. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/workspace-scope-install.md +0 -0
  366. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  367. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/eslint.config.mjs +0 -0
  368. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/evals/README.md +0 -0
  369. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/evals/__init__.py +0 -0
  370. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/evals/baseline.json +0 -0
  371. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/evals/faithfulness.py +0 -0
  372. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/evals/golden_set.json +0 -0
  373. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/evals/make_corpus.py +0 -0
  374. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/evals/make_golden.py +0 -0
  375. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/evals/metrics.py +0 -0
  376. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/evals/run_evals.py +0 -0
  377. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/examples/README.md +0 -0
  378. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/examples/adapt-demo.sh +0 -0
  379. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/examples/boost-run-prototype.sh +0 -0
  380. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/index.html +0 -0
  381. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/noxfile.py +0 -0
  382. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/coverage-tools.in +0 -0
  383. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/coverage-tools.txt +0 -0
  384. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/lint-tools.in +0 -0
  385. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/lint-tools.txt +0 -0
  386. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/mutation-tools.in +0 -0
  387. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/mutation-tools.txt +0 -0
  388. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/platform-pins.lock +0 -0
  389. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/release-tools.in +0 -0
  390. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/release-tools.txt +0 -0
  391. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/test-tools.in +0 -0
  392. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/requirements/test-tools.txt +0 -0
  393. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/a11y_check.py +0 -0
  394. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/bench_cli.sh +0 -0
  395. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/build_command_reference.py +0 -0
  396. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/build_registries.py +0 -0
  397. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/build_roadmap.py +0 -0
  398. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/check_anchors.py +0 -0
  399. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/check_licenses.py +0 -0
  400. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/check_required_checks.py +0 -0
  401. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/ensure_eval_corpus.sh +0 -0
  402. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/eval_explain.py +0 -0
  403. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/eval_gate.py +0 -0
  404. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/eval_recommend.py +0 -0
  405. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/eval_retrieval.py +0 -0
  406. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/eval_stats_summary.py +0 -0
  407. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/import_budget.py +0 -0
  408. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/lock_toolchain.py +0 -0
  409. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/mutation_gate.py +0 -0
  410. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/mutation_shards.py +0 -0
  411. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/mutation_weights.json +0 -0
  412. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/perf_gate.py +0 -0
  413. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/release_guard.py +0 -0
  414. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/scripts/release_preflight.py +0 -0
  415. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/setup.cfg +0 -0
  416. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/sonar-project.properties +0 -0
  417. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/style/README.md +0 -0
  418. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/style/boost.css +0 -0
  419. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/style/boost.js +0 -0
  420. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/style/demo.html +0 -0
  421. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/adapt.feature +0 -0
  422. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/browse.feature +0 -0
  423. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/count.feature +0 -0
  424. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/discover.feature +0 -0
  425. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/doctor.feature +0 -0
  426. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/environment.py +0 -0
  427. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/explain.feature +0 -0
  428. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/index.feature +0 -0
  429. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/install.feature +0 -0
  430. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/list.feature +0 -0
  431. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/mcp.feature +0 -0
  432. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/search.feature +0 -0
  433. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/steps/cli_steps.py +0 -0
  434. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/steps/discovery_steps.py +0 -0
  435. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/steps/mcp_steps.py +0 -0
  436. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/bdd/features/steps/quality_steps.py +0 -0
  437. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/conftest.py +0 -0
  438. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/eval/baseline.json +0 -0
  439. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/eval/explain.jsonl +0 -0
  440. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/eval/golden-natural.jsonl +0 -0
  441. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/eval/golden.jsonl +0 -0
  442. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/eval/recommend.jsonl +0 -0
  443. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/eval/taps.txt +0 -0
  444. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_capabilities_policy.py +0 -0
  445. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_adapt.py +0 -0
  446. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_bmad.py +0 -0
  447. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_discovery.py +0 -0
  448. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_hooks.py +0 -0
  449. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_info.py +0 -0
  450. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_intelligence.py +0 -0
  451. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_pkg.py +0 -0
  452. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_quality.py +0 -0
  453. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_taps.py +0 -0
  454. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_cli_team.py +0 -0
  455. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_integrity_enforce.py +0 -0
  456. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_property_parsers.py +0 -0
  457. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_run.py +0 -0
  458. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_tap_signing.py +0 -0
  459. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/functional/test_workspace_scope.py +0 -0
  460. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/README.md +0 -0
  461. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  462. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  463. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  464. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  465. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  466. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  467. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  468. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  469. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  470. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  471. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  472. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  473. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  474. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  475. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  476. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  477. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  478. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  479. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  480. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  481. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/fuzz_frontmatter.py +0 -0
  482. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/fuzz/fuzz_registry.py +0 -0
  483. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/make_fixture.py +0 -0
  484. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/perf/test_benchmarks.py +0 -0
  485. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/smoke.sh +0 -0
  486. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_a11y_check.py +0 -0
  487. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_adapters.py +0 -0
  488. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_adapters_multi.py +0 -0
  489. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_adapters_runner.py +0 -0
  490. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_agents.py +0 -0
  491. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_ai.py +0 -0
  492. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_capabilities.py +0 -0
  493. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_catalog.py +0 -0
  494. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_check_anchors.py +0 -0
  495. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_check_licenses.py +0 -0
  496. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_claude_settings.py +0 -0
  497. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_cliparse.py +0 -0
  498. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_codeql_analysis_key.py +0 -0
  499. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_command_reference_fresh.py +0 -0
  500. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_community_health_files.py +0 -0
  501. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_config.py +0 -0
  502. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_content_dedupe.py +0 -0
  503. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_dedup_trust.py +0 -0
  504. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_dense.py +0 -0
  505. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_dense_fallback.py +0 -0
  506. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_dense_fix_hint.py +0 -0
  507. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_dense_shards.py +0 -0
  508. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_dense_status.py +0 -0
  509. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_dependabot_config.py +0 -0
  510. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_docs_pages_linked.py +0 -0
  511. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_docsite_chrome.py +0 -0
  512. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_ed25519.py +0 -0
  513. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_embed.py +0 -0
  514. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_embed_local.py +0 -0
  515. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_entry_key.py +0 -0
  516. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_eval_baseline.py +0 -0
  517. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_eval_faithfulness.py +0 -0
  518. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_eval_gate.py +0 -0
  519. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_eval_metrics.py +0 -0
  520. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_eval_stats_summary.py +0 -0
  521. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_faithfulness.py +0 -0
  522. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_frontmatter.py +0 -0
  523. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_fuzz_targets.py +0 -0
  524. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_gitleaks_config.py +0 -0
  525. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_gitutil.py +0 -0
  526. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_imperative.py +0 -0
  527. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_import_budget.py +0 -0
  528. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_injectscan.py +0 -0
  529. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_installscan.py +0 -0
  530. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_integrity.py +0 -0
  531. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_journal.py +0 -0
  532. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_localembed.py +0 -0
  533. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_localembed_e2e.py +0 -0
  534. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_lockfile.py +0 -0
  535. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_logs.py +0 -0
  536. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_marketing_counts.py +0 -0
  537. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_mcp.py +0 -0
  538. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_mcp_install_scan.py +0 -0
  539. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_mcpdecl.py +0 -0
  540. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_mcphost.py +0 -0
  541. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_minisign.py +0 -0
  542. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_mutation_hardening.py +0 -0
  543. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_mutation_shards.py +0 -0
  544. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_mutation_subfile_shards.py +0 -0
  545. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_mutmut_source_paths.py +0 -0
  546. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_nethttp.py +0 -0
  547. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_output.py +0 -0
  548. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_paths.py +0 -0
  549. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_perf_gate.py +0 -0
  550. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_pkg_confusions.py +0 -0
  551. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_pkg_injection.py +0 -0
  552. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_pkg_secrets.py +0 -0
  553. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_platform_pins.py +0 -0
  554. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_policy.py +0 -0
  555. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_post_deploy_smoke.py +0 -0
  556. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_project_mcp_sidecar.py +0 -0
  557. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_projectlock.py +0 -0
  558. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_provenance.py +0 -0
  559. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_rag.py +0 -0
  560. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_rag_fusion.py +0 -0
  561. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_registries_fresh.py +0 -0
  562. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_registry.py +0 -0
  563. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_registry_categories.py +0 -0
  564. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_release_guard.py +0 -0
  565. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_release_preflight.py +0 -0
  566. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_required_checks.py +0 -0
  567. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_resolve.py +0 -0
  568. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_roadmap_fresh.py +0 -0
  569. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_rules.py +0 -0
  570. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_scopes.py +0 -0
  571. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_secretscan.py +0 -0
  572. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_selfupdate.py +0 -0
  573. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_serve.py +0 -0
  574. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_spin.py +0 -0
  575. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_stackprobe.py +0 -0
  576. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_staleness.py +0 -0
  577. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_store.py +0 -0
  578. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_token_parity.py +0 -0
  579. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_toolchain_lock.py +0 -0
  580. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_trustaudit.py +0 -0
  581. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_typosquat.py +0 -0
  582. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_updatediff.py +0 -0
  583. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_util.py +0 -0
  584. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_version.py +0 -0
  585. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_workflow_concurrency.py +0 -0
  586. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_workflow_timeouts.py +0 -0
  587. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/unit/test_workflows.py +0 -0
  588. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/visual/console_check.mjs +0 -0
  589. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/visual/package-lock.json +0 -0
  590. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/visual/package.json +0 -0
  591. {boost_skill_cli-1.0.342 → boost_skill_cli-1.0.344}/tests/visual/visual_check.mjs +0 -0
@@ -181,7 +181,7 @@ for both — edit items, run `build_roadmap.py`, never touch the HTML by hand.
181
181
  ## Architecture
182
182
 
183
183
  **CLI dispatch.** `boost_cli/cli.py` holds `COMMANDS`, the single
184
- source-of-truth list of `(name, group, module, summary)` for all 78 commands.
184
+ source-of-truth list of `(name, group, module, summary)` for all 79 commands.
185
185
  Each command is implemented as `def cmd_<name_with_underscores>(argv) -> int`
186
186
  inside `boost_cli/commands/<module>.py`, and `_dispatch` imports that module
187
187
  lazily on invocation — so `boost --help` stays instant and command modules are
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.342
3
+ Version: 1.0.344
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -927,7 +927,7 @@ boost doctor # sanity check: broken links, lock drift, stale taps
927
927
  boost bundle dump > Boostfile # everyone else runs: boost bundle install
928
928
  ```
929
929
 
930
- ## 78 commands, organized into 8 groups
930
+ ## 79 commands, organized into 8 groups
931
931
 
932
932
  `boost --help` prints the full grouped command list; for a visual tour see
933
933
  [`docs/index.html`](docs/index.html), and for every flag of every command see
@@ -1082,7 +1082,7 @@ Four layers, all enforced (`make check` runs the full set; CI runs the same thin
1082
1082
 
1083
1083
  | Layer | What it does | Gate |
1084
1084
  |---|---|---|
1085
- | `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all 78 commands in-process against sandboxed homes) | **≥80% line coverage** of `boost_cli` (`fail_under` in pyproject.toml) |
1085
+ | `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all 79 commands in-process against sandboxed homes) | **≥80% line coverage** of `boost_cli` (`fail_under` in pyproject.toml) |
1086
1086
  | `make smoke` | `tests/smoke.sh` — 170 checks run through the actual `./boost` shim (`--online` also hits real registries) | all pass |
1087
1087
  | `make mutation` | [mutmut] mutates `boost_cli/core` (~9,900 mutants) and reruns the unit suite against each one | **≥80% killed** (`scripts/mutation_gate.py`) |
1088
1088
  | `make evals` | scores the search ranker on a graded golden set — recall@5/@10, MRR, nDCG@5/@10 | **metric floors + no statistically significant regression** (`scripts/eval_gate.py`) |
@@ -209,7 +209,7 @@ boost doctor # sanity check: broken links, lock drift, stale taps
209
209
  boost bundle dump > Boostfile # everyone else runs: boost bundle install
210
210
  ```
211
211
 
212
- ## 78 commands, organized into 8 groups
212
+ ## 79 commands, organized into 8 groups
213
213
 
214
214
  `boost --help` prints the full grouped command list; for a visual tour see
215
215
  [`docs/index.html`](docs/index.html), and for every flag of every command see
@@ -364,7 +364,7 @@ Four layers, all enforced (`make check` runs the full set; CI runs the same thin
364
364
 
365
365
  | Layer | What it does | Gate |
366
366
  |---|---|---|
367
- | `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all 78 commands in-process against sandboxed homes) | **≥80% line coverage** of `boost_cli` (`fail_under` in pyproject.toml) |
367
+ | `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all 79 commands in-process against sandboxed homes) | **≥80% line coverage** of `boost_cli` (`fail_under` in pyproject.toml) |
368
368
  | `make smoke` | `tests/smoke.sh` — 170 checks run through the actual `./boost` shim (`--online` also hits real registries) | all pass |
369
369
  | `make mutation` | [mutmut] mutates `boost_cli/core` (~9,900 mutants) and reruns the unit suite against each one | **≥80% killed** (`scripts/mutation_gate.py`) |
370
370
  | `make evals` | scores the search ranker on a graded golden set — recall@5/@10, MRR, nDCG@5/@10 | **metric floors + no statistically significant regression** (`scripts/eval_gate.py`) |
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.0.342'
22
- __version_tuple__ = version_tuple = (1, 0, 342)
21
+ __version__ = version = '1.0.344'
22
+ __version_tuple__ = version_tuple = (1, 0, 344)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -90,6 +90,7 @@ COMMANDS = [
90
90
  ("taps", "tap", "taps", "List all configured registry taps"),
91
91
  ("outdated", "tap", "taps", "Show skills with available updates"),
92
92
  # Intelligence (8)
93
+ ("chat", "ai", "intelligence", "Ask about skills in plain language (RAG-grounded)"),
93
94
  ("distill", "ai", "intelligence", "Merge multiple skills into one deduplicated skill"),
94
95
  ("simulate", "ai", "intelligence", "Preview how a skill would change Claude's behavior"),
95
96
  ("infer", "ai", "intelligence", "Generate a SKILL.md from your codebase patterns"),
@@ -28,9 +28,13 @@ from ..core import (
28
28
  journal,
29
29
  lockfile,
30
30
  paths,
31
+ registry,
31
32
  store,
32
33
  util,
33
34
  )
35
+ from ..core import (
36
+ chat as chat_engine,
37
+ )
34
38
  from ..core import output as out
35
39
  from ..errors import BoostError
36
40
 
@@ -1035,3 +1039,98 @@ def _repo_activity(since: str) -> Tuple[Optional[int], Optional[int]]:
1035
1039
  if proc.returncode == 0:
1036
1040
  files = len({ln.strip() for ln in proc.stdout.splitlines() if ln.strip()})
1037
1041
  return commits, files
1042
+
1043
+
1044
+ def _print_reply(reply: chat_engine.Reply, show_sources: bool) -> None:
1045
+ """Render one answer: the prose, then where it came from.
1046
+
1047
+ Citations are not decoration here. The next thing a user does with an answer
1048
+ is install code that runs inside their agent, so every recommendation has to
1049
+ be checkable against a real catalogue entry.
1050
+ """
1051
+ for line in reply.text.splitlines():
1052
+ out.info(line)
1053
+ if show_sources and reply.skills:
1054
+ out.info("")
1055
+ out.info(out.role("sources · ranked by %s" % reply.engine, "muted"))
1056
+ for cite in chat_engine.citations(reply.skills):
1057
+ out.info(out.role(" %s %s (%s)"
1058
+ % (cite["name"], cite["kind"], cite["tap"]), "muted"))
1059
+ if reply.source == "extractive" and not reply.grounded:
1060
+ # The model answered and was rejected. Saying so beats silently showing
1061
+ # a downgraded answer that looks identical to a confident one.
1062
+ out.warn("the AI reply named something outside the retrieved skills — "
1063
+ "showing the grounded matches instead")
1064
+
1065
+
1066
+ def cmd_chat(argv: List[str]) -> int:
1067
+ """Ask about skills in plain language; answers are grounded in retrieval."""
1068
+ ap = cliparse.parser(
1069
+ prog="boost chat",
1070
+ description="Ask about skills in plain language")
1071
+ ap.add_argument("question", nargs="*", metavar="QUESTION",
1072
+ help="ask once and exit; omit for an interactive session")
1073
+ ap.add_argument("-k", "--limit", type=int, default=chat_engine.TOP_K,
1074
+ metavar="N", help="candidate skills to consider (default %d)"
1075
+ % chat_engine.TOP_K)
1076
+ ap.add_argument("--no-sources", action="store_true",
1077
+ help="hide the citation block under each answer")
1078
+ ap.add_argument("--json", action="store_true", dest="as_json",
1079
+ help="machine-readable answer (implies one-shot)")
1080
+ args = ap.parse_args(argv)
1081
+
1082
+ if not registry.list_taps():
1083
+ raise BoostError("no taps configured — nothing to chat about",
1084
+ hint="add the recommended registries with `boost tap --defaults`")
1085
+
1086
+ question = " ".join(args.question).strip()
1087
+ if args.as_json:
1088
+ if not question:
1089
+ raise BoostError("--json needs a question",
1090
+ hint='try: boost chat --json "how do I review a diff?"')
1091
+ reply = chat_engine.answer(question, k=args.limit)
1092
+ print(json.dumps({
1093
+ "question": question,
1094
+ "answer": reply.text,
1095
+ "engine": reply.engine,
1096
+ "source": reply.source,
1097
+ "grounded": reply.grounded,
1098
+ "skills": chat_engine.citations(reply.skills),
1099
+ }))
1100
+ return 0
1101
+
1102
+ if question:
1103
+ _print_reply(chat_engine.answer(question, k=args.limit), not args.no_sources)
1104
+ return 0
1105
+
1106
+ return _chat_session(args)
1107
+
1108
+
1109
+ def _chat_session(args) -> int:
1110
+ """The interactive loop. Kept separate so cmd_chat stays a dispatcher.
1111
+
1112
+ History is bounded by chat_engine.HISTORY_TURNS — this is a lookup
1113
+ assistant, and a long transcript encourages answering from the conversation
1114
+ rather than from what retrieval actually returned.
1115
+ """
1116
+ if not ai.available():
1117
+ # Worth saying up front rather than letting every answer look terse for
1118
+ # an unexplained reason.
1119
+ out.info(out.role("no AI configured — answers are the grounded matches "
1120
+ "themselves (%s)" % ai.fallback_note(), "muted"))
1121
+ out.info(out.role("ask about skills; blank line or Ctrl-D to exit", "muted"))
1122
+ history: List[chat_engine.Turn] = []
1123
+ while True:
1124
+ try:
1125
+ question = input("\n> ").strip()
1126
+ except (EOFError, KeyboardInterrupt):
1127
+ out.info("")
1128
+ return 0
1129
+ if not question:
1130
+ return 0
1131
+ reply = chat_engine.answer(question, history=history, k=args.limit)
1132
+ out.info("")
1133
+ _print_reply(reply, not args.no_sources)
1134
+ history.append(chat_engine.Turn(question, reply.text))
1135
+ for follow in chat_engine.suggest_followups(reply.skills)[:2]:
1136
+ out.info(out.role(" try: %s" % follow, "muted"))
@@ -0,0 +1,242 @@
1
+ """Conversational search over the tapped catalogue.
2
+
3
+ ``boost chat`` sits on top of machinery that already exists — ``rag.retrieve_any``
4
+ for finding candidates, ``ai.ask`` for prose, ``faithfulness.score`` for checking
5
+ that prose against its source — and adds the one thing they do not do together:
6
+ turn a question into an answer that names specific skills and says why.
7
+
8
+ THE FAILURE THIS IS BUILT AROUND. boost is a package manager. A chatbot that
9
+ invents a plausible-sounding skill name is not a cosmetic bug: the user goes
10
+ looking for ``docker-compose-expert``, does not find it, and either concludes the
11
+ catalogue is broken or — worse — installs something adjacent from an untrusted
12
+ tap. Typosquatting is a real hazard in this ecosystem (``core/typosquat.py``
13
+ exists for it), so an assistant that manufactures names is actively dangerous
14
+ rather than merely unhelpful.
15
+
16
+ Two defences, in order:
17
+
18
+ * **Retrieval decides what may be discussed.** The model is never asked "what
19
+ skill does X?" — it is asked to summarise a specific, retrieved set. Nothing
20
+ outside that set can be recommended because nothing outside it is in the
21
+ prompt.
22
+ * **The reply is checked before it is shown.** Every skill name in the answer
23
+ must appear in the retrieved set (:func:`ungrounded_names`), and the prose as a
24
+ whole must score against the source text (:func:`faithfulness.score`, the same
25
+ gate ``boost explain`` uses). A reply that fails either is discarded, not
26
+ patched — and the extractive answer below is shown instead.
27
+
28
+ Degrading rather than failing is the house contract: with ``BOOST_NO_AI=1``, no
29
+ API key, or no ``claude`` CLI, :func:`answer` still returns a useful grounded
30
+ answer assembled from the retrieved descriptions. The AI path improves the prose;
31
+ it is never load-bearing for correctness.
32
+ """
33
+ from __future__ import annotations
34
+
35
+ import re
36
+ from typing import Dict, List, NamedTuple, Optional, Sequence, Tuple
37
+
38
+ from . import ai, catalog, faithfulness, rag
39
+
40
+ # How many candidates reach the prompt. Small on purpose: the model summarises
41
+ # rather than searches, and a long tail of weak hits invites it to reach for
42
+ # whichever one sounds closest to the question rather than the one that ranked.
43
+ TOP_K = 5
44
+
45
+ # Minimum groundedness for AI prose, matching `boost explain`'s default. Below
46
+ # this the reply names specifics its sources never did, which is the observable
47
+ # shape of a fabricated capability.
48
+ MIN_FAITHFULNESS = 0.60
49
+
50
+ # A conversation is kept this short deliberately. `chat` is a lookup assistant,
51
+ # not an agent: more history means more chances for the model to answer from the
52
+ # conversation instead of from what retrieval actually returned.
53
+ HISTORY_TURNS = 4
54
+
55
+ _SYSTEM = (
56
+ "You help a developer pick an AI coding-agent skill from a catalogue. "
57
+ "Answer ONLY from the numbered skills provided. Never invent a skill name. "
58
+ "If none fit, say so plainly. Be concrete and brief: 3-5 sentences, no "
59
+ "markdown, no bullet lists. Name the skills you recommend exactly as given."
60
+ )
61
+
62
+
63
+ class Turn(NamedTuple):
64
+ """One exchange, kept so a follow-up can refer back to it."""
65
+
66
+ question: str
67
+ answer: str
68
+
69
+
70
+ class Reply(NamedTuple):
71
+ """What :func:`answer` produces.
72
+
73
+ ``grounded`` is False only when the AI path was tried and rejected — the
74
+ caller may want to say so, since a silently downgraded answer looks the same
75
+ as a confident one.
76
+ """
77
+
78
+ text: str
79
+ skills: List[dict] # the catalogue entries the answer draws on
80
+ engine: str # which retrieval engine ran, for attribution
81
+ source: str # "ai" | "extractive"
82
+ grounded: bool
83
+
84
+
85
+ def _history_context(history: Sequence[Turn]) -> str:
86
+ """Recent turns, oldest first, as plain text for the prompt."""
87
+ recent = list(history)[-HISTORY_TURNS:]
88
+ if not recent:
89
+ return ""
90
+ lines = ["Earlier in this conversation:"]
91
+ for turn in recent:
92
+ lines.extend(("Q: %s" % turn.question, "A: %s" % turn.answer))
93
+ return "\n".join(lines) + "\n\n"
94
+
95
+
96
+ def expand_query(question: str, history: Sequence[Turn]) -> str:
97
+ """The string actually sent to retrieval.
98
+
99
+ A follow-up like "what about the second one?" carries almost no searchable
100
+ terms, so retrieving on it alone returns noise. Appending the previous
101
+ question restores the subject without needing the model to rewrite it — a
102
+ rewrite would be another place for the assistant to drift off-topic.
103
+
104
+ Only the immediately preceding question is used: two turns back is usually a
105
+ different subject, and blending them retrieves for neither.
106
+ """
107
+ question = question.strip()
108
+ if not history:
109
+ return question
110
+ # Long questions carry their own context; short ones are the follow-ups.
111
+ if len(question.split()) > 6:
112
+ return question
113
+ return "%s %s" % (history[-1].question, question)
114
+
115
+
116
+ def retrieve(question: str, history: Sequence[Turn] = (),
117
+ k: int = TOP_K) -> Tuple[List[dict], str]:
118
+ """Candidate catalogue entries for ``question``, best first.
119
+
120
+ Returns ``(entries, engine_label)``. Uses :func:`rag.retrieve_any` so chat
121
+ gets whatever the machine has — hybrid, dense, or BM25 — rather than pinning
122
+ an engine of its own, and falls back to the frontmatter scan when no index
123
+ exists at all so a fresh install still answers.
124
+ """
125
+ query = expand_query(question, history)
126
+ entries = catalog.all_entries()
127
+ hits, engine = rag.retrieve_any(query, k=k, entries=entries)
128
+ if hits is None:
129
+ # No index of any kind: catalog.search is the documented floor.
130
+ scored = catalog.search(query)
131
+ return [e for e, _score in scored[:k]], "frontmatter scan"
132
+ return [h["entry"] for h in hits[:k]], engine
133
+
134
+
135
+ def _describe(entry: dict) -> str:
136
+ """One catalogue entry as a line of prompt/answer text."""
137
+ return "%s (%s) — %s" % (entry.get("name", "?"), entry.get("tap", "?"),
138
+ (entry.get("description") or "").strip() or "no description")
139
+
140
+
141
+ def source_text(entries: Sequence[dict]) -> str:
142
+ """The numbered candidate list the model is allowed to answer from."""
143
+ return "\n".join("%d. %s" % (i, _describe(e)) for i, e in enumerate(entries, 1))
144
+
145
+
146
+ def ungrounded_names(reply: str, entries: Sequence[dict]) -> List[str]:
147
+ """Skill-shaped tokens in ``reply`` that name nothing in ``entries``.
148
+
149
+ Catalogue names are lowercase hyphenated words (``code-reviewer``,
150
+ ``pdf``), which is a distinctive enough shape to spot in prose. Anything
151
+ matching that shape and not present in the candidate set is a name the model
152
+ supplied itself — the exact failure that sends a user hunting for a skill
153
+ that does not exist.
154
+
155
+ Deliberately narrow: it only flags *hyphenated* tokens. A single ordinary
156
+ word cannot be told apart from prose, so this under-reports rather than
157
+ firing on innocent sentences, and the faithfulness score covers the rest.
158
+ """
159
+ known = {str(e.get("name", "")).lower() for e in entries}
160
+ candidates = set(re.findall(r"\b[a-z][a-z0-9]*(?:-[a-z0-9]+)+\b", reply.lower()))
161
+ return sorted(c for c in candidates if c not in known)
162
+
163
+
164
+ def _extractive(question: str, entries: Sequence[dict]) -> str:
165
+ """A grounded answer with no model involved.
166
+
167
+ This is what every keyless, offline or AI-disabled install gets, so it has to
168
+ be genuinely useful rather than an apology: the top candidates with their
169
+ descriptions and where they came from, which is the information the user
170
+ needs to decide.
171
+ """
172
+ if not entries:
173
+ return ("Nothing in the tapped catalogue matches that. Try `boost tap "
174
+ "--defaults` for more registries, or rephrase with the concrete "
175
+ "terms you would expect in the skill's own description.")
176
+ lines = ["Closest matches in your tapped catalogue:"]
177
+ lines.extend(" " + _describe(entry) for entry in entries)
178
+ lines.extend(("", "Run `boost info <name>` for the full skill, or "
179
+ "`boost install <name>` to add it."))
180
+ return "\n".join(lines)
181
+
182
+
183
+ def answer(question: str, history: Sequence[Turn] = (),
184
+ k: int = TOP_K) -> Reply:
185
+ """Answer ``question`` from the tapped catalogue.
186
+
187
+ The AI path is attempted only when :func:`ai.available`; its reply is used
188
+ only when it passes both grounding checks. Otherwise the extractive answer is
189
+ returned, which is the same information in a plainer shape.
190
+ """
191
+ entries, engine = retrieve(question, history, k=k)
192
+ extractive = _extractive(question, entries)
193
+ if not entries or not ai.available():
194
+ return Reply(extractive, entries.copy(), engine, "extractive", True)
195
+
196
+ source = source_text(entries)
197
+ prompt = "%s%s\n\nCandidate skills:\n%s\n\nQuestion: %s" % (
198
+ _history_context(history),
199
+ "Answer the question using only the numbered skills below.",
200
+ source, question)
201
+ reply = ai.ask(prompt, system=_SYSTEM)
202
+ if not reply:
203
+ return Reply(extractive, entries.copy(), engine, "extractive", True)
204
+
205
+ reply = reply.strip()
206
+ invented = ungrounded_names(reply, entries)
207
+ if invented:
208
+ # A manufactured name is unrecoverable — there is no honest way to show
209
+ # prose that points at a skill which does not exist.
210
+ return Reply(extractive, entries.copy(), engine, "extractive", False)
211
+ if faithfulness.score(reply, source) < MIN_FAITHFULNESS:
212
+ return Reply(extractive, entries.copy(), engine, "extractive", False)
213
+ return Reply(reply, entries.copy(), engine, "ai", True)
214
+
215
+
216
+ def citations(entries: Sequence[dict]) -> List[Dict[str, str]]:
217
+ """Name/tap pairs for the entries an answer drew on.
218
+
219
+ Shown under every answer so a claim can be checked against the source, which
220
+ matters more here than in an ordinary chatbot: the next step is installing
221
+ code that will run inside the user's agent.
222
+ """
223
+ return [{"name": str(e.get("name", "")), "tap": str(e.get("tap", "")),
224
+ "kind": str(e.get("kind", "skill"))} for e in entries]
225
+
226
+
227
+ def suggest_followups(entries: Sequence[dict]) -> List[str]:
228
+ """Concrete next questions, drawn from what was actually retrieved.
229
+
230
+ Generic prompts ("ask me anything!") teach nothing; naming a real retrieved
231
+ skill shows the user the shape of a question that works.
232
+ """
233
+ if not entries:
234
+ return ["what skills do I have installed?"]
235
+ top: Optional[dict] = entries[0]
236
+ name = str(top.get("name", "")) if top else ""
237
+ out: List[str] = []
238
+ if name:
239
+ out.extend(("what does %s actually do?" % name,
240
+ "how is %s different from the others?" % name))
241
+ out.append("which of these should I install first?")
242
+ return out
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.342
3
+ Version: 1.0.344
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -927,7 +927,7 @@ boost doctor # sanity check: broken links, lock drift, stale taps
927
927
  boost bundle dump > Boostfile # everyone else runs: boost bundle install
928
928
  ```
929
929
 
930
- ## 78 commands, organized into 8 groups
930
+ ## 79 commands, organized into 8 groups
931
931
 
932
932
  `boost --help` prints the full grouped command list; for a visual tour see
933
933
  [`docs/index.html`](docs/index.html), and for every flag of every command see
@@ -1082,7 +1082,7 @@ Four layers, all enforced (`make check` runs the full set; CI runs the same thin
1082
1082
 
1083
1083
  | Layer | What it does | Gate |
1084
1084
  |---|---|---|
1085
- | `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all 78 commands in-process against sandboxed homes) | **≥80% line coverage** of `boost_cli` (`fail_under` in pyproject.toml) |
1085
+ | `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all 79 commands in-process against sandboxed homes) | **≥80% line coverage** of `boost_cli` (`fail_under` in pyproject.toml) |
1086
1086
  | `make smoke` | `tests/smoke.sh` — 170 checks run through the actual `./boost` shim (`--online` also hits real registries) | all pass |
1087
1087
  | `make mutation` | [mutmut] mutates `boost_cli/core` (~9,900 mutants) and reruns the unit suite against each one | **≥80% killed** (`scripts/mutation_gate.py`) |
1088
1088
  | `make evals` | scores the search ranker on a graded golden set — recall@5/@10, MRR, nDCG@5/@10 | **metric floors + no statistically significant regression** (`scripts/eval_gate.py`) |
@@ -53,6 +53,7 @@ boost_cli/core/agents.py
53
53
  boost_cli/core/ai.py
54
54
  boost_cli/core/capabilities.py
55
55
  boost_cli/core/catalog.py
56
+ boost_cli/core/chat.py
56
57
  boost_cli/core/claude_settings.py
57
58
  boost_cli/core/config.py
58
59
  boost_cli/core/dense.py
@@ -105,8 +106,11 @@ boost_skill_cli.egg-info/top_level.txt
105
106
  docs/DEBUGGING.md
106
107
  docs/adapters.html
107
108
  docs/carousel.html
109
+ docs/chat.html
108
110
  docs/commands.html
111
+ docs/demo-index.json
109
112
  docs/demo.gif
113
+ docs/demo.html
110
114
  docs/demo.tape
111
115
  docs/design-roadmap.html
112
116
  docs/eval.html
@@ -179,6 +183,7 @@ docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md
179
183
  docs/roadmap/items/build-provenance-slsa-attestations.md
180
184
  docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md
181
185
  docs/roadmap/items/capability-manifest-and-least-privilege-policy.md
186
+ docs/roadmap/items/chat-command-grounded-conversational-search.md
182
187
  docs/roadmap/items/ci-job-timeout-minutes.md
183
188
  docs/roadmap/items/ci-summary-step-fails-itself.md
184
189
  docs/roadmap/items/ci-time-is-now-runner-queueing.md
@@ -379,6 +384,7 @@ requirements/test-tools.txt
379
384
  scripts/a11y_check.py
380
385
  scripts/bench_cli.sh
381
386
  scripts/build_command_reference.py
387
+ scripts/build_demo_index.py
382
388
  scripts/build_registries.py
383
389
  scripts/build_roadmap.py
384
390
  scripts/check_anchors.py
@@ -431,6 +437,7 @@ tests/eval/taps.txt
431
437
  tests/functional/test_capabilities_policy.py
432
438
  tests/functional/test_cli_adapt.py
433
439
  tests/functional/test_cli_bmad.py
440
+ tests/functional/test_cli_chat.py
434
441
  tests/functional/test_cli_configuration.py
435
442
  tests/functional/test_cli_discovery.py
436
443
  tests/functional/test_cli_hooks.py
@@ -478,6 +485,7 @@ tests/unit/test_agents.py
478
485
  tests/unit/test_ai.py
479
486
  tests/unit/test_capabilities.py
480
487
  tests/unit/test_catalog.py
488
+ tests/unit/test_chat.py
481
489
  tests/unit/test_check_anchors.py
482
490
  tests/unit/test_check_licenses.py
483
491
  tests/unit/test_claude_settings.py
@@ -488,6 +496,7 @@ tests/unit/test_community_health_files.py
488
496
  tests/unit/test_config.py
489
497
  tests/unit/test_content_dedupe.py
490
498
  tests/unit/test_dedup_trust.py
499
+ tests/unit/test_demo_index.py
491
500
  tests/unit/test_dense.py
492
501
  tests/unit/test_dense_fallback.py
493
502
  tests/unit/test_dense_fix_hint.py
@@ -115,7 +115,7 @@
115
115
  <div class="wrap hero">
116
116
  <p class="crumbs"><a href="index.html">boost</a> / docs / carousel</p>
117
117
  <span class="badge">8 command groups · recorded live with VHS</span>
118
- <h1>78 commands. <span class="grad-text">One flagship each.</span></h1>
118
+ <h1>79 commands. <span class="grad-text">One flagship each.</span></h1>
119
119
  <p class="lede">boost's command surface spans 8 groups, from package management to team
120
120
  collaboration. Rather than 78 near-identical recordings, this page tours <b>one
121
121
  representative command per group</b> — the one that shows what that group is actually
@@ -275,7 +275,7 @@
275
275
  <code>simulate</code><code>infer</code><code>absorb</code><code>evolve</code>
276
276
  <code>context</code><code>focus</code><code>impact</code>
277
277
  </div>
278
- <p class="group-note">8 commands in this group.</p>
278
+ <p class="group-note">9 commands in this group.</p>
279
279
  <p class="regen">regenerate: <code>vhs docs/carousel/tapes/distill.tape</code></p>
280
280
  </div>
281
281
  </div>