boost-skill-cli 1.0.400__tar.gz → 1.0.401__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 (626) hide show
  1. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/pkg.py +24 -5
  4. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/gitutil.py +27 -2
  5. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/registry.py +34 -10
  6. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  7. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_skill_cli.egg-info/SOURCES.txt +1 -0
  8. boost_skill_cli-1.0.401/docs/roadmap/items/one-dead-tap-broke-every-update.md +57 -0
  9. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap.html +56 -1
  10. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_pkg.py +80 -0
  11. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_registry.py +56 -3
  12. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.gitattributes +0 -0
  13. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.gitignore +0 -0
  14. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.gitleaks.toml +0 -0
  15. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.htmlvalidate.json +0 -0
  16. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.lighthouserc.json +0 -0
  17. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.lycheeignore +0 -0
  18. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.markdownlint-cli2.jsonc +0 -0
  19. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.pre-commit-config.yaml +0 -0
  20. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.stylelintrc.json +0 -0
  21. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.vale/styles/boost/Terminology.yml +0 -0
  22. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  23. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.vale.ini +0 -0
  24. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/CLAUDE.md +0 -0
  25. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/CODE_OF_CONDUCT.md +0 -0
  26. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/CONTRIBUTING.md +0 -0
  27. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/LICENSE +0 -0
  28. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/MANIFEST.in +0 -0
  29. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/Makefile +0 -0
  30. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/README.md +0 -0
  31. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/SECURITY.md +0 -0
  32. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost +0 -0
  33. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/__init__.py +0 -0
  34. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/__main__.py +0 -0
  35. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/cli.py +0 -0
  36. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/cliparse.py +0 -0
  37. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/__init__.py +0 -0
  38. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/_common.py +0 -0
  39. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/bmad.py +0 -0
  40. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/configuration.py +0 -0
  41. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/discovery.py +0 -0
  42. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/hooks.py +0 -0
  43. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/info.py +0 -0
  44. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/intelligence.py +0 -0
  45. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/quality.py +0 -0
  46. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/run.py +0 -0
  47. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/safety.py +0 -0
  48. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/taps.py +0 -0
  49. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/team.py +0 -0
  50. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/__init__.py +0 -0
  51. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/adapters.py +0 -0
  52. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/agents.py +0 -0
  53. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/ai.py +0 -0
  54. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/capabilities.py +0 -0
  55. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/catalog.py +0 -0
  56. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/chat.py +0 -0
  57. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/claude_settings.py +0 -0
  58. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/complete.py +0 -0
  59. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/config.py +0 -0
  60. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/dense.py +0 -0
  61. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/ed25519.py +0 -0
  62. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/embed.py +0 -0
  63. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/faithfulness.py +0 -0
  64. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/frontmatter.py +0 -0
  65. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/imperative.py +0 -0
  66. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/injectscan.py +0 -0
  67. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/installscan.py +0 -0
  68. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/integrity.py +0 -0
  69. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/journal.py +0 -0
  70. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/localembed.py +0 -0
  71. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/lockfile.py +0 -0
  72. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/logs.py +0 -0
  73. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/mcp.py +0 -0
  74. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/mcpdecl.py +0 -0
  75. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/mcphost.py +0 -0
  76. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/minisign.py +0 -0
  77. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/nethttp.py +0 -0
  78. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/output.py +0 -0
  79. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/paths.py +0 -0
  80. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/policy.py +0 -0
  81. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/projectlock.py +0 -0
  82. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/provenance.py +0 -0
  83. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/rag.py +0 -0
  84. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/resolve.py +0 -0
  85. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/rules.py +0 -0
  86. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/scopes.py +0 -0
  87. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/secretscan.py +0 -0
  88. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/selfupdate.py +0 -0
  89. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/serve.py +0 -0
  90. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/stackprobe.py +0 -0
  91. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/staleness.py +0 -0
  92. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/store.py +0 -0
  93. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/trustaudit.py +0 -0
  94. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/typosquat.py +0 -0
  95. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/updatediff.py +0 -0
  96. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/util.py +0 -0
  97. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/workflows.py +0 -0
  98. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/data/registries.json +0 -0
  99. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/errors.py +0 -0
  100. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/spin.py +0 -0
  101. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  102. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  103. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_skill_cli.egg-info/requires.txt +0 -0
  104. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_skill_cli.egg-info/top_level.txt +0 -0
  105. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/codecov.yml +0 -0
  106. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/.claude/settings.local.json +0 -0
  107. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/DEBUGGING.md +0 -0
  108. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/adapters.html +0 -0
  109. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/architecture/README.md +0 -0
  110. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/architecture/c4-components-core.md +0 -0
  111. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/architecture/c4-containers.md +0 -0
  112. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/architecture/c4-context.md +0 -0
  113. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/architecture/c4-dynamic-install.md +0 -0
  114. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/gifs/distill.gif +0 -0
  115. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/gifs/doctor.gif +0 -0
  116. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/gifs/explain.gif +0 -0
  117. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/gifs/hooks.gif +0 -0
  118. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/gifs/install.gif +0 -0
  119. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/gifs/pulse.gif +0 -0
  120. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/gifs/search.gif +0 -0
  121. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/gifs/tap.gif +0 -0
  122. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/tapes/distill.tape +0 -0
  123. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/tapes/doctor.tape +0 -0
  124. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/tapes/explain.tape +0 -0
  125. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/tapes/hooks.tape +0 -0
  126. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/tapes/install.tape +0 -0
  127. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/tapes/pulse.tape +0 -0
  128. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/tapes/search.tape +0 -0
  129. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/tapes/tap.tape +0 -0
  130. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel.html +0 -0
  131. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/chat.html +0 -0
  132. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/commands.html +0 -0
  133. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/demo-index.json +0 -0
  134. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/demo.gif +0 -0
  135. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/demo.html +0 -0
  136. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/demo.tape +0 -0
  137. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/design-roadmap.html +0 -0
  138. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/eval-latest.json +0 -0
  139. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/eval.html +0 -0
  140. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/index.html +0 -0
  141. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/mcp-hub.html +0 -0
  142. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/rag-architecture.md +0 -0
  143. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D01.md +0 -0
  144. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D02.md +0 -0
  145. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D03.md +0 -0
  146. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D04.md +0 -0
  147. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D05.md +0 -0
  148. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D06.md +0 -0
  149. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D07.md +0 -0
  150. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D08.md +0 -0
  151. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D09.md +0 -0
  152. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D10.md +0 -0
  153. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D11.md +0 -0
  154. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D12.md +0 -0
  155. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D13.md +0 -0
  156. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D14.md +0 -0
  157. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D15.md +0 -0
  158. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D16.md +0 -0
  159. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D17.md +0 -0
  160. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D18.md +0 -0
  161. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D19.md +0 -0
  162. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D20.md +0 -0
  163. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D21.md +0 -0
  164. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D22.md +0 -0
  165. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D23.md +0 -0
  166. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D24.md +0 -0
  167. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D25.md +0 -0
  168. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D26.md +0 -0
  169. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  170. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  171. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  172. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  173. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  174. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  175. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  176. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  177. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  178. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  179. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  180. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  181. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  182. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  183. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  184. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  185. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  186. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  187. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  188. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  189. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  190. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  191. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  192. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  193. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  194. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  195. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/command-carousel-page.md +0 -0
  196. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  197. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  198. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  199. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  200. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  201. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  202. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  203. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  204. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  205. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  206. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  207. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  208. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  209. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  210. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  211. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  212. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  213. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  214. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  215. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  216. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  217. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  218. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  219. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  220. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  221. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  222. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  223. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  224. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  225. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  226. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  227. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  228. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  229. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  230. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  231. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/github-community-health-files.md +0 -0
  232. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  233. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  234. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  235. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  236. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  237. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  238. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  239. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  240. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  241. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  242. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  243. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  244. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  245. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  246. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  247. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  248. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  249. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  250. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  251. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  252. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  253. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  254. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  255. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  256. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  257. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  258. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  259. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  260. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  261. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  262. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  263. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  264. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  265. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  266. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  267. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  268. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  269. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  270. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  271. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  272. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  273. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  274. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  275. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  276. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  277. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  278. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  279. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  280. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  281. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  282. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  283. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  284. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  285. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  286. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  287. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  288. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  289. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  290. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  291. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  292. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  293. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  294. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  295. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  296. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  297. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  298. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  299. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  300. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  301. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  302. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  303. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  304. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  305. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  306. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  307. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  308. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  309. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  310. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  311. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  312. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  313. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  314. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  315. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  316. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  317. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  318. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  319. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  320. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  321. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  322. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  323. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  324. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  325. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  326. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  327. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  328. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  329. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  330. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  331. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  332. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  333. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  334. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  335. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  336. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  337. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  338. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  339. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  340. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  341. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  342. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  343. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  344. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  345. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  346. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  347. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  348. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  349. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  350. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  351. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  352. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  353. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  354. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  355. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  356. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  357. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  358. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  359. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  360. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  361. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  362. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  363. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  364. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  365. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  366. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  367. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  368. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  369. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  370. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  371. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  372. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  373. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  374. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  375. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  376. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  377. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  378. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  379. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/workspace-scope-install.md +0 -0
  380. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/zip-strict-audit.md +0 -0
  381. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  382. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/eslint.config.mjs +0 -0
  383. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/evals/README.md +0 -0
  384. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/evals/__init__.py +0 -0
  385. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/evals/baseline.json +0 -0
  386. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/evals/faithfulness.py +0 -0
  387. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/evals/golden_set.json +0 -0
  388. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/evals/make_corpus.py +0 -0
  389. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/evals/make_golden.py +0 -0
  390. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/evals/metrics.py +0 -0
  391. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/evals/run_evals.py +0 -0
  392. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/examples/README.md +0 -0
  393. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/examples/adapt-demo.sh +0 -0
  394. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/examples/boost-run-prototype.sh +0 -0
  395. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/index.html +0 -0
  396. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/noxfile.py +0 -0
  397. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/pyproject.toml +0 -0
  398. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/coverage-tools.in +0 -0
  399. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/coverage-tools.txt +0 -0
  400. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/lint-tools.in +0 -0
  401. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/lint-tools.txt +0 -0
  402. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/mutation-tools.in +0 -0
  403. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/mutation-tools.txt +0 -0
  404. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/platform-pins.lock +0 -0
  405. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/release-tools.in +0 -0
  406. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/release-tools.txt +0 -0
  407. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/test-tools.in +0 -0
  408. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/test-tools.txt +0 -0
  409. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/a11y_check.py +0 -0
  410. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/bench_cli.sh +0 -0
  411. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/build_command_reference.py +0 -0
  412. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/build_demo_index.py +0 -0
  413. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/build_registries.py +0 -0
  414. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/build_roadmap.py +0 -0
  415. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/build_scale_corpus.py +0 -0
  416. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/check_anchors.py +0 -0
  417. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/check_licenses.py +0 -0
  418. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/check_required_checks.py +0 -0
  419. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/ensure_eval_corpus.sh +0 -0
  420. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/eval_corpus.py +0 -0
  421. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/eval_explain.py +0 -0
  422. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/eval_gate.py +0 -0
  423. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/eval_recommend.py +0 -0
  424. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/eval_retrieval.py +0 -0
  425. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/eval_stats_summary.py +0 -0
  426. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/import_budget.py +0 -0
  427. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/lock_toolchain.py +0 -0
  428. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/mutation_gate.py +0 -0
  429. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/mutation_shards.py +0 -0
  430. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/mutation_weights.json +0 -0
  431. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/page_budget.py +0 -0
  432. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/perf_gate.py +0 -0
  433. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/post_deploy_smoke.py +0 -0
  434. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/publish_eval_json.py +0 -0
  435. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/release_guard.py +0 -0
  436. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/release_preflight.py +0 -0
  437. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/serve_docs.py +0 -0
  438. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/setup.cfg +0 -0
  439. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/sonar-project.properties +0 -0
  440. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/style/README.md +0 -0
  441. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/style/boost.css +0 -0
  442. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/style/boost.js +0 -0
  443. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/style/demo.html +0 -0
  444. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/adapt.feature +0 -0
  445. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/browse.feature +0 -0
  446. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/count.feature +0 -0
  447. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/discover.feature +0 -0
  448. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/doctor.feature +0 -0
  449. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/environment.py +0 -0
  450. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/explain.feature +0 -0
  451. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/index.feature +0 -0
  452. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/install.feature +0 -0
  453. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/list.feature +0 -0
  454. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/mcp.feature +0 -0
  455. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/search.feature +0 -0
  456. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/steps/cli_steps.py +0 -0
  457. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/steps/discovery_steps.py +0 -0
  458. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/steps/mcp_steps.py +0 -0
  459. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/steps/quality_steps.py +0 -0
  460. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/conftest.py +0 -0
  461. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/eval/baseline.json +0 -0
  462. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/eval/explain.jsonl +0 -0
  463. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/eval/golden-natural.jsonl +0 -0
  464. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/eval/golden.jsonl +0 -0
  465. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/eval/recommend.jsonl +0 -0
  466. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/eval/taps-scale.txt +0 -0
  467. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/eval/taps.txt +0 -0
  468. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_capabilities_policy.py +0 -0
  469. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_adapt.py +0 -0
  470. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_bmad.py +0 -0
  471. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_chat.py +0 -0
  472. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_configuration.py +0 -0
  473. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_discovery.py +0 -0
  474. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_hooks.py +0 -0
  475. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_info.py +0 -0
  476. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_intelligence.py +0 -0
  477. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_quality.py +0 -0
  478. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_taps.py +0 -0
  479. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_team.py +0 -0
  480. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_everyday_loop.py +0 -0
  481. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_integrity_enforce.py +0 -0
  482. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_property_parsers.py +0 -0
  483. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_run.py +0 -0
  484. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_tap_signing.py +0 -0
  485. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_workspace_scope.py +0 -0
  486. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/README.md +0 -0
  487. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  488. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  489. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  490. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  491. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  492. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  493. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  494. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  495. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  496. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  497. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  498. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  499. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  500. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  501. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  502. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  503. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  504. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  505. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  506. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  507. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/fuzz_frontmatter.py +0 -0
  508. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/fuzz_registry.py +0 -0
  509. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/make_fixture.py +0 -0
  510. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/perf/test_benchmarks.py +0 -0
  511. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/smoke.sh +0 -0
  512. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_a11y_check.py +0 -0
  513. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_adapters.py +0 -0
  514. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_adapters_multi.py +0 -0
  515. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_adapters_runner.py +0 -0
  516. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_agents.py +0 -0
  517. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_ai.py +0 -0
  518. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_capabilities.py +0 -0
  519. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_catalog.py +0 -0
  520. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_chat.py +0 -0
  521. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_check_anchors.py +0 -0
  522. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_check_licenses.py +0 -0
  523. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_claude_settings.py +0 -0
  524. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_cliparse.py +0 -0
  525. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_codeql_analysis_key.py +0 -0
  526. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_command_reference_fresh.py +0 -0
  527. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_community_health_files.py +0 -0
  528. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_complete.py +0 -0
  529. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_config.py +0 -0
  530. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_content_dedupe.py +0 -0
  531. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_dedup_trust.py +0 -0
  532. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_demo_index.py +0 -0
  533. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_dense.py +0 -0
  534. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_dense_fallback.py +0 -0
  535. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_dense_fix_hint.py +0 -0
  536. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_dense_shards.py +0 -0
  537. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_dense_status.py +0 -0
  538. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_dependabot_config.py +0 -0
  539. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_docs_pages_linked.py +0 -0
  540. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_docsite_chrome.py +0 -0
  541. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_ed25519.py +0 -0
  542. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_embed.py +0 -0
  543. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_embed_local.py +0 -0
  544. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_entry_key.py +0 -0
  545. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_errors_and_cli_table.py +0 -0
  546. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_eval_baseline.py +0 -0
  547. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_eval_corpus.py +0 -0
  548. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_eval_faithfulness.py +0 -0
  549. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_eval_gate.py +0 -0
  550. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_eval_grading.py +0 -0
  551. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_eval_metrics.py +0 -0
  552. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_eval_stats_summary.py +0 -0
  553. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_faithfulness.py +0 -0
  554. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_frontmatter.py +0 -0
  555. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_fuzz_targets.py +0 -0
  556. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_gitleaks_config.py +0 -0
  557. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_gitutil.py +0 -0
  558. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_imperative.py +0 -0
  559. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_import_budget.py +0 -0
  560. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_injectscan.py +0 -0
  561. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_installscan.py +0 -0
  562. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_integrity.py +0 -0
  563. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_journal.py +0 -0
  564. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_localembed.py +0 -0
  565. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_localembed_e2e.py +0 -0
  566. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_lockfile.py +0 -0
  567. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_logs.py +0 -0
  568. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_marketing_counts.py +0 -0
  569. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_mcp.py +0 -0
  570. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_mcp_install_scan.py +0 -0
  571. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_mcpdecl.py +0 -0
  572. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_mcphost.py +0 -0
  573. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_minisign.py +0 -0
  574. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_mutation_hardening.py +0 -0
  575. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_mutation_shards.py +0 -0
  576. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_mutation_subfile_shards.py +0 -0
  577. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_mutmut_source_paths.py +0 -0
  578. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_nethttp.py +0 -0
  579. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_output.py +0 -0
  580. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_page_budget.py +0 -0
  581. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_paths.py +0 -0
  582. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_perf_gate.py +0 -0
  583. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_pkg_confusions.py +0 -0
  584. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_pkg_injection.py +0 -0
  585. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_pkg_secrets.py +0 -0
  586. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_platform_pins.py +0 -0
  587. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_policy.py +0 -0
  588. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_post_deploy_smoke.py +0 -0
  589. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_project_mcp_sidecar.py +0 -0
  590. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_projectlock.py +0 -0
  591. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_provenance.py +0 -0
  592. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_rag.py +0 -0
  593. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_rag_fusion.py +0 -0
  594. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_registries_fresh.py +0 -0
  595. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_registry_categories.py +0 -0
  596. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_release_guard.py +0 -0
  597. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_release_preflight.py +0 -0
  598. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_required_checks.py +0 -0
  599. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_resolve.py +0 -0
  600. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_roadmap_fresh.py +0 -0
  601. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_rules.py +0 -0
  602. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_scale_corpus.py +0 -0
  603. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_scopes.py +0 -0
  604. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_secretscan.py +0 -0
  605. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_selfupdate.py +0 -0
  606. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_serve.py +0 -0
  607. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_serve_docs.py +0 -0
  608. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_spin.py +0 -0
  609. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_stackprobe.py +0 -0
  610. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_staleness.py +0 -0
  611. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_store.py +0 -0
  612. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_token_parity.py +0 -0
  613. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_toolchain_lock.py +0 -0
  614. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_trustaudit.py +0 -0
  615. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_typosquat.py +0 -0
  616. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_updatediff.py +0 -0
  617. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_util.py +0 -0
  618. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_version.py +0 -0
  619. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_workflow_concurrency.py +0 -0
  620. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_workflow_timeouts.py +0 -0
  621. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_workflows.py +0 -0
  622. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/visual/a11y_check.mjs +0 -0
  623. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/visual/console_check.mjs +0 -0
  624. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/visual/package-lock.json +0 -0
  625. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/visual/package.json +0 -0
  626. {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/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.400
3
+ Version: 1.0.401
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.400'
22
- __version_tuple__ = version_tuple = (1, 0, 400)
21
+ __version__ = version = '1.0.401'
22
+ __version_tuple__ = version_tuple = (1, 0, 401)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -725,19 +725,32 @@ def cmd_update(argv: List[str]) -> int:
725
725
  ap.add_argument("-y", "--yes", action="store_true",
726
726
  help="skip the confirmation prompt")
727
727
  args = ap.parse_args(argv)
728
- results = registry.update(args.tap or None)
729
- if not results:
728
+ results, failures = registry.update(args.tap or None)
729
+ if not results and not failures:
730
730
  out.info("no taps configured — start with `boost tap --defaults`")
731
731
  return 0
732
732
  for tname, summary in results.items():
733
733
  catalog.rebuild_tap(registry.get(tname))
734
734
  out.ok("%s: %s" % (tname, summary))
735
+ # Report the dead ones by name, after the successes, so a broken upstream
736
+ # reads as one line of bad news rather than as the whole command failing.
737
+ for tname, err in failures.items():
738
+ out.warn("%s: %s" % (tname, err))
739
+ if failures:
740
+ out.info(out.role(
741
+ "%d of %d taps could not be refreshed — the rest are up to date. "
742
+ "Drop a dead one with `boost untap <name>`."
743
+ % (len(failures), len(results) + len(failures)), "muted"))
735
744
  # A pulled tap can add, drop, or rename catalogue entries, so the
736
745
  # completion name cache must not survive an update unrefreshed.
737
746
  complete.refresh_names()
738
747
  journal.log("update", args.tap or "all")
739
748
  if args.taps_only:
740
- return 0
749
+ # Same exit-code rule as the end of the full path: non-zero only when
750
+ # nothing was refreshed at all. This early return predates that rule
751
+ # and kept answering 0 with every tap dead — and a cron'd
752
+ # `boost update --taps-only` exists precisely to notice that morning.
753
+ return 1 if failures and not results else 0
741
754
 
742
755
  upgraded = 0
743
756
  for name, lk in sorted(lockfile.installed().items()):
@@ -782,8 +795,14 @@ def cmd_update(argv: List[str]) -> int:
782
795
  upgraded += _update_materialized("rule", lockfile.installed_rules(), results)
783
796
  upgraded += _update_materialized("workflow", lockfile.installed_workflows(), results)
784
797
  if not upgraded:
785
- out.ok("everything up to date")
786
- return 0
798
+ # Don't claim "everything up to date" when some taps were never
799
+ # reached — that is exactly the false all-clear this fix exists to stop.
800
+ out.ok("everything up to date" if not failures
801
+ else "everything up to date, except the taps above")
802
+ # Non-zero only when nothing was refreshed at all. A partial run did the job
803
+ # it could do, and failing it would put us back to one dead upstream
804
+ # breaking `boost update` for the other 79.
805
+ return 1 if failures and not results else 0
787
806
 
788
807
 
789
808
  # ── reinstall ────────────────────────────────────────────────────────────
@@ -32,11 +32,36 @@ def run(args: List[str], cwd: Optional[Path] = None, check: bool = True,
32
32
  except subprocess.TimeoutExpired:
33
33
  raise BoostError("git %s timed out after %ds" % (args[0], timeout)) from None
34
34
  if check and proc.returncode != 0:
35
- detail = (proc.stderr or proc.stdout or "").strip().splitlines()
36
- raise BoostError("git %s failed: %s" % (args[0], detail[-1] if detail else "unknown error"))
35
+ raise BoostError("git %s failed: %s"
36
+ % (args[0], _git_error(proc.stderr or proc.stdout or "")))
37
37
  return proc
38
38
 
39
39
 
40
+ def _git_error(text: str) -> str:
41
+ """Pull the one useful line out of git's multi-line failure output.
42
+
43
+ git states the cause first and then advises, so the LAST line is usually the
44
+ tail of a prose hint. A missing remote prints::
45
+
46
+ fatal: '/nope' does not appear to be a git repository
47
+ fatal: Could not read from remote repository.
48
+ <blank>
49
+ Please make sure you have the correct access rights
50
+ and the repository exists.
51
+
52
+ Taking the last line surfaced "and the repository exists." — a sentence
53
+ fragment, with the one line that names the bad path thrown away. Prefer the
54
+ first ``fatal:``/``error:`` line, which is git's own convention for the
55
+ cause, and fall back to the last non-empty line for output that has neither.
56
+ """
57
+ lines = [ln.strip() for ln in text.strip().splitlines() if ln.strip()]
58
+ for line in lines:
59
+ low = line.lower()
60
+ if low.startswith(("fatal:", "error:")):
61
+ return line
62
+ return lines[-1] if lines else "unknown error"
63
+
64
+
40
65
  # git's remote-helper transports run arbitrary commands straight from the URL
41
66
  # (notably `ext::sh -c …`), so refuse them outright — boost only ever clones
42
67
  # real http(s)/ssh/git remotes.
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
  import difflib
5
5
  from dataclasses import dataclass
6
6
  from pathlib import Path
7
- from typing import List, Optional
7
+ from typing import List, Optional, Tuple
8
8
 
9
9
  from ..errors import BoostError
10
10
  from . import config, gitutil, paths, policy, util
@@ -151,14 +151,38 @@ def remove(name: str) -> Tap:
151
151
  return tap
152
152
 
153
153
 
154
- def update(name: Optional[str] = None) -> dict:
155
- """git-pull one tap (or all). Returns {tap_name: summary}."""
154
+ def update(name: Optional[str] = None) -> Tuple[dict, dict]:
155
+ """git-pull one tap (or all). Returns ``({name: summary}, {name: error})``.
156
+
157
+ **A named tap still raises.** ``boost update sometap`` is a request about
158
+ that one tap, so its failure is the answer to the question asked.
159
+
160
+ **Across all taps it does not.** Upstream repos get deleted, renamed and
161
+ made private by people who have never heard of this machine, and one of them
162
+ used to abort the whole loop: every tap after the dead one went unrefreshed,
163
+ the ones already pulled never had their catalogs rebuilt, and the user saw a
164
+ bare git error naming neither the tap nor the URL. With 80+ taps that is a
165
+ near-certainty rather than an edge case. Collecting failures instead lets the
166
+ other 79 refresh, and lets the caller name the broken one.
167
+
168
+ This mirrors what the skill-update loop in ``cmd_update`` already does — warn
169
+ per item and carry on. The tap loop was the one place that did not.
170
+ """
156
171
  targets = [get(name)] if name else list_taps()
157
- results = {}
172
+ results: dict = {}
173
+ failures: dict = {}
158
174
  for tap in targets:
159
- if not tap.is_cloned:
160
- gitutil.clone_shallow(tap.url, tap.path)
161
- results[tap.name] = "cloned"
162
- else:
163
- results[tap.name] = gitutil.pull(tap.path)
164
- return results
175
+ try:
176
+ if not tap.is_cloned:
177
+ gitutil.clone_shallow(tap.url, tap.path)
178
+ results[tap.name] = "cloned"
179
+ else:
180
+ results[tap.name] = gitutil.pull(tap.path)
181
+ except BoostError as err:
182
+ if name:
183
+ raise
184
+ # The caller prefixes the tap name, which is the part git never
185
+ # says; git's own first line already carries the URL or path. See
186
+ # gitutil._git_error for why that line is now the one we show.
187
+ failures[tap.name] = err.message
188
+ return results, failures
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.400
3
+ Version: 1.0.401
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -293,6 +293,7 @@ docs/roadmap/items/negative-limit-inverts-log-pulse-output.md
293
293
  docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md
294
294
  docs/roadmap/items/one-command-every-env-nox.md
295
295
  docs/roadmap/items/one-commit-can-cut-two-releases.md
296
+ docs/roadmap/items/one-dead-tap-broke-every-update.md
296
297
  docs/roadmap/items/one-shared-atomic-write-helper.md
297
298
  docs/roadmap/items/package-metadata-validation-twine-check-friends.md
298
299
  docs/roadmap/items/patch-coverage-gate-diff-cover.md
@@ -0,0 +1,57 @@
1
+ ---
2
+ id: one-dead-tap-broke-every-update
3
+ board: code
4
+ section: internals
5
+ status: shipped
6
+ category: Bug
7
+ complexity: S
8
+ impact: High
9
+ wow: 4
10
+ note: found on the maintainer's own machine — 80+ taps, one deleted upstream, no updates for any of them
11
+ order: 95
12
+ owner: loop/update-survives-a-dead-tap
13
+ title: one deleted upstream stopped <code>boost update</code> for every other tap
14
+ ---
15
+ <code>registry.update()</code> looped over the configured taps with <b>no error handling at all</b>.
16
+ The first tap whose upstream had been deleted, renamed or made private raised, and everything after
17
+ it never ran: later taps went unrefreshed, the taps that <i>had</i> already pulled never had their
18
+ catalogs rebuilt, and the whole command exited non-zero.
19
+
20
+ <b>Found by accident, on real data.</b> A test escaped its sandbox and ran <code>boost update</code>
21
+ against the maintainer's actual <code>~/.boost</code>, which died on
22
+ <code>MikroJit-Technologies/claude-skills</code> — a repo that no longer exists. With 80+ taps
23
+ configured, an upstream disappearing is routine rather than an edge case, and one of them was
24
+ silently costing every other tap its updates.
25
+
26
+ <b>The error was unactionable twice over.</b> It named no tap, and it was not even a sentence:
27
+ <i>"git -C failed: and the repository exists."</i> That is the last line of git's output, and git
28
+ states the cause <i>first</i> and advises after —
29
+
30
+ <code>fatal: '/nope' does not appear to be a git repository</code> &middot;
31
+ <code>fatal: Could not read from remote repository.</code> &middot; <i>(blank)</i> &middot;
32
+ <code>Please make sure you have the correct access rights</code> &middot;
33
+ <code>and the repository exists.</code>
34
+
35
+ &mdash; so <code>detail[-1]</code> surfaced the tail of a prose hint and threw away the one line that
36
+ names the bad path. <code>gitutil._git_error</code> now prefers the first
37
+ <code>fatal:</code>/<code>error:</code> line, git's own convention for the cause, and falls back to
38
+ the last non-empty line. That improves <i>every</i> git failure boost reports, not just this one.
39
+
40
+ <b>The shape of the fix was already in the codebase.</b> The skill-update loop in
41
+ <code>cmd_update</code> has caught <code>BoostError</code> per item and carried on with a warning
42
+ for a long time; the tap loop was the one place that did not. <code>update()</code> now returns
43
+ <code>(results, failures)</code>, and a named tap — <code>boost update sometap</code> — still
44
+ raises, because asking about one tap makes its failure the answer to the question asked. Only the
45
+ all-taps path is forgiving.
46
+
47
+ <b>Exit code and wording, both deliberate.</b> A partial run returns <b>0</b>: failing it would put
48
+ us back to one dead upstream breaking the command for the other 79. But it must not print a clean
49
+ bill of health either, so the closing line becomes <i>"everything up to date, except the taps
50
+ above"</i>, and a count plus the fix (<code>boost untap &lt;name&gt;</code>) is printed. Non-zero is
51
+ reserved for the case where nothing refreshed at all. Skills belonging to a failed tap are skipped
52
+ automatically — the update pass already gates on <code>tapname not in results</code>, so a failed
53
+ tap simply never appears there.
54
+
55
+ <b>Verified by reversion</b>: the git-message test was confirmed to fail with the old
56
+ <code>detail[-1]</code> restored, reproducing <i>"git -C failed: and the repository exists."</i>
57
+ exactly.
@@ -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>213</b><span>Loop finds</span></div>
128
+ <div class="stat"><b>214</b><span>Loop finds</span></div>
129
129
  <!-- /ROADMAP:stats -->
130
130
  </div>
131
131
  </section>
@@ -3332,6 +3332,61 @@ minutes pulling real tap clones over the network before failing.</p></details>
3332
3332
  <span class="m">the only escape from the security gate was a flag the parser refused</span>
3333
3333
  </div>
3334
3334
  </article>
3335
+
3336
+ <article class="cap rcard" id="one-dead-tap-broke-every-update">
3337
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Bug</span></div>
3338
+ <h3>one deleted upstream stopped <code>boost update</code> for every other tap</h3>
3339
+ <details class="cardbody"><summary>Write-up</summary>
3340
+ <p><code>registry.update()</code> looped over the configured taps with <b>no error handling at all</b>.
3341
+ The first tap whose upstream had been deleted, renamed or made private raised, and everything after
3342
+ it never ran: later taps went unrefreshed, the taps that <i>had</i> already pulled never had their
3343
+ catalogs rebuilt, and the whole command exited non-zero.
3344
+
3345
+ <b>Found by accident, on real data.</b> A test escaped its sandbox and ran <code>boost update</code>
3346
+ against the maintainer's actual <code>~/.boost</code>, which died on
3347
+ <code>MikroJit-Technologies/claude-skills</code> — a repo that no longer exists. With 80+ taps
3348
+ configured, an upstream disappearing is routine rather than an edge case, and one of them was
3349
+ silently costing every other tap its updates.
3350
+
3351
+ <b>The error was unactionable twice over.</b> It named no tap, and it was not even a sentence:
3352
+ <i>"git -C failed: and the repository exists."</i> That is the last line of git's output, and git
3353
+ states the cause <i>first</i> and advises after —
3354
+
3355
+ <code>fatal: '/nope' does not appear to be a git repository</code> &middot;
3356
+ <code>fatal: Could not read from remote repository.</code> &middot; <i>(blank)</i> &middot;
3357
+ <code>Please make sure you have the correct access rights</code> &middot;
3358
+ <code>and the repository exists.</code>
3359
+
3360
+ &mdash; so <code>detail[-1]</code> surfaced the tail of a prose hint and threw away the one line that
3361
+ names the bad path. <code>gitutil._git_error</code> now prefers the first
3362
+ <code>fatal:</code>/<code>error:</code> line, git's own convention for the cause, and falls back to
3363
+ the last non-empty line. That improves <i>every</i> git failure boost reports, not just this one.
3364
+
3365
+ <b>The shape of the fix was already in the codebase.</b> The skill-update loop in
3366
+ <code>cmd_update</code> has caught <code>BoostError</code> per item and carried on with a warning
3367
+ for a long time; the tap loop was the one place that did not. <code>update()</code> now returns
3368
+ <code>(results, failures)</code>, and a named tap — <code>boost update sometap</code> — still
3369
+ raises, because asking about one tap makes its failure the answer to the question asked. Only the
3370
+ all-taps path is forgiving.
3371
+
3372
+ <b>Exit code and wording, both deliberate.</b> A partial run returns <b>0</b>: failing it would put
3373
+ us back to one dead upstream breaking the command for the other 79. But it must not print a clean
3374
+ bill of health either, so the closing line becomes <i>"everything up to date, except the taps
3375
+ above"</i>, and a count plus the fix (<code>boost untap &lt;name&gt;</code>) is printed. Non-zero is
3376
+ reserved for the case where nothing refreshed at all. Skills belonging to a failed tap are skipped
3377
+ automatically — the update pass already gates on <code>tapname not in results</code>, so a failed
3378
+ tap simply never appears there.
3379
+
3380
+ <b>Verified by reversion</b>: the git-message test was confirmed to fail with the old
3381
+ <code>detail[-1]</code> restored, reproducing <i>"git -C failed: and the repository exists."</i>
3382
+ exactly.</p></details>
3383
+ <div class="meta">
3384
+ <span class="m">Complexity <b>S</b></span>
3385
+ <span class="m hi">Impact <b>High</b></span>
3386
+ <span class="m">Wow <b class="wow">★★★★</b></span>
3387
+ <span class="m">found on the maintainer's own machine — 80+ taps, one deleted upstream, no updates for any of them</span>
3388
+ </div>
3389
+ </article>
3335
3390
  <!-- /ROADMAP:cards -->
3336
3391
 
3337
3392
  </div>
@@ -317,6 +317,44 @@ class TestUpdate:
317
317
  assert "fixture-tap: already up to date" in r.out
318
318
  assert "everything up to date" in r.out
319
319
 
320
+ def test_a_dead_upstream_does_not_take_the_other_taps_down(
321
+ self, boost, fixture_tap_src, tmp_path):
322
+ """One deleted upstream must cost you that tap, not the whole command.
323
+
324
+ It used to cost the whole command: `registry.update()` had no error
325
+ handling, so the loop aborted on the dead tap and every later tap went
326
+ unrefreshed — while the user got a bare git error naming neither the tap
327
+ nor the URL. With 80+ taps a dead upstream is routine, not an edge case.
328
+ """
329
+ dead = _copy_tap(fixture_tap_src, tmp_path / "dead-tap")
330
+ live = _copy_tap(fixture_tap_src, tmp_path / "live-tap")
331
+ boost("tap", dead)
332
+ boost("tap", live)
333
+ shutil.rmtree(dead) # upstream deleted out from under us
334
+
335
+ r = boost("update", expect=None)
336
+ assert "live-tap: already up to date" in r.out # the healthy tap ran
337
+ assert "dead-tap" in r.out # named, not anonymous
338
+ assert "1 of 2 taps could not be refreshed" in r.out
339
+ # and it must not claim a clean bill of health
340
+ assert "everything up to date, except the taps above" in r.out
341
+ assert r.rc == 0 # partial success is still success
342
+
343
+ def test_the_git_error_names_the_cause_not_the_hint_tail(
344
+ self, boost, fixture_tap_src, tmp_path):
345
+ """git states the cause first and advises after.
346
+
347
+ Reporting the LAST line of git's output surfaced "and the repository
348
+ exists." — the tail of a prose hint — and discarded the line naming the
349
+ missing path.
350
+ """
351
+ dead = _copy_tap(fixture_tap_src, tmp_path / "gone-tap")
352
+ boost("tap", dead)
353
+ shutil.rmtree(dead)
354
+ r = boost("update", expect=None)
355
+ assert "and the repository exists" not in r.out
356
+ assert "does not appear to be a git repository" in r.out
357
+
320
358
  def test_upgrades_unpinned_skips_pinned(self, boost, fixture_tap_src,
321
359
  tmp_path):
322
360
  tap_dir = _copy_tap(fixture_tap_src, tmp_path / "up-tap")
@@ -345,6 +383,48 @@ class TestUpdate:
345
383
  assert "upgraded" not in r.out
346
384
  assert _lock()["brainstorming"]["version"] == "1.4.0"
347
385
 
386
+ def test_taps_only_with_every_tap_dead_is_a_failure(
387
+ self, boost, fixture_tap_src, tmp_path):
388
+ """`--taps-only` must obey the same exit-code rule as the full path.
389
+
390
+ It didn't: `if args.taps_only: return 0` sat above the
391
+ `1 if failures and not results else 0` rule, so with every upstream
392
+ dead the taps-only path answered 0 while the full path answered 1.
393
+ A cron'd `boost update --taps-only` is exactly the caller that reads
394
+ nothing but the exit code — it would have slept through every tap
395
+ being gone.
396
+ """
397
+ dead = _copy_tap(fixture_tap_src, tmp_path / "only-dead-tap")
398
+ boost("tap", dead)
399
+ shutil.rmtree(dead) # upstream deleted out from under us
400
+ r = boost("update", "--taps-only", expect=None)
401
+ assert "only-dead-tap" in r.out # still named, same as the full path
402
+ assert r.rc == 1, "every tap failed and --taps-only said success"
403
+
404
+ def test_taps_only_partial_failure_is_still_success(
405
+ self, boost, fixture_tap_src, tmp_path):
406
+ # The other half of the rule: a partial run did the job it could do,
407
+ # and failing it would put us back to one dead upstream breaking
408
+ # `boost update` for the other 79.
409
+ dead = _copy_tap(fixture_tap_src, tmp_path / "half-dead-tap")
410
+ live = _copy_tap(fixture_tap_src, tmp_path / "half-live-tap")
411
+ boost("tap", dead)
412
+ boost("tap", live)
413
+ shutil.rmtree(dead)
414
+ r = boost("update", "--taps-only", expect=None)
415
+ assert "half-live-tap" in r.out
416
+ assert r.rc == 0
417
+
418
+ def test_every_tap_dead_is_a_failure_on_the_full_path_too(
419
+ self, boost, fixture_tap_src, tmp_path):
420
+ # Pins the rule itself, not just the taps-only copy of it — this is
421
+ # the assertion that keeps the two paths from drifting apart again.
422
+ dead = _copy_tap(fixture_tap_src, tmp_path / "all-dead-tap")
423
+ boost("tap", dead)
424
+ shutil.rmtree(dead)
425
+ r = boost("update", expect=None)
426
+ assert r.rc == 1
427
+
348
428
  def test_refreshes_the_completion_cache(self, boost, fixture_tap_src,
349
429
  tmp_path):
350
430
  from boost_cli.core import complete
@@ -271,13 +271,13 @@ class TestUpdate:
271
271
  origin = _make_repo(tmp_path / "pullme")
272
272
  tap = registry.add(str(origin))
273
273
  util.rmtree(tap.path)
274
- assert registry.update("pullme") == {"pullme": "cloned"}
274
+ assert registry.update("pullme") == ({"pullme": "cloned"}, {})
275
275
  assert tap.is_cloned
276
276
 
277
277
  def test_update_already_up_to_date(self, sandbox, tmp_path):
278
278
  origin = _make_repo(tmp_path / "pullme")
279
279
  registry.add(str(origin))
280
- assert registry.update() == {"pullme": "already up to date"}
280
+ assert registry.update() == ({"pullme": "already up to date"}, {})
281
281
 
282
282
  def test_update_pulls_new_commit(self, sandbox, tmp_path):
283
283
  origin = _make_repo(tmp_path / "pullme")
@@ -286,7 +286,7 @@ class TestUpdate:
286
286
  (origin / "b.txt").write_text("two\n", encoding="utf-8")
287
287
  _git("add", "-A", cwd=origin)
288
288
  _git("commit", "-qm", "add b", cwd=origin)
289
- summary = registry.update("pullme")["pullme"]
289
+ summary = registry.update("pullme")[0]["pullme"]
290
290
  after = gitutil.head_commit(tap.path)
291
291
  assert re.fullmatch(r"[0-9a-f]{7} → [0-9a-f]{7}", summary)
292
292
  assert summary == "%s → %s" % (before[:7], after[:7])
@@ -295,3 +295,56 @@ class TestUpdate:
295
295
  def test_update_unknown_tap_raises(self, sandbox):
296
296
  with pytest.raises(BoostError):
297
297
  registry.update("nope")
298
+
299
+ def test_one_dead_upstream_does_not_stop_the_others(self, sandbox, tmp_path):
300
+ """The regression: `update()` had no error handling, so the first tap
301
+ with a deleted upstream aborted the loop and every later tap went
302
+ unrefreshed — with the successful pulls thrown away unreported.
303
+ """
304
+ dead_origin = _make_repo(tmp_path / "deadtap")
305
+ registry.add(str(dead_origin))
306
+ live_origin = _make_repo(tmp_path / "livetap")
307
+ registry.add(str(live_origin))
308
+ util.rmtree(dead_origin) # upstream deleted out from under us
309
+
310
+ results, failures = registry.update()
311
+ assert "livetap" in results # the healthy tap still refreshed
312
+ assert "deadtap" not in results # and is not reported as a success
313
+ assert "deadtap" in failures
314
+ assert failures["deadtap"] # carries a reason, not an empty string
315
+
316
+ def test_a_named_dead_tap_still_raises(self, sandbox, tmp_path):
317
+ """Asking about one tap makes its failure the answer, not a warning."""
318
+ origin = _make_repo(tmp_path / "solo")
319
+ registry.add(str(origin))
320
+ util.rmtree(origin)
321
+ with pytest.raises(BoostError):
322
+ registry.update("solo")
323
+
324
+
325
+ class TestGitErrorLine:
326
+ """gitutil._git_error — git states the cause first, then advises."""
327
+
328
+ def test_prefers_the_first_fatal_line_over_the_hint_tail(self):
329
+ # Real `git fetch` output for a missing remote. The last line is the
330
+ # tail of a prose hint; the first names the bad path.
331
+ text = ("fatal: '/nope' does not appear to be a git repository\n"
332
+ "fatal: Could not read from remote repository.\n"
333
+ "\n"
334
+ "Please make sure you have the correct access rights\n"
335
+ "and the repository exists.\n")
336
+ assert gitutil._git_error(text) == (
337
+ "fatal: '/nope' does not appear to be a git repository")
338
+
339
+ def test_error_prefix_counts_too(self):
340
+ assert gitutil._git_error("error: pathspec 'x' did not match\ntrailing\n") == (
341
+ "error: pathspec 'x' did not match")
342
+
343
+ def test_falls_back_to_last_line_without_a_marker(self):
344
+ assert gitutil._git_error("something odd\nlast word\n") == "last word"
345
+
346
+ def test_blank_output_is_named_rather_than_empty(self):
347
+ assert gitutil._git_error(" \n\n") == "unknown error"
348
+
349
+ def test_skips_blank_lines_when_falling_back(self):
350
+ assert gitutil._git_error("only line\n\n\n") == "only line"