boost-skill-cli 1.0.398__tar.gz → 1.0.400__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 (625) hide show
  1. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/discovery.py +14 -3
  4. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/pkg.py +8 -0
  5. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/rag.py +49 -2
  6. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  7. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
  8. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/commands.html +4 -3
  9. boost_skill_cli-1.0.400/docs/roadmap/items/search-never-notices-a-new-tap.md +54 -0
  10. boost_skill_cli-1.0.400/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +46 -0
  11. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap.html +97 -1
  12. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_discovery.py +53 -0
  13. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_pkg.py +35 -0
  14. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_rag.py +135 -0
  15. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.gitattributes +0 -0
  16. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.gitignore +0 -0
  17. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.gitleaks.toml +0 -0
  18. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.htmlvalidate.json +0 -0
  19. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.lighthouserc.json +0 -0
  20. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.lycheeignore +0 -0
  21. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.markdownlint-cli2.jsonc +0 -0
  22. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.pre-commit-config.yaml +0 -0
  23. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.stylelintrc.json +0 -0
  24. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.vale/styles/boost/Terminology.yml +0 -0
  25. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  26. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.vale.ini +0 -0
  27. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/CLAUDE.md +0 -0
  28. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/CODE_OF_CONDUCT.md +0 -0
  29. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/CONTRIBUTING.md +0 -0
  30. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/LICENSE +0 -0
  31. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/MANIFEST.in +0 -0
  32. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/Makefile +0 -0
  33. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/README.md +0 -0
  34. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/SECURITY.md +0 -0
  35. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost +0 -0
  36. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/__init__.py +0 -0
  37. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/__main__.py +0 -0
  38. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/cli.py +0 -0
  39. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/cliparse.py +0 -0
  40. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/__init__.py +0 -0
  41. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/_common.py +0 -0
  42. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/bmad.py +0 -0
  43. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/configuration.py +0 -0
  44. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/hooks.py +0 -0
  45. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/info.py +0 -0
  46. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/intelligence.py +0 -0
  47. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/quality.py +0 -0
  48. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/run.py +0 -0
  49. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/safety.py +0 -0
  50. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/taps.py +0 -0
  51. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/team.py +0 -0
  52. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/__init__.py +0 -0
  53. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/adapters.py +0 -0
  54. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/agents.py +0 -0
  55. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/ai.py +0 -0
  56. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/capabilities.py +0 -0
  57. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/catalog.py +0 -0
  58. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/chat.py +0 -0
  59. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/claude_settings.py +0 -0
  60. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/complete.py +0 -0
  61. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/config.py +0 -0
  62. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/dense.py +0 -0
  63. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/ed25519.py +0 -0
  64. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/embed.py +0 -0
  65. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/faithfulness.py +0 -0
  66. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/frontmatter.py +0 -0
  67. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/gitutil.py +0 -0
  68. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/imperative.py +0 -0
  69. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/injectscan.py +0 -0
  70. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/installscan.py +0 -0
  71. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/integrity.py +0 -0
  72. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/journal.py +0 -0
  73. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/localembed.py +0 -0
  74. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/lockfile.py +0 -0
  75. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/logs.py +0 -0
  76. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/mcp.py +0 -0
  77. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/mcpdecl.py +0 -0
  78. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/mcphost.py +0 -0
  79. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/minisign.py +0 -0
  80. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/nethttp.py +0 -0
  81. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/output.py +0 -0
  82. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/paths.py +0 -0
  83. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/policy.py +0 -0
  84. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/projectlock.py +0 -0
  85. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/provenance.py +0 -0
  86. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/registry.py +0 -0
  87. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/resolve.py +0 -0
  88. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/rules.py +0 -0
  89. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/scopes.py +0 -0
  90. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/secretscan.py +0 -0
  91. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/selfupdate.py +0 -0
  92. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/serve.py +0 -0
  93. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/stackprobe.py +0 -0
  94. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/staleness.py +0 -0
  95. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/store.py +0 -0
  96. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/trustaudit.py +0 -0
  97. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/typosquat.py +0 -0
  98. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/updatediff.py +0 -0
  99. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/util.py +0 -0
  100. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/workflows.py +0 -0
  101. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/data/registries.json +0 -0
  102. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/errors.py +0 -0
  103. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/spin.py +0 -0
  104. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  105. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  106. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_skill_cli.egg-info/requires.txt +0 -0
  107. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_skill_cli.egg-info/top_level.txt +0 -0
  108. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/codecov.yml +0 -0
  109. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/.claude/settings.local.json +0 -0
  110. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/DEBUGGING.md +0 -0
  111. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/adapters.html +0 -0
  112. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/architecture/README.md +0 -0
  113. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/architecture/c4-components-core.md +0 -0
  114. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/architecture/c4-containers.md +0 -0
  115. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/architecture/c4-context.md +0 -0
  116. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/architecture/c4-dynamic-install.md +0 -0
  117. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/gifs/distill.gif +0 -0
  118. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/gifs/doctor.gif +0 -0
  119. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/gifs/explain.gif +0 -0
  120. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/gifs/hooks.gif +0 -0
  121. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/gifs/install.gif +0 -0
  122. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/gifs/pulse.gif +0 -0
  123. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/gifs/search.gif +0 -0
  124. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/gifs/tap.gif +0 -0
  125. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/tapes/distill.tape +0 -0
  126. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/tapes/doctor.tape +0 -0
  127. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/tapes/explain.tape +0 -0
  128. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/tapes/hooks.tape +0 -0
  129. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/tapes/install.tape +0 -0
  130. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/tapes/pulse.tape +0 -0
  131. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/tapes/search.tape +0 -0
  132. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/tapes/tap.tape +0 -0
  133. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel.html +0 -0
  134. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/chat.html +0 -0
  135. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/demo-index.json +0 -0
  136. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/demo.gif +0 -0
  137. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/demo.html +0 -0
  138. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/demo.tape +0 -0
  139. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/design-roadmap.html +0 -0
  140. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/eval-latest.json +0 -0
  141. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/eval.html +0 -0
  142. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/index.html +0 -0
  143. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/mcp-hub.html +0 -0
  144. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/rag-architecture.md +0 -0
  145. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D01.md +0 -0
  146. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D02.md +0 -0
  147. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D03.md +0 -0
  148. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D04.md +0 -0
  149. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D05.md +0 -0
  150. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D06.md +0 -0
  151. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D07.md +0 -0
  152. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D08.md +0 -0
  153. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D09.md +0 -0
  154. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D10.md +0 -0
  155. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D11.md +0 -0
  156. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D12.md +0 -0
  157. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D13.md +0 -0
  158. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D14.md +0 -0
  159. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D15.md +0 -0
  160. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D16.md +0 -0
  161. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D17.md +0 -0
  162. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D18.md +0 -0
  163. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D19.md +0 -0
  164. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D20.md +0 -0
  165. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D21.md +0 -0
  166. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D22.md +0 -0
  167. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D23.md +0 -0
  168. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D24.md +0 -0
  169. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D25.md +0 -0
  170. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D26.md +0 -0
  171. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  172. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  173. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  174. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  175. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  176. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  177. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  178. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  179. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  180. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  181. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  182. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  183. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  184. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  185. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  186. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  187. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  188. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  189. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  190. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  191. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  192. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  193. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  194. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  195. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  196. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  197. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/command-carousel-page.md +0 -0
  198. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  199. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  200. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  201. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  202. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  203. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  204. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  205. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  206. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  207. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  208. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  209. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  210. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  211. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  212. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  213. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  214. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  215. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  216. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  217. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  218. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  219. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  220. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  221. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  222. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  223. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  224. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  225. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  226. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  227. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  228. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  229. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  230. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  231. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  232. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  233. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/github-community-health-files.md +0 -0
  234. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  235. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  236. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  237. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  238. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  239. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  240. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  241. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  242. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  243. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  244. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  245. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  246. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  247. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  248. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  249. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  250. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  251. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  252. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  253. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  254. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  255. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  256. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  257. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  258. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  259. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  260. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  261. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  262. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  263. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  264. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  265. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  266. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  267. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  268. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  269. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  270. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  271. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  272. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  273. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  274. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  275. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  276. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  277. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  278. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  279. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  280. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  281. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  282. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  283. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  284. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  285. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  286. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  287. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  288. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  289. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  290. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  291. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  292. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  293. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  294. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  295. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  296. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  297. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  298. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  299. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  300. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  301. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  302. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  303. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  304. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  305. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  306. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  307. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  308. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  309. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  310. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  311. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  312. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  313. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  314. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  315. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  316. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  317. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  318. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  319. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  320. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  321. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  322. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  323. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  324. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  325. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  326. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  327. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  328. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  329. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  330. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  331. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  332. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  333. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  334. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  335. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  336. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  337. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  338. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  339. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  340. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  341. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  342. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  343. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  344. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  345. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  346. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  347. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  348. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  349. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  350. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  351. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  352. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  353. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  354. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  355. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  356. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  357. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  358. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  359. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  360. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  361. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  362. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  363. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  364. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  365. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  366. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  367. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  368. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  369. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  370. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  371. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  372. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  373. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  374. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  375. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  376. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  377. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  378. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  379. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/workspace-scope-install.md +0 -0
  380. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/zip-strict-audit.md +0 -0
  381. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  382. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/eslint.config.mjs +0 -0
  383. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/evals/README.md +0 -0
  384. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/evals/__init__.py +0 -0
  385. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/evals/baseline.json +0 -0
  386. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/evals/faithfulness.py +0 -0
  387. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/evals/golden_set.json +0 -0
  388. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/evals/make_corpus.py +0 -0
  389. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/evals/make_golden.py +0 -0
  390. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/evals/metrics.py +0 -0
  391. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/evals/run_evals.py +0 -0
  392. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/examples/README.md +0 -0
  393. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/examples/adapt-demo.sh +0 -0
  394. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/examples/boost-run-prototype.sh +0 -0
  395. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/index.html +0 -0
  396. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/noxfile.py +0 -0
  397. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/pyproject.toml +0 -0
  398. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/coverage-tools.in +0 -0
  399. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/coverage-tools.txt +0 -0
  400. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/lint-tools.in +0 -0
  401. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/lint-tools.txt +0 -0
  402. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/mutation-tools.in +0 -0
  403. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/mutation-tools.txt +0 -0
  404. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/platform-pins.lock +0 -0
  405. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/release-tools.in +0 -0
  406. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/release-tools.txt +0 -0
  407. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/test-tools.in +0 -0
  408. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/test-tools.txt +0 -0
  409. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/a11y_check.py +0 -0
  410. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/bench_cli.sh +0 -0
  411. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/build_command_reference.py +0 -0
  412. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/build_demo_index.py +0 -0
  413. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/build_registries.py +0 -0
  414. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/build_roadmap.py +0 -0
  415. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/build_scale_corpus.py +0 -0
  416. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/check_anchors.py +0 -0
  417. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/check_licenses.py +0 -0
  418. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/check_required_checks.py +0 -0
  419. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/ensure_eval_corpus.sh +0 -0
  420. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/eval_corpus.py +0 -0
  421. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/eval_explain.py +0 -0
  422. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/eval_gate.py +0 -0
  423. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/eval_recommend.py +0 -0
  424. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/eval_retrieval.py +0 -0
  425. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/eval_stats_summary.py +0 -0
  426. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/import_budget.py +0 -0
  427. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/lock_toolchain.py +0 -0
  428. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/mutation_gate.py +0 -0
  429. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/mutation_shards.py +0 -0
  430. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/mutation_weights.json +0 -0
  431. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/page_budget.py +0 -0
  432. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/perf_gate.py +0 -0
  433. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/post_deploy_smoke.py +0 -0
  434. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/publish_eval_json.py +0 -0
  435. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/release_guard.py +0 -0
  436. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/release_preflight.py +0 -0
  437. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/serve_docs.py +0 -0
  438. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/setup.cfg +0 -0
  439. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/sonar-project.properties +0 -0
  440. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/style/README.md +0 -0
  441. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/style/boost.css +0 -0
  442. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/style/boost.js +0 -0
  443. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/style/demo.html +0 -0
  444. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/adapt.feature +0 -0
  445. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/browse.feature +0 -0
  446. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/count.feature +0 -0
  447. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/discover.feature +0 -0
  448. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/doctor.feature +0 -0
  449. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/environment.py +0 -0
  450. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/explain.feature +0 -0
  451. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/index.feature +0 -0
  452. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/install.feature +0 -0
  453. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/list.feature +0 -0
  454. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/mcp.feature +0 -0
  455. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/search.feature +0 -0
  456. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/steps/cli_steps.py +0 -0
  457. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/steps/discovery_steps.py +0 -0
  458. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/steps/mcp_steps.py +0 -0
  459. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/steps/quality_steps.py +0 -0
  460. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/conftest.py +0 -0
  461. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/eval/baseline.json +0 -0
  462. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/eval/explain.jsonl +0 -0
  463. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/eval/golden-natural.jsonl +0 -0
  464. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/eval/golden.jsonl +0 -0
  465. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/eval/recommend.jsonl +0 -0
  466. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/eval/taps-scale.txt +0 -0
  467. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/eval/taps.txt +0 -0
  468. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_capabilities_policy.py +0 -0
  469. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_adapt.py +0 -0
  470. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_bmad.py +0 -0
  471. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_chat.py +0 -0
  472. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_configuration.py +0 -0
  473. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_hooks.py +0 -0
  474. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_info.py +0 -0
  475. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_intelligence.py +0 -0
  476. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_quality.py +0 -0
  477. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_taps.py +0 -0
  478. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_team.py +0 -0
  479. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_everyday_loop.py +0 -0
  480. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_integrity_enforce.py +0 -0
  481. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_property_parsers.py +0 -0
  482. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_run.py +0 -0
  483. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_tap_signing.py +0 -0
  484. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_workspace_scope.py +0 -0
  485. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/README.md +0 -0
  486. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  487. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  488. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  489. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  490. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  491. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  492. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  493. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  494. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  495. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  496. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  497. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  498. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  499. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  500. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  501. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  502. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  503. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  504. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  505. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  506. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/fuzz_frontmatter.py +0 -0
  507. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/fuzz_registry.py +0 -0
  508. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/make_fixture.py +0 -0
  509. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/perf/test_benchmarks.py +0 -0
  510. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/smoke.sh +0 -0
  511. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_a11y_check.py +0 -0
  512. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_adapters.py +0 -0
  513. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_adapters_multi.py +0 -0
  514. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_adapters_runner.py +0 -0
  515. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_agents.py +0 -0
  516. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_ai.py +0 -0
  517. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_capabilities.py +0 -0
  518. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_catalog.py +0 -0
  519. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_chat.py +0 -0
  520. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_check_anchors.py +0 -0
  521. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_check_licenses.py +0 -0
  522. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_claude_settings.py +0 -0
  523. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_cliparse.py +0 -0
  524. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_codeql_analysis_key.py +0 -0
  525. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_command_reference_fresh.py +0 -0
  526. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_community_health_files.py +0 -0
  527. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_complete.py +0 -0
  528. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_config.py +0 -0
  529. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_content_dedupe.py +0 -0
  530. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_dedup_trust.py +0 -0
  531. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_demo_index.py +0 -0
  532. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_dense.py +0 -0
  533. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_dense_fallback.py +0 -0
  534. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_dense_fix_hint.py +0 -0
  535. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_dense_shards.py +0 -0
  536. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_dense_status.py +0 -0
  537. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_dependabot_config.py +0 -0
  538. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_docs_pages_linked.py +0 -0
  539. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_docsite_chrome.py +0 -0
  540. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_ed25519.py +0 -0
  541. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_embed.py +0 -0
  542. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_embed_local.py +0 -0
  543. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_entry_key.py +0 -0
  544. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_errors_and_cli_table.py +0 -0
  545. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_eval_baseline.py +0 -0
  546. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_eval_corpus.py +0 -0
  547. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_eval_faithfulness.py +0 -0
  548. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_eval_gate.py +0 -0
  549. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_eval_grading.py +0 -0
  550. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_eval_metrics.py +0 -0
  551. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_eval_stats_summary.py +0 -0
  552. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_faithfulness.py +0 -0
  553. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_frontmatter.py +0 -0
  554. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_fuzz_targets.py +0 -0
  555. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_gitleaks_config.py +0 -0
  556. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_gitutil.py +0 -0
  557. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_imperative.py +0 -0
  558. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_import_budget.py +0 -0
  559. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_injectscan.py +0 -0
  560. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_installscan.py +0 -0
  561. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_integrity.py +0 -0
  562. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_journal.py +0 -0
  563. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_localembed.py +0 -0
  564. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_localembed_e2e.py +0 -0
  565. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_lockfile.py +0 -0
  566. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_logs.py +0 -0
  567. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_marketing_counts.py +0 -0
  568. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_mcp.py +0 -0
  569. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_mcp_install_scan.py +0 -0
  570. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_mcpdecl.py +0 -0
  571. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_mcphost.py +0 -0
  572. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_minisign.py +0 -0
  573. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_mutation_hardening.py +0 -0
  574. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_mutation_shards.py +0 -0
  575. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_mutation_subfile_shards.py +0 -0
  576. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_mutmut_source_paths.py +0 -0
  577. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_nethttp.py +0 -0
  578. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_output.py +0 -0
  579. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_page_budget.py +0 -0
  580. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_paths.py +0 -0
  581. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_perf_gate.py +0 -0
  582. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_pkg_confusions.py +0 -0
  583. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_pkg_injection.py +0 -0
  584. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_pkg_secrets.py +0 -0
  585. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_platform_pins.py +0 -0
  586. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_policy.py +0 -0
  587. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_post_deploy_smoke.py +0 -0
  588. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_project_mcp_sidecar.py +0 -0
  589. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_projectlock.py +0 -0
  590. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_provenance.py +0 -0
  591. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_rag_fusion.py +0 -0
  592. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_registries_fresh.py +0 -0
  593. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_registry.py +0 -0
  594. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_registry_categories.py +0 -0
  595. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_release_guard.py +0 -0
  596. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_release_preflight.py +0 -0
  597. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_required_checks.py +0 -0
  598. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_resolve.py +0 -0
  599. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_roadmap_fresh.py +0 -0
  600. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_rules.py +0 -0
  601. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_scale_corpus.py +0 -0
  602. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_scopes.py +0 -0
  603. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_secretscan.py +0 -0
  604. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_selfupdate.py +0 -0
  605. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_serve.py +0 -0
  606. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_serve_docs.py +0 -0
  607. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_spin.py +0 -0
  608. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_stackprobe.py +0 -0
  609. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_staleness.py +0 -0
  610. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_store.py +0 -0
  611. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_token_parity.py +0 -0
  612. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_toolchain_lock.py +0 -0
  613. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_trustaudit.py +0 -0
  614. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_typosquat.py +0 -0
  615. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_updatediff.py +0 -0
  616. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_util.py +0 -0
  617. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_version.py +0 -0
  618. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_workflow_concurrency.py +0 -0
  619. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_workflow_timeouts.py +0 -0
  620. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_workflows.py +0 -0
  621. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/visual/a11y_check.mjs +0 -0
  622. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/visual/console_check.mjs +0 -0
  623. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/visual/package-lock.json +0 -0
  624. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/visual/package.json +0 -0
  625. {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/visual/visual_check.mjs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.398
3
+ Version: 1.0.400
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.0.398'
22
- __version_tuple__ = version_tuple = (1, 0, 398)
21
+ __version__ = version = '1.0.400'
22
+ __version_tuple__ = version_tuple = (1, 0, 400)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -104,9 +104,20 @@ def cmd_search(argv):
104
104
  # every user gets BM25 ranking without having to know about `boost reindex`.
105
105
  # rag.ensure() is incremental, offline, and degrades to frontmatter search
106
106
  # if the build fails — so a search never hard-fails on an indexing problem.
107
- use_rag = rag.ready()
108
- if not use_rag:
109
- with spin.Spinner("building the search index (first run)"):
107
+ #
108
+ # `and not rag.stale()`, not a bare `rag.ready()`: ready() only asks whether
109
+ # an index exists, so once one did, `boost tap X` followed by a search
110
+ # answered "no matches" for a skill `boost info X` could describe from the
111
+ # same machine — and pointed the user at `boost discover` to go searching
112
+ # GitHub for something already on disk.
113
+ fresh = rag.ready() and not rag.stale()
114
+ use_rag = fresh
115
+ if not fresh:
116
+ # Name which one it is: a first build and a refresh cost the user the
117
+ # same pause, and only one of them is explained by "first run".
118
+ with spin.Spinner("refreshing the search index (taps changed)"
119
+ if rag.ready() else
120
+ "building the search index (first run)"):
110
121
  use_rag = rag.ensure()
111
122
  engine = ""
112
123
  if use_rag:
@@ -716,6 +716,14 @@ def cmd_update(argv: List[str]) -> int:
716
716
  ap.add_argument("tap", nargs="?", metavar="TAP", help="refresh only this tap")
717
717
  ap.add_argument("--taps-only", action="store_true",
718
718
  help="refresh tap clones & catalogs without touching skills")
719
+ # Declared because this command *advertises* it: a skipped risky update
720
+ # prints "review the diff, then `boost update --yes` to apply", and without
721
+ # this line that instruction died on `unrecognized arguments: --yes` — the
722
+ # only escape from the confirmation was a flag the parser rejected. The
723
+ # behaviour needs nothing else: out.confirm() already honours --yes/-y off
724
+ # sys.argv, so this makes the printed advice true rather than adding a path.
725
+ ap.add_argument("-y", "--yes", action="store_true",
726
+ help="skip the confirmation prompt")
719
727
  args = ap.parse_args(argv)
720
728
  results = registry.update(args.tap or None)
721
729
  if not results:
@@ -447,15 +447,62 @@ def ready() -> bool:
447
447
  return bool(raw and raw.get("docs") and postings_path().exists())
448
448
 
449
449
 
450
+ def stale() -> bool:
451
+ """True when the index no longer reflects the taps on disk.
452
+
453
+ ``ready()`` only asks whether an index *exists*, which is why ``ensure()``
454
+ would serve a first build forever: ``boost tap X`` rebuilds X's catalog
455
+ cache but nothing rebuilt the BM25 index, so ``boost search`` answered "no
456
+ matches" — and suggested searching GitHub — for a skill ``boost info`` could
457
+ already describe from the same machine.
458
+
459
+ Deliberately **stat-only**. The obvious test, comparing ``_tap_commits()``
460
+ against the stored commits, means parsing every tap's catalog JSON on every
461
+ search — reintroducing exactly the cold-start cost that moving postings into
462
+ SQLite existed to remove. Two cheap signals cover it instead:
463
+
464
+ * the tap set must still match the set the index recorded (catches a tap
465
+ added or removed, neither of which need touch an existing cache file);
466
+ * no tap's catalog cache may be newer than the index (catches a tap whose
467
+ contents moved, since ``build()`` writes the index only after every
468
+ catalog cache it consumed).
469
+
470
+ The residual gap is a cache rewritten inside the same filesystem mtime tick
471
+ as the index; the next tap operation catches it, and paying a full parse on
472
+ every search to close it is the worse trade.
473
+ """
474
+ raw = _load_raw()
475
+ if raw is None:
476
+ return True
477
+ taps = registry.list_taps()
478
+ if {t.safe_name for t in taps} != set(raw.get("commits") or {}):
479
+ return True
480
+ try:
481
+ built_at = index_path().stat().st_mtime
482
+ except OSError:
483
+ return True
484
+ for t in taps:
485
+ try:
486
+ if t.cache_file.stat().st_mtime > built_at:
487
+ return True
488
+ except OSError:
489
+ continue # no cache yet — build() will pick it up regardless
490
+ return False
491
+
492
+
450
493
  def ensure() -> bool:
451
- """Ensure a usable full-content index exists, building it on first use.
494
+ """Ensure a *current* full-content index exists, building it on first use.
452
495
 
453
496
  This makes BM25 search the default for every surface (CLI + MCP) without the
454
497
  user having to run ``boost reindex`` first. Returns True when RAG is usable.
455
498
  Never raises: with no taps, or if the build fails, it returns False so the
456
499
  caller degrades to frontmatter search instead of erroring.
500
+
501
+ A stale index rebuilds rather than being served: ``build()`` reuses every
502
+ tap whose commit is unchanged, so noticing one new tap costs one tap's
503
+ indexing, not the whole corpus.
457
504
  """
458
- if ready():
505
+ if ready() and not stale():
459
506
  return True
460
507
  if not registry.list_taps():
461
508
  return False
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.398
3
+ Version: 1.0.400
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -342,6 +342,7 @@ docs/roadmap/items/sbom-release-event-never-fires.md
342
342
  docs/roadmap/items/scan-and-sync-rules-and-workflows.md
343
343
  docs/roadmap/items/scheduled-toolchain-lock-regeneration.md
344
344
  docs/roadmap/items/scorecard-findings-triage.md
345
+ docs/roadmap/items/search-never-notices-a-new-tap.md
345
346
  docs/roadmap/items/second-type-checker-pyright.md
346
347
  docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md
347
348
  docs/roadmap/items/secret-scanning-gitleaks-push-protection.md
@@ -366,6 +367,7 @@ docs/roadmap/items/typosquat-and-name-confusion-detection.md
366
367
  docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md
367
368
  docs/roadmap/items/uninstall-has-no-confirmation-prompt.md
368
369
  docs/roadmap/items/untrack-generated-build-noise.md
370
+ docs/roadmap/items/update-advertises-a-flag-it-rejects.md
369
371
  docs/roadmap/items/update-diff-before-apply.md
370
372
  docs/roadmap/items/update-refreshes-rules-and-workflows.md
371
373
  docs/roadmap/items/update-reinstall-widens-agent-scope.md
@@ -104,7 +104,7 @@
104
104
  <a class="cmd-link" href="#cmd-install" data-search="install install a skill from a tap registry --force --agent a --scope {user,project} --local --global --dry-run --no-deps --no-mcp name">install</a>
105
105
  <a class="cmd-link" href="#cmd-uninstall" data-search="uninstall remove an installed skill, rule, workflow, or config --local -y, --yes name">uninstall</a>
106
106
  <a class="cmd-link" href="#cmd-sync" data-search="sync reconcile installed skills &amp; symlinks against the lock file --diff --prune --json">sync</a>
107
- <a class="cmd-link" href="#cmd-update" data-search="update sync taps or update installed skills --taps-only tap">update</a>
107
+ <a class="cmd-link" href="#cmd-update" data-search="update sync taps or update installed skills --taps-only -y, --yes tap">update</a>
108
108
  <a class="cmd-link" href="#cmd-reinstall" data-search="reinstall reinstall a skill or all skills (force) --all name">reinstall</a>
109
109
  <a class="cmd-link" href="#cmd-bundle" data-search="bundle export/install skill sets via a boostfile {dump,install} file">bundle</a>
110
110
  <a class="cmd-link" href="#cmd-import" data-search="import import skills from a github url or local path --name n --all --agent a url_or_path">import</a>
@@ -253,10 +253,10 @@
253
253
  <div class="arg"><code>--json</code><span>machine-readable output</span></div>
254
254
  </div>
255
255
  </section>
256
- <section class="cmd" id="cmd-update" data-search="update sync taps or update installed skills --taps-only tap">
256
+ <section class="cmd" id="cmd-update" data-search="update sync taps or update installed skills --taps-only -y, --yes tap">
257
257
  <h3><span class="cname">update</span><span class="gtag">pkg</span></h3>
258
258
  <p class="summary">Sync taps or update installed skills</p>
259
- <pre class="syn">boost update [--taps-only] [TAP]</pre>
259
+ <pre class="syn">boost update [--taps-only] [--yes] [TAP]</pre>
260
260
  <div class="args-h">Arguments</div>
261
261
  <div class="args">
262
262
  <div class="arg"><code>TAP</code><span>refresh only this tap</span></div>
@@ -264,6 +264,7 @@
264
264
  <div class="args-h">Options</div>
265
265
  <div class="args">
266
266
  <div class="arg"><code>--taps-only</code><span>refresh tap clones &amp; catalogs without touching skills</span></div>
267
+ <div class="arg"><code>-y, --yes</code><span>skip the confirmation prompt</span></div>
267
268
  </div>
268
269
  </section>
269
270
  <section class="cmd" id="cmd-reinstall" data-search="reinstall reinstall a skill or all skills (force) --all name">
@@ -0,0 +1,54 @@
1
+ ---
2
+ id: search-never-notices-a-new-tap
3
+ board: code
4
+ section: internals
5
+ status: shipped
6
+ category: Bug
7
+ complexity: S
8
+ impact: High
9
+ wow: 4
10
+ note: search said "no matches" for a skill `boost info` described from the same machine
11
+ order: 93
12
+ owner: loop/rag-index-stale-after-tap
13
+ title: <code>boost search</code> never noticed a tap added after the first search
14
+ ---
15
+ <code>boost tap X</code> followed by <code>boost search</code> could not find anything in
16
+ <code>X</code> — not until the user happened to run <code>boost reindex</code>, a command nothing
17
+ told them to run. Worse than a miss: search answered <b>"no matches"</b> and suggested
18
+ <code>boost discover</code> to go searching GitHub, for a skill sitting on the user's own disk that
19
+ <code>boost info</code> would describe on request.
20
+
21
+ <b>Reproduced before it was diagnosed</b>, in a throwaway <code>HOME</code> with two fixture taps:
22
+
23
+ <code>boost tap fixB</code> &rarr; <i>"✓ Tapped fixB (6 skills)"</i> &middot;
24
+ <code>boost info zeppelin-telemetry</code> &rarr; <i>"[not installed] [fixB]"</i>, describing it
25
+ happily &middot; <code>boost search "zeppelin telemetry airship"</code> &rarr; <i>"no matches"</i>,
26
+ plus the suggestion to try <code>boost discover</code>. The catalog cache for <code>fixB</code> had
27
+ just been written; the BM25 index files still carried the timestamp from before the tap existed.
28
+
29
+ <b>Two layers, and only fixing the first would have looked right and changed nothing.</b>
30
+ <code>rag.ensure()</code> short-circuited on <code>ready()</code>, and <code>ready()</code> only asks
31
+ whether an index <i>exists</i> — never whether it still describes the taps on disk. But
32
+ <code>cmd_search</code> did not call <code>ensure()</code> at all once an index existed: it called
33
+ <code>rag.ready()</code> itself and reached <code>ensure()</code> only on the cold path. So a fix
34
+ confined to <code>ensure()</code> passed its unit tests and left the CLI exactly as broken. The
35
+ comment above that line already claimed "rag.ensure() is incremental… so a search never hard-fails",
36
+ describing a call the code no longer made.
37
+
38
+ <b>The check is deliberately stat-only.</b> The obvious test — compare the stored per-tap commits
39
+ against <code>_tap_commits()</code> — parses every tap's catalog JSON on every search, which is the
40
+ cold-start cost that moving postings into SQLite existed to remove. Instead <code>rag.stale()</code>
41
+ asks two cheap questions: does the tap set still match the set the index recorded (a new or removed
42
+ tap need not touch any existing cache file), and is any tap's catalog cache newer than the index
43
+ (<code>build()</code> writes the index only after every cache it consumed). Measured after the fix: a
44
+ warm repeat search is <b>0.107 s</b> and leaves the index mtime untouched, so there is no rebuild
45
+ loop. Refreshing is cheap anyway — <code>build()</code> reuses every tap whose commit is unchanged,
46
+ so noticing one new tap costs one tap's indexing, not the corpus.
47
+
48
+ <b>Verification worth naming.</b> Nine hand-applied mutants of <code>stale()</code> — including
49
+ <code>&gt;</code>→<code>&gt;=</code> on the mtime compare and <code>!=</code>→<code>==</code> on the
50
+ tap-set compare — were all killed by the new tests. The functional test was then confirmed to
51
+ <i>fail</i> with the fix reverted, because a regression test that passes either way pins nothing.
52
+ That same check demoted its sibling: the untap case passes with or without this change, since
53
+ <code>rag.retrieve</code> already filters hits against the live catalog, so its docstring now says it
54
+ guards that filter rather than pretending to be evidence for this fix.
@@ -0,0 +1,46 @@
1
+ ---
2
+ id: update-advertises-a-flag-it-rejects
3
+ board: code
4
+ section: internals
5
+ status: shipped
6
+ category: Bug
7
+ complexity: XS
8
+ impact: Med
9
+ wow: 3
10
+ note: the only escape from the security gate was a flag the parser refused
11
+ order: 94
12
+ owner: loop/update-yes-flag
13
+ title: <code>boost update</code> told you to run a flag it then rejected
14
+ ---
15
+ Decline the risky-update confirmation and <code>boost update</code> printed the way out:
16
+ <i>"update skipped — review the diff, then <code>boost update --yes</code> to apply"</i>. Doing
17
+ exactly that produced <code>Error: unrecognized arguments: --yes</code>.
18
+
19
+ <b>Why it mattered more than a typo.</b> That gate is a <i>security</i> feature: it fires when an
20
+ incoming update adds executable-looking instructions — shell commands, pipe-to-shell, a shebang — so
21
+ a poisoned update is seen before it lands. Declining is therefore the careful user's path, and the
22
+ message is the only thing telling them how to proceed afterwards. The instruction was a dead end,
23
+ so the sole documented escape from the gate did not exist, and the remaining options were to
24
+ re-run and answer the prompt interactively or to reach for <code>BOOST_ASSUME_YES</code> — which is
25
+ strictly worse, since it approves <i>every</i> prompt rather than this one.
26
+
27
+ <b>The fix is one <code>add_argument</code>, and deliberately nothing else.</b>
28
+ <code>out.confirm()</code> already honours <code>--yes</code>/<code>-y</code> by reading
29
+ <code>sys.argv</code> directly, so the behaviour was wired the whole time — every other command that
30
+ prompts (<code>install</code>, <code>uninstall</code>, <code>tap</code>, <code>bmad</code>) declares
31
+ the flag, and <code>update</code> was the one that forgot. Declaring it makes the printed advice
32
+ true rather than adding a new code path. <code>docs/commands.html</code> is generated from the
33
+ parsers, so the flag documents itself.
34
+
35
+ <b>Found by taking the advice literally</b> — running the exact string the CLI prints — rather than
36
+ by reading the parser. The regression test does the same thing: it declines the gate, asserts the
37
+ message, then runs the command that message names and asserts the upgrade lands. It was confirmed
38
+ to fail without the fix, with the original <code>unrecognized arguments</code> error.
39
+
40
+ Two traps that shaped the test. It drives the <i>real</i> <code>out.confirm()</code> instead of
41
+ patching it, because the suite sets <code>BOOST_ASSUME_YES=1</code> — leaving that set would
42
+ auto-approve and the test would pass whether or not <code>--yes</code> did anything. And it must
43
+ never call <code>monkeypatch.undo()</code> to shed that env var: the <code>sandbox</code> fixture's
44
+ <code>HOME</code> lives on the same monkeypatch, so undoing drops the test out of its sandbox and
45
+ onto the developer's real <code>~/.boost</code>. The first draft did exactly that and spent four
46
+ minutes pulling real tap clones over the network before failing.
@@ -125,7 +125,7 @@
125
125
  <div class="stat"><b>16</b><span>Shipped</span></div>
126
126
  <div class="stat"><b>1</b><span>Next up</span></div>
127
127
  <div class="stat"><b>8</b><span>Planned</span></div>
128
- <div class="stat"><b>211</b><span>Loop finds</span></div>
128
+ <div class="stat"><b>213</b><span>Loop finds</span></div>
129
129
  <!-- /ROADMAP:stats -->
130
130
  </div>
131
131
  </section>
@@ -3236,6 +3236,102 @@ no judgement in it: the 18 safe <code>UP017</code> fixes (<code>timezone.utc</co
3236
3236
  <span class="m">the floor was blocking a CVE fix and a dependency major at once</span>
3237
3237
  </div>
3238
3238
  </article>
3239
+
3240
+ <article class="cap rcard" id="search-never-notices-a-new-tap">
3241
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Bug</span></div>
3242
+ <h3><code>boost search</code> never noticed a tap added after the first search</h3>
3243
+ <details class="cardbody"><summary>Write-up</summary>
3244
+ <p><code>boost tap X</code> followed by <code>boost search</code> could not find anything in
3245
+ <code>X</code> — not until the user happened to run <code>boost reindex</code>, a command nothing
3246
+ told them to run. Worse than a miss: search answered <b>"no matches"</b> and suggested
3247
+ <code>boost discover</code> to go searching GitHub, for a skill sitting on the user's own disk that
3248
+ <code>boost info</code> would describe on request.
3249
+
3250
+ <b>Reproduced before it was diagnosed</b>, in a throwaway <code>HOME</code> with two fixture taps:
3251
+
3252
+ <code>boost tap fixB</code> &rarr; <i>"✓ Tapped fixB (6 skills)"</i> &middot;
3253
+ <code>boost info zeppelin-telemetry</code> &rarr; <i>"[not installed] [fixB]"</i>, describing it
3254
+ happily &middot; <code>boost search "zeppelin telemetry airship"</code> &rarr; <i>"no matches"</i>,
3255
+ plus the suggestion to try <code>boost discover</code>. The catalog cache for <code>fixB</code> had
3256
+ just been written; the BM25 index files still carried the timestamp from before the tap existed.
3257
+
3258
+ <b>Two layers, and only fixing the first would have looked right and changed nothing.</b>
3259
+ <code>rag.ensure()</code> short-circuited on <code>ready()</code>, and <code>ready()</code> only asks
3260
+ whether an index <i>exists</i> — never whether it still describes the taps on disk. But
3261
+ <code>cmd_search</code> did not call <code>ensure()</code> at all once an index existed: it called
3262
+ <code>rag.ready()</code> itself and reached <code>ensure()</code> only on the cold path. So a fix
3263
+ confined to <code>ensure()</code> passed its unit tests and left the CLI exactly as broken. The
3264
+ comment above that line already claimed "rag.ensure() is incremental… so a search never hard-fails",
3265
+ describing a call the code no longer made.
3266
+
3267
+ <b>The check is deliberately stat-only.</b> The obvious test — compare the stored per-tap commits
3268
+ against <code>_tap_commits()</code> — parses every tap's catalog JSON on every search, which is the
3269
+ cold-start cost that moving postings into SQLite existed to remove. Instead <code>rag.stale()</code>
3270
+ asks two cheap questions: does the tap set still match the set the index recorded (a new or removed
3271
+ tap need not touch any existing cache file), and is any tap's catalog cache newer than the index
3272
+ (<code>build()</code> writes the index only after every cache it consumed). Measured after the fix: a
3273
+ warm repeat search is <b>0.107 s</b> and leaves the index mtime untouched, so there is no rebuild
3274
+ loop. Refreshing is cheap anyway — <code>build()</code> reuses every tap whose commit is unchanged,
3275
+ so noticing one new tap costs one tap's indexing, not the corpus.
3276
+
3277
+ <b>Verification worth naming.</b> Nine hand-applied mutants of <code>stale()</code> — including
3278
+ <code>&gt;</code>→<code>&gt;=</code> on the mtime compare and <code>!=</code>→<code>==</code> on the
3279
+ tap-set compare — were all killed by the new tests. The functional test was then confirmed to
3280
+ <i>fail</i> with the fix reverted, because a regression test that passes either way pins nothing.
3281
+ That same check demoted its sibling: the untap case passes with or without this change, since
3282
+ <code>rag.retrieve</code> already filters hits against the live catalog, so its docstring now says it
3283
+ guards that filter rather than pretending to be evidence for this fix.</p></details>
3284
+ <div class="meta">
3285
+ <span class="m">Complexity <b>S</b></span>
3286
+ <span class="m hi">Impact <b>High</b></span>
3287
+ <span class="m">Wow <b class="wow">★★★★</b></span>
3288
+ <span class="m">search said "no matches" for a skill `boost info` described from the same machine</span>
3289
+ </div>
3290
+ </article>
3291
+
3292
+ <article class="cap rcard" id="update-advertises-a-flag-it-rejects">
3293
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Bug</span></div>
3294
+ <h3><code>boost update</code> told you to run a flag it then rejected</h3>
3295
+ <details class="cardbody"><summary>Write-up</summary>
3296
+ <p>Decline the risky-update confirmation and <code>boost update</code> printed the way out:
3297
+ <i>"update skipped — review the diff, then <code>boost update --yes</code> to apply"</i>. Doing
3298
+ exactly that produced <code>Error: unrecognized arguments: --yes</code>.
3299
+
3300
+ <b>Why it mattered more than a typo.</b> That gate is a <i>security</i> feature: it fires when an
3301
+ incoming update adds executable-looking instructions — shell commands, pipe-to-shell, a shebang — so
3302
+ a poisoned update is seen before it lands. Declining is therefore the careful user's path, and the
3303
+ message is the only thing telling them how to proceed afterwards. The instruction was a dead end,
3304
+ so the sole documented escape from the gate did not exist, and the remaining options were to
3305
+ re-run and answer the prompt interactively or to reach for <code>BOOST_ASSUME_YES</code> — which is
3306
+ strictly worse, since it approves <i>every</i> prompt rather than this one.
3307
+
3308
+ <b>The fix is one <code>add_argument</code>, and deliberately nothing else.</b>
3309
+ <code>out.confirm()</code> already honours <code>--yes</code>/<code>-y</code> by reading
3310
+ <code>sys.argv</code> directly, so the behaviour was wired the whole time — every other command that
3311
+ prompts (<code>install</code>, <code>uninstall</code>, <code>tap</code>, <code>bmad</code>) declares
3312
+ the flag, and <code>update</code> was the one that forgot. Declaring it makes the printed advice
3313
+ true rather than adding a new code path. <code>docs/commands.html</code> is generated from the
3314
+ parsers, so the flag documents itself.
3315
+
3316
+ <b>Found by taking the advice literally</b> — running the exact string the CLI prints — rather than
3317
+ by reading the parser. The regression test does the same thing: it declines the gate, asserts the
3318
+ message, then runs the command that message names and asserts the upgrade lands. It was confirmed
3319
+ to fail without the fix, with the original <code>unrecognized arguments</code> error.
3320
+
3321
+ Two traps that shaped the test. It drives the <i>real</i> <code>out.confirm()</code> instead of
3322
+ patching it, because the suite sets <code>BOOST_ASSUME_YES=1</code> — leaving that set would
3323
+ auto-approve and the test would pass whether or not <code>--yes</code> did anything. And it must
3324
+ never call <code>monkeypatch.undo()</code> to shed that env var: the <code>sandbox</code> fixture's
3325
+ <code>HOME</code> lives on the same monkeypatch, so undoing drops the test out of its sandbox and
3326
+ onto the developer's real <code>~/.boost</code>. The first draft did exactly that and spent four
3327
+ minutes pulling real tap clones over the network before failing.</p></details>
3328
+ <div class="meta">
3329
+ <span class="m">Complexity <b>XS</b></span>
3330
+ <span class="m">Impact <b>Med</b></span>
3331
+ <span class="m">Wow <b class="wow">★★★</b></span>
3332
+ <span class="m">the only escape from the security gate was a flag the parser refused</span>
3333
+ </div>
3334
+ </article>
3239
3335
  <!-- /ROADMAP:cards -->
3240
3336
 
3241
3337
  </div>
@@ -1084,6 +1084,59 @@ class TestReindex:
1084
1084
  r = boost("search", "brainstorming")
1085
1085
  assert "ranked by full-content BM25" in r.out
1086
1086
 
1087
+ def test_search_sees_a_tap_added_after_the_index_was_built(
1088
+ self, boost, tapped, tmp_path):
1089
+ """`boost tap X` then `boost search` must find X, with no reindex.
1090
+
1091
+ The regression this pins: `cmd_search` gated on `rag.ready()`, which
1092
+ only asks whether an index *exists*. Once one did, a newly tapped repo
1093
+ stayed invisible to search forever — while `boost info` described it
1094
+ happily from the same machine, and search told the user to go looking
1095
+ on GitHub for something already on their disk.
1096
+ """
1097
+ boost("search", "brainstorming") # builds the index over `tapped`
1098
+
1099
+ root = tmp_path / "second-tap"
1100
+ second = root / "skills" / "zeppelin-telemetry"
1101
+ second.mkdir(parents=True)
1102
+ (second / "SKILL.md").write_text(
1103
+ "---\nname: zeppelin-telemetry\n"
1104
+ "description: Stream airship gondola telemetry to a ground station.\n"
1105
+ "---\n\n# Zeppelin telemetry\n\n"
1106
+ "Mount the gondola sensor array and stream zeppelin telemetry "
1107
+ "frames to the ground station dashboard.\n",
1108
+ encoding="utf-8")
1109
+ # `boost tap` clones its source, so the source has to be a real repo.
1110
+ for cmd in (("init", "-q"),
1111
+ ("config", "user.email", "fixture@boost.test"),
1112
+ ("config", "user.name", "fixture"),
1113
+ ("add", "-A"),
1114
+ ("commit", "-qm", "second tap")):
1115
+ subprocess.run(("git", *cmd), cwd=str(root),
1116
+ check=True, capture_output=True)
1117
+ boost("tap", str(root))
1118
+
1119
+ # Deliberately no `boost reindex` — that is the whole point.
1120
+ r = boost("search", "zeppelin telemetry gondola")
1121
+ assert "zeppelin-telemetry" in r.out
1122
+ assert "no matches" not in r.out
1123
+
1124
+ def test_search_stops_offering_an_untapped_repo(self, boost, tapped):
1125
+ """After `boost untap`, its skills must stop ranking.
1126
+
1127
+ Note what actually carries this: `rag.retrieve` filters every hit
1128
+ against the live catalog, so a removed tap's documents are dropped even
1129
+ from a stale index. It therefore passes with or without the staleness
1130
+ check, and is a guard on that filter rather than on `rag.stale`; the
1131
+ removal branch of `stale()` is pinned by its own unit test. Worth
1132
+ keeping as the end-to-end statement of the promise, not as evidence for
1133
+ the fix beside it.
1134
+ """
1135
+ assert "brainstorming" in boost("search", "brainstorming").out
1136
+ boost("untap", tapped.name) # untap takes the tap's name
1137
+ r = boost("search", "brainstorming", expect=None)
1138
+ assert "brainstorming" not in r.out
1139
+
1087
1140
  def test_dense_skipped_when_no_backend_at_all(self, boost, tapped, monkeypatch):
1088
1141
  """No key and no local model: BM25 still builds, dense says why it didn't.
1089
1142
 
@@ -429,6 +429,41 @@ class TestUpdateDiffGate:
429
429
  assert "upgraded" not in r.out
430
430
  assert _lock()["brainstorming"]["version"] == "1.4.0"
431
431
 
432
+ def test_the_yes_flag_the_skip_message_advertises_is_accepted(
433
+ self, boost, fixture_tap_src, tmp_path, monkeypatch):
434
+ """Declining prints "then `boost update --yes` to apply" — so that has
435
+ to parse.
436
+
437
+ It did not: `boost update` never declared -y/--yes, so following its own
438
+ instruction died on `unrecognized arguments: --yes`, and the only escape
439
+ from the gate was a flag the parser rejected.
440
+ """
441
+ tap_dir = _copy_tap(fixture_tap_src, tmp_path / "risk-tap3")
442
+ boost("tap", tap_dir)
443
+ boost("install", "brainstorming")
444
+ _poison(tap_dir, "brainstorming", "1.4.0", "1.5.0")
445
+
446
+ # Drive the real out.confirm() rather than patching it: drop conftest's
447
+ # BOOST_ASSUME_YES (it would auto-approve and hide whether --yes did
448
+ # anything) and set sys.argv explicitly, which is where confirm() looks
449
+ # for the flag. With neither set and stdin not a tty, confirm returns
450
+ # its default — False — so the gate declines on its own.
451
+ # NB: never monkeypatch.undo() here; the sandbox fixture's HOME is on
452
+ # the same monkeypatch, so undoing drops the test out of its sandbox and
453
+ # onto the developer's real ~/.boost.
454
+ monkeypatch.delenv("BOOST_ASSUME_YES", raising=False)
455
+ monkeypatch.setattr("sys.argv", ["boost", "update"])
456
+ r = boost("update")
457
+ assert "`boost update --yes` to apply" in r.out # the advice is given
458
+ assert _lock()["brainstorming"]["version"] == "1.4.0"
459
+
460
+ # Now take that advice verbatim.
461
+ monkeypatch.setattr("sys.argv", ["boost", "update", "--yes"])
462
+ r2 = boost("update", "--yes")
463
+ assert "unrecognized arguments" not in r2.err
464
+ assert "upgraded brainstorming v1.4.0 → v1.5.0" in r2.out
465
+ assert _lock()["brainstorming"]["version"] == "1.5.0"
466
+
432
467
  def test_routine_bump_applies_without_gate(
433
468
  self, boost, fixture_tap_src, tmp_path):
434
469
  tap_dir = _copy_tap(fixture_tap_src, tmp_path / "clean-tap")