boost-skill-cli 1.0.231__tar.gz → 1.0.232__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 (483) hide show
  1. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/configuration.py +40 -4
  4. boost_skill_cli-1.0.232/boost_cli/core/selfupdate.py +138 -0
  5. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  6. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
  7. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/commands.html +7 -3
  8. boost_skill_cli-1.0.232/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +31 -0
  9. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap.html +11 -2
  10. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_configuration.py +101 -5
  11. boost_skill_cli-1.0.232/tests/unit/test_selfupdate.py +265 -0
  12. boost_skill_cli-1.0.231/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -22
  13. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.gitattributes +0 -0
  14. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.gitignore +0 -0
  15. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.gitleaks.toml +0 -0
  16. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.htmlvalidate.json +0 -0
  17. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.lighthouserc.json +0 -0
  18. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.lycheeignore +0 -0
  19. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.markdownlint-cli2.jsonc +0 -0
  20. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.pre-commit-config.yaml +0 -0
  21. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.stylelintrc.json +0 -0
  22. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.vale/styles/boost/Terminology.yml +0 -0
  23. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  24. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.vale.ini +0 -0
  25. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/CLAUDE.md +0 -0
  26. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/CONTRIBUTING.md +0 -0
  27. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/LICENSE +0 -0
  28. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/MANIFEST.in +0 -0
  29. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/Makefile +0 -0
  30. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/README.md +0 -0
  31. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/SECURITY.md +0 -0
  32. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost +0 -0
  33. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/__init__.py +0 -0
  34. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/__main__.py +0 -0
  35. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/cli.py +0 -0
  36. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/cliparse.py +0 -0
  37. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/__init__.py +0 -0
  38. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/_common.py +0 -0
  39. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/bmad.py +0 -0
  40. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/discovery.py +0 -0
  41. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/hooks.py +0 -0
  42. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/info.py +0 -0
  43. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/intelligence.py +0 -0
  44. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/pkg.py +0 -0
  45. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/quality.py +0 -0
  46. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/run.py +0 -0
  47. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/safety.py +0 -0
  48. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/taps.py +0 -0
  49. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/team.py +0 -0
  50. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/__init__.py +0 -0
  51. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/adapters.py +0 -0
  52. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/agents.py +0 -0
  53. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/ai.py +0 -0
  54. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/capabilities.py +0 -0
  55. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/catalog.py +0 -0
  56. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/claude_settings.py +0 -0
  57. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/config.py +0 -0
  58. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/dense.py +0 -0
  59. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/ed25519.py +0 -0
  60. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/embed.py +0 -0
  61. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/faithfulness.py +0 -0
  62. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/frontmatter.py +0 -0
  63. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/gitutil.py +0 -0
  64. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/imperative.py +0 -0
  65. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/injectscan.py +0 -0
  66. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/integrity.py +0 -0
  67. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/journal.py +0 -0
  68. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/lockfile.py +0 -0
  69. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/logs.py +0 -0
  70. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/mcp.py +0 -0
  71. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/mcpdecl.py +0 -0
  72. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/minisign.py +0 -0
  73. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/nethttp.py +0 -0
  74. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/output.py +0 -0
  75. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/paths.py +0 -0
  76. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/policy.py +0 -0
  77. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/projectlock.py +0 -0
  78. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/provenance.py +0 -0
  79. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/rag.py +0 -0
  80. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/registry.py +0 -0
  81. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/resolve.py +0 -0
  82. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/rules.py +0 -0
  83. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/scopes.py +0 -0
  84. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/secretscan.py +0 -0
  85. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/serve.py +0 -0
  86. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/stackprobe.py +0 -0
  87. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/staleness.py +0 -0
  88. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/store.py +0 -0
  89. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/trustaudit.py +0 -0
  90. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/typosquat.py +0 -0
  91. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/updatediff.py +0 -0
  92. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/util.py +0 -0
  93. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/workflows.py +0 -0
  94. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/data/registries.json +0 -0
  95. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/errors.py +0 -0
  96. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/spin.py +0 -0
  97. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  98. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  99. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_skill_cli.egg-info/requires.txt +0 -0
  100. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_skill_cli.egg-info/top_level.txt +0 -0
  101. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/codecov.yml +0 -0
  102. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/.claude/settings.local.json +0 -0
  103. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/DEBUGGING.md +0 -0
  104. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/adapters.html +0 -0
  105. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/gifs/distill.gif +0 -0
  106. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/gifs/doctor.gif +0 -0
  107. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/gifs/explain.gif +0 -0
  108. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/gifs/hooks.gif +0 -0
  109. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/gifs/install.gif +0 -0
  110. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/gifs/pulse.gif +0 -0
  111. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/gifs/search.gif +0 -0
  112. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/gifs/tap.gif +0 -0
  113. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/tapes/distill.tape +0 -0
  114. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/tapes/doctor.tape +0 -0
  115. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/tapes/explain.tape +0 -0
  116. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/tapes/hooks.tape +0 -0
  117. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/tapes/install.tape +0 -0
  118. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/tapes/pulse.tape +0 -0
  119. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/tapes/search.tape +0 -0
  120. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/tapes/tap.tape +0 -0
  121. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel.html +0 -0
  122. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/demo.gif +0 -0
  123. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/demo.tape +0 -0
  124. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/design-roadmap.html +0 -0
  125. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/eval.html +0 -0
  126. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/index.html +0 -0
  127. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/mcp-hub.html +0 -0
  128. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/rag-architecture.md +0 -0
  129. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D01.md +0 -0
  130. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D02.md +0 -0
  131. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D03.md +0 -0
  132. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D04.md +0 -0
  133. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D05.md +0 -0
  134. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D06.md +0 -0
  135. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D07.md +0 -0
  136. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D08.md +0 -0
  137. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D09.md +0 -0
  138. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D10.md +0 -0
  139. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D11.md +0 -0
  140. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D12.md +0 -0
  141. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D13.md +0 -0
  142. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D14.md +0 -0
  143. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D15.md +0 -0
  144. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D16.md +0 -0
  145. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D17.md +0 -0
  146. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D18.md +0 -0
  147. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D19.md +0 -0
  148. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D20.md +0 -0
  149. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D21.md +0 -0
  150. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D22.md +0 -0
  151. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D23.md +0 -0
  152. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D24.md +0 -0
  153. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D25.md +0 -0
  154. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D26.md +0 -0
  155. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  156. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  157. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  158. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  159. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  160. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  161. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  162. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  163. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  164. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  165. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  166. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  167. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  168. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  169. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  170. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/command-carousel-page.md +0 -0
  171. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  172. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  173. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  174. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  175. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  176. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  177. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  178. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  179. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  180. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  181. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  182. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  183. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  184. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  185. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  186. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  187. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  188. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  189. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  190. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  191. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  192. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  193. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  194. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/github-community-health-files.md +0 -0
  195. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  196. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  197. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  198. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  199. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  200. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  201. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  202. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  203. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  204. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  205. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  206. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  207. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  208. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  209. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  210. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  211. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  212. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  213. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  214. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  215. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  216. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  217. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  218. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  219. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  220. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  221. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  222. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  223. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  224. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  225. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  226. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  227. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  228. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  229. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  230. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  231. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  232. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  233. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  234. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  235. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  236. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  237. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  238. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  239. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  240. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  241. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  242. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  243. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  244. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  245. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  246. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  247. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  248. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  249. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  250. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  251. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  252. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  253. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  254. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  255. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  256. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  257. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  258. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  259. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  260. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  261. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  262. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  263. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  264. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  265. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  266. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  267. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  268. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  269. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  270. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  271. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  272. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  273. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  274. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  275. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  276. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  277. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  278. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  279. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  280. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  281. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  282. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  283. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  284. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  285. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  286. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  287. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  288. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  289. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  290. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  291. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  292. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  293. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  294. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  295. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  296. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  297. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  298. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  299. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  300. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  301. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/workspace-scope-install.md +0 -0
  302. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/eslint.config.mjs +0 -0
  303. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/examples/README.md +0 -0
  304. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/examples/adapt-demo.sh +0 -0
  305. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/examples/boost-run-prototype.sh +0 -0
  306. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/index.html +0 -0
  307. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/noxfile.py +0 -0
  308. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/pyproject.toml +0 -0
  309. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/requirements/coverage-tools.in +0 -0
  310. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/requirements/coverage-tools.txt +0 -0
  311. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/requirements/lint-tools.in +0 -0
  312. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/requirements/lint-tools.txt +0 -0
  313. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/requirements/mutation-tools.in +0 -0
  314. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/requirements/mutation-tools.txt +0 -0
  315. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/requirements/release-tools.in +0 -0
  316. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/requirements/release-tools.txt +0 -0
  317. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/requirements/test-tools.in +0 -0
  318. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/requirements/test-tools.txt +0 -0
  319. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/a11y_check.py +0 -0
  320. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/bench_cli.sh +0 -0
  321. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/build_command_reference.py +0 -0
  322. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/build_registries.py +0 -0
  323. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/build_roadmap.py +0 -0
  324. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/check_anchors.py +0 -0
  325. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/check_required_checks.py +0 -0
  326. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/ensure_eval_corpus.sh +0 -0
  327. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/eval_explain.py +0 -0
  328. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/eval_recommend.py +0 -0
  329. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/eval_retrieval.py +0 -0
  330. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/eval_stats_summary.py +0 -0
  331. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/import_budget.py +0 -0
  332. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/lock_toolchain.py +0 -0
  333. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/mutation_gate.py +0 -0
  334. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/perf_gate.py +0 -0
  335. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/post_deploy_smoke.py +0 -0
  336. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/release_preflight.py +0 -0
  337. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/setup.cfg +0 -0
  338. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/sonar-project.properties +0 -0
  339. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/style/README.md +0 -0
  340. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/style/boost.css +0 -0
  341. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/style/boost.js +0 -0
  342. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/style/demo.html +0 -0
  343. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/adapt.feature +0 -0
  344. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/browse.feature +0 -0
  345. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/count.feature +0 -0
  346. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/discover.feature +0 -0
  347. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/doctor.feature +0 -0
  348. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/environment.py +0 -0
  349. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/explain.feature +0 -0
  350. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/index.feature +0 -0
  351. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/install.feature +0 -0
  352. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/list.feature +0 -0
  353. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/mcp.feature +0 -0
  354. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/search.feature +0 -0
  355. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/steps/cli_steps.py +0 -0
  356. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/steps/discovery_steps.py +0 -0
  357. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/steps/mcp_steps.py +0 -0
  358. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/steps/quality_steps.py +0 -0
  359. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/conftest.py +0 -0
  360. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/eval/baseline.json +0 -0
  361. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/eval/explain.jsonl +0 -0
  362. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/eval/golden.jsonl +0 -0
  363. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/eval/recommend.jsonl +0 -0
  364. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/eval/taps.txt +0 -0
  365. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_capabilities_policy.py +0 -0
  366. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_adapt.py +0 -0
  367. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_bmad.py +0 -0
  368. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_discovery.py +0 -0
  369. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_hooks.py +0 -0
  370. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_info.py +0 -0
  371. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_intelligence.py +0 -0
  372. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_pkg.py +0 -0
  373. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_quality.py +0 -0
  374. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_taps.py +0 -0
  375. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_team.py +0 -0
  376. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_everyday_loop.py +0 -0
  377. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_integrity_enforce.py +0 -0
  378. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_property_parsers.py +0 -0
  379. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_run.py +0 -0
  380. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_tap_signing.py +0 -0
  381. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_workspace_scope.py +0 -0
  382. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/README.md +0 -0
  383. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  384. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  385. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  386. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  387. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  388. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  389. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  390. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  391. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  392. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  393. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  394. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  395. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  396. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  397. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  398. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  399. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  400. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  401. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  402. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  403. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/fuzz_frontmatter.py +0 -0
  404. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/fuzz_registry.py +0 -0
  405. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/make_fixture.py +0 -0
  406. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/perf/test_benchmarks.py +0 -0
  407. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/smoke.sh +0 -0
  408. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_a11y_check.py +0 -0
  409. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_adapters.py +0 -0
  410. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_adapters_multi.py +0 -0
  411. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_adapters_runner.py +0 -0
  412. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_agents.py +0 -0
  413. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_ai.py +0 -0
  414. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_capabilities.py +0 -0
  415. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_catalog.py +0 -0
  416. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_check_anchors.py +0 -0
  417. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_claude_settings.py +0 -0
  418. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_cliparse.py +0 -0
  419. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_command_reference_fresh.py +0 -0
  420. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_config.py +0 -0
  421. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_dense.py +0 -0
  422. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_dense_fallback.py +0 -0
  423. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_docs_pages_linked.py +0 -0
  424. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_docsite_chrome.py +0 -0
  425. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_ed25519.py +0 -0
  426. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_embed.py +0 -0
  427. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_errors_and_cli_table.py +0 -0
  428. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_eval_stats_summary.py +0 -0
  429. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_faithfulness.py +0 -0
  430. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_frontmatter.py +0 -0
  431. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_fuzz_targets.py +0 -0
  432. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_gitleaks_config.py +0 -0
  433. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_gitutil.py +0 -0
  434. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_imperative.py +0 -0
  435. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_import_budget.py +0 -0
  436. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_injectscan.py +0 -0
  437. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_integrity.py +0 -0
  438. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_journal.py +0 -0
  439. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_lockfile.py +0 -0
  440. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_logs.py +0 -0
  441. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_marketing_counts.py +0 -0
  442. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_mcp.py +0 -0
  443. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_mcpdecl.py +0 -0
  444. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_minisign.py +0 -0
  445. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_mutation_hardening.py +0 -0
  446. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_nethttp.py +0 -0
  447. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_output.py +0 -0
  448. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_paths.py +0 -0
  449. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_perf_gate.py +0 -0
  450. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_pkg_confusions.py +0 -0
  451. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_pkg_injection.py +0 -0
  452. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_pkg_secrets.py +0 -0
  453. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_policy.py +0 -0
  454. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_post_deploy_smoke.py +0 -0
  455. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_projectlock.py +0 -0
  456. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_provenance.py +0 -0
  457. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_rag.py +0 -0
  458. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_registries_fresh.py +0 -0
  459. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_registry.py +0 -0
  460. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_release_preflight.py +0 -0
  461. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_required_checks.py +0 -0
  462. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_resolve.py +0 -0
  463. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_roadmap_fresh.py +0 -0
  464. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_rules.py +0 -0
  465. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_scopes.py +0 -0
  466. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_secretscan.py +0 -0
  467. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_serve.py +0 -0
  468. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_spin.py +0 -0
  469. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_stackprobe.py +0 -0
  470. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_staleness.py +0 -0
  471. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_store.py +0 -0
  472. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_token_parity.py +0 -0
  473. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_toolchain_lock.py +0 -0
  474. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_trustaudit.py +0 -0
  475. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_typosquat.py +0 -0
  476. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_updatediff.py +0 -0
  477. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_util.py +0 -0
  478. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_version.py +0 -0
  479. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_workflows.py +0 -0
  480. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/visual/a11y_check.mjs +0 -0
  481. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/visual/console_check.mjs +0 -0
  482. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/visual/package.json +0 -0
  483. {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/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.231
3
+ Version: 1.0.232
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.231'
22
- __version_tuple__ = version_tuple = (1, 0, 231)
21
+ __version__ = version = '1.0.232'
22
+ __version_tuple__ = version_tuple = (1, 0, 232)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -26,6 +26,7 @@ from ..core import (
26
26
  policy,
27
27
  rag,
28
28
  registry,
29
+ selfupdate,
29
30
  serve,
30
31
  store,
31
32
  util,
@@ -1004,12 +1005,47 @@ def cmd_self_update(argv) -> int:
1004
1005
  p = cliparse.parser(
1005
1006
  prog="boost self-update",
1006
1007
  description="Update boost itself to the latest version")
1007
- p.parse_args(argv)
1008
+ p.add_argument("--dry-run", action="store_true",
1009
+ help="show how boost would update itself, change nothing")
1010
+ args = p.parse_args(argv)
1011
+
1012
+ method = selfupdate.detect()
1013
+ if method != selfupdate.GIT:
1014
+ return _self_update_package(method, dry_run=args.dry_run)
1015
+ return _self_update_git(dry_run=args.dry_run)
1016
+
1017
+
1018
+ def _self_update_package(method: str, dry_run: bool) -> int:
1019
+ """Upgrade a pip / pipx / uv-tool install by driving its own manager."""
1020
+ old = __version__
1021
+ cmd = selfupdate.upgrade_command(method) # errors if the manager is gone
1022
+ if dry_run:
1023
+ out.info("installed with: %s" % method)
1024
+ out.info("would run: %s" % " ".join(cmd))
1025
+ return 0
1026
+ out.info("updating via %s: %s" % (method, " ".join(cmd)))
1027
+ selfupdate.run_upgrade(cmd)
1028
+ # This process imported its version before the upgrade, so ask a fresh one.
1029
+ new = selfupdate.observed_version()
1030
+ journal.log("self-update", new or old, previous=old, method=method)
1031
+ if new and new != old:
1032
+ out.ok("boost v%s → v%s" % (old, new))
1033
+ elif new:
1034
+ out.ok("already up to date (v%s)" % new)
1035
+ else:
1036
+ # The upgrade succeeded but we never saw a version — say exactly that
1037
+ # rather than claim one.
1038
+ out.ok("upgraded via %s; run `boost --version` to confirm" % method)
1039
+ return 0
1040
+
1008
1041
 
1042
+ def _self_update_git(dry_run: bool) -> int:
1043
+ """Fast-forward the source checkout boost is running from."""
1009
1044
  root = paths.repo_root()
1010
- if not gitutil.is_repo(root):
1011
- raise BoostError("boost is not running from a git checkout",
1012
- hint="git clone the boost repo and symlink bin")
1045
+ if dry_run:
1046
+ out.info("installed with: git checkout (%s)" % _tilde(root))
1047
+ out.info("would run: git -C %s pull --ff-only" % root)
1048
+ return 0
1013
1049
  old = __version__
1014
1050
  before = gitutil.head_commit(root)
1015
1051
  gitutil.run(["-C", str(root), "pull", "--ff-only"], timeout=120)
@@ -0,0 +1,138 @@
1
+ """How this boost was installed, and the command that upgrades it in place.
2
+
3
+ `boost self-update` assumed a git checkout and told everyone else to abandon
4
+ their install method — but the documented way in is `pipx install
5
+ boost-skill-cli` or `pip install boost-skill-cli`, where the package lives in
6
+ site-packages and there is nothing to `git pull`. This resolves the install
7
+ method from evidence on disk and hands the command layer the exact argv that
8
+ upgrades *this* copy.
9
+ """
10
+ from __future__ import annotations
11
+
12
+ import re
13
+ import shutil
14
+ import subprocess
15
+ import sys
16
+ from pathlib import Path
17
+ from typing import List, Optional
18
+
19
+ from ..errors import BoostError
20
+ from . import gitutil, paths
21
+
22
+ DIST = "boost-skill-cli"
23
+
24
+ GIT = "git"
25
+ PIPX = "pipx"
26
+ UV_TOOL = "uv-tool"
27
+ PIP = "pip"
28
+ UNKNOWN = "unknown"
29
+
30
+ # `boost --version` prints "boost <version>"; anything else means we did not
31
+ # actually observe a version and must not report one.
32
+ _VERSION_LINE = re.compile(r"^boost\s+(\S+)$", re.MULTILINE)
33
+
34
+
35
+ def installed_version() -> Optional[str]:
36
+ """Version recorded in installed package metadata, or None.
37
+
38
+ None is the useful answer, not a failure: it means no Python package
39
+ manager has a record of this boost, so none of them can upgrade it.
40
+ """
41
+ try:
42
+ from importlib.metadata import version
43
+ return version(DIST)
44
+ except Exception:
45
+ return None
46
+
47
+
48
+ def detect(root: Optional[Path] = None, prefix: Optional[Path] = None,
49
+ metadata_version=None) -> str:
50
+ """Resolve how this boost was installed.
51
+
52
+ Order matters. A source checkout wins first — that includes `pip install
53
+ -e .`, where the package metadata exists too but `git pull` is what the
54
+ user means. Then the two managers that own a private venv and leave a
55
+ receipt inside it. Then plain pip, but only if pip actually has a record
56
+ of the distribution: telling someone to `pip install --upgrade` a boost
57
+ that pip never installed sends them chasing a package that isn't there.
58
+ """
59
+ root = paths.repo_root() if root is None else Path(root)
60
+ if gitutil.is_repo(root):
61
+ return GIT
62
+ prefix = Path(sys.prefix) if prefix is None else Path(prefix)
63
+ if (prefix / "pipx_metadata.json").is_file():
64
+ return PIPX
65
+ if (prefix / "uv-receipt.toml").is_file():
66
+ return UV_TOOL
67
+ # Resolved here, not as a default argument: a default binds the function
68
+ # object once at import, which silently defeats every attempt to swap it —
69
+ # including a test's, which is how a test of the "nothing installed this"
70
+ # branch ended up running a real `pip install` against PyPI.
71
+ lookup = installed_version if metadata_version is None else metadata_version
72
+ return PIP if lookup() else UNKNOWN
73
+
74
+
75
+ def _require(tool: str) -> str:
76
+ """Absolute path to `tool`, or a BoostError naming what is missing.
77
+
78
+ Falling back to another manager here would upgrade a different copy of
79
+ boost — or none at all — while reporting success.
80
+ """
81
+ found = shutil.which(tool)
82
+ if not found:
83
+ raise BoostError(
84
+ "boost was installed with %s, but %s is not on PATH" % (tool, tool),
85
+ hint="install %s, or upgrade manually with `%s upgrade %s`"
86
+ % (tool, tool, DIST))
87
+ return found
88
+
89
+
90
+ def upgrade_command(method: str) -> List[str]:
91
+ """The argv that upgrades boost for `method`."""
92
+ if method == PIPX:
93
+ return [_require("pipx"), "upgrade", DIST]
94
+ if method == UV_TOOL:
95
+ return [_require("uv"), "tool", "upgrade", DIST]
96
+ if method == PIP:
97
+ # sys.executable, never a bare `pip`: the pip first on PATH can belong
98
+ # to a different interpreter than the one running boost, and upgrading
99
+ # that one leaves this install exactly where it was while printing
100
+ # every sign of success.
101
+ return [sys.executable, "-m", "pip", "install", "--upgrade", DIST]
102
+ raise BoostError(
103
+ "cannot work out how boost was installed, so it cannot update itself",
104
+ hint="upgrade with your package manager, e.g. `pipx upgrade %s`" % DIST)
105
+
106
+
107
+ def run_upgrade(cmd: List[str], timeout: float = 300.0):
108
+ """Run the upgrade, raising BoostError with the manager's own last words."""
109
+ try:
110
+ proc = subprocess.run(cmd, capture_output=True, text=True,
111
+ timeout=timeout)
112
+ except (OSError, subprocess.SubprocessError) as err:
113
+ raise BoostError("could not run %s" % " ".join(cmd),
114
+ hint=str(err)) from err
115
+ if proc.returncode != 0:
116
+ detail = ((proc.stderr or "") + (proc.stdout or "")).strip().splitlines()
117
+ raise BoostError(
118
+ "upgrade failed (%s exited %d)" % (Path(cmd[0]).name, proc.returncode),
119
+ hint=detail[-1] if detail else "re-run the command by hand to see why")
120
+ return proc
121
+
122
+
123
+ def observed_version(timeout: float = 30.0) -> Optional[str]:
124
+ """Ask a freshly-spawned boost what version it is now, or None.
125
+
126
+ This process imported its own version before the upgrade ran, so it cannot
127
+ answer the question. None means "we did not see one" — better to say
128
+ nothing than to report a version we never observed.
129
+ """
130
+ try:
131
+ proc = subprocess.run([str(paths.launcher()), "--version"],
132
+ capture_output=True, text=True, timeout=timeout)
133
+ except (OSError, subprocess.SubprocessError):
134
+ return None
135
+ if proc.returncode != 0:
136
+ return None
137
+ match = _VERSION_LINE.search(proc.stdout or "")
138
+ return match.group(1) if match else None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.231
3
+ Version: 1.0.232
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -81,6 +81,7 @@ boost_cli/core/resolve.py
81
81
  boost_cli/core/rules.py
82
82
  boost_cli/core/scopes.py
83
83
  boost_cli/core/secretscan.py
84
+ boost_cli/core/selfupdate.py
84
85
  boost_cli/core/serve.py
85
86
  boost_cli/core/stackprobe.py
86
87
  boost_cli/core/staleness.py
@@ -460,6 +461,7 @@ tests/unit/test_roadmap_fresh.py
460
461
  tests/unit/test_rules.py
461
462
  tests/unit/test_scopes.py
462
463
  tests/unit/test_secretscan.py
464
+ tests/unit/test_selfupdate.py
463
465
  tests/unit/test_serve.py
464
466
  tests/unit/test_spin.py
465
467
  tests/unit/test_stackprobe.py
@@ -188,7 +188,7 @@
188
188
  <a class="cmd-link" href="#cmd-mcp" data-search="mcp register boost as an mcp server for claude code --stdio {register,unregister}">mcp</a>
189
189
  <a class="cmd-link" href="#cmd-hooks" data-search="hooks manage claude code hooks (scope-aware) in settings.json -c, --command command -n, --name name -s, --scope {global,project} -m, --matcher matcher --timeout timeout {add,remove,list} event">hooks</a>
190
190
  <a class="cmd-link" href="#cmd-bmad" data-search="bmad install &amp; manage the bmad method (scope-aware, toggleable) -s, --scope {project,global} --modules modules -y, --yes --startup {install,init,startup,orient,uninstall,disable,enable,doctor,status} value">bmad</a>
191
- <a class="cmd-link" href="#cmd-self-update" data-search="self-update update boost itself to the latest version ">self-update</a>
191
+ <a class="cmd-link" href="#cmd-self-update" data-search="self-update update boost itself to the latest version --dry-run">self-update</a>
192
192
  </div>
193
193
  <div class="group" data-group="team">
194
194
  <div class="group-h">Team &amp; sharing</div>
@@ -1083,10 +1083,14 @@
1083
1083
  <div class="arg"><code>--startup</code><span>enable the startup toggle right after install</span></div>
1084
1084
  </div>
1085
1085
  </section>
1086
- <section class="cmd" id="cmd-self-update" data-search="self-update update boost itself to the latest version ">
1086
+ <section class="cmd" id="cmd-self-update" data-search="self-update update boost itself to the latest version --dry-run">
1087
1087
  <h3><span class="cname">self-update</span><span class="gtag">cfg</span></h3>
1088
1088
  <p class="summary">Update boost itself to the latest version</p>
1089
- <pre class="syn">boost self-update</pre>
1089
+ <pre class="syn">boost self-update [--dry-run]</pre>
1090
+ <div class="args-h">Options</div>
1091
+ <div class="args">
1092
+ <div class="arg"><code>--dry-run</code><span>show how boost would update itself, change nothing</span></div>
1093
+ </div>
1090
1094
  </section>
1091
1095
  <h2 class="group-h" id="grp-team">Team &amp; sharing</h2>
1092
1096
  <section class="cmd" id="cmd-cohort" data-search="cohort controlled skill rollouts &amp; team a/b testing --skills skills --percent percent --json {list,create,delete,status,apply} name">
@@ -0,0 +1,31 @@
1
+ ---
2
+ id: self-update-broken-for-pip-pipx-installs
3
+ board: code
4
+ section: compat
5
+ status: shipped
6
+ category: Bug
7
+ complexity: M
8
+ impact: High
9
+ wow: 3
10
+ note:
11
+ order: 10
12
+ owner: loop/self-update
13
+ pr: 272
14
+ title: <code>self-update</code> is non-functional for pip/pipx installs
15
+ ---
16
+ <code>boost self-update</code> only works when boost runs from a git checkout: <code>paths.repo_root()</code>
17
+ resolves inside <code>site-packages</code> for a pip/pipx install, <code>gitutil.is_repo()</code> is
18
+ False, and <code>cmd_self_update</code> raises "boost is not running from a git checkout" with a hint
19
+ to clone the repo — telling a normal PyPI user to abandon their install method. Detect the install
20
+ method and shell out to <code>pip install --upgrade boost-skill-cli</code> /
21
+ <code>pipx upgrade boost-skill-cli</code>, falling back to the git-pull path only for source
22
+ checkouts. Shipped as <code>core/selfupdate.py</code>: detection reads evidence on disk —
23
+ <code>.git</code>, then <code>pipx_metadata.json</code> or <code>uv-receipt.toml</code> in
24
+ <code>sys.prefix</code>, then installed package metadata — and a <code>--dry-run</code> flag
25
+ prints the exact command without running it. Two details carry the weight: the pip branch
26
+ invokes <code>sys.executable -m pip</code>, never a bare <code>pip</code>, because the pip
27
+ first on PATH can belong to another interpreter and would upgrade a different copy while
28
+ reporting success; and an install nothing has a record of reports that plainly instead of
29
+ guessing pip. The new version is read from a freshly spawned <code>boost --version</code>,
30
+ since the running process imported its own version before the upgrade — if that probe says
31
+ nothing, neither does boost.
@@ -2828,7 +2828,7 @@ same nav and footer as every other page.</p>
2828
2828
  </article>
2829
2829
 
2830
2830
  <article class="cap rcard" id="self-update-broken-for-pip-pipx-installs">
2831
- <div class="head"><span class="pill planned">Planned</span><span class="cat">Bug</span></div>
2831
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Bug</span></div>
2832
2832
  <h3><code>self-update</code> is non-functional for pip/pipx installs</h3>
2833
2833
  <p><code>boost self-update</code> only works when boost runs from a git checkout: <code>paths.repo_root()</code>
2834
2834
  resolves inside <code>site-packages</code> for a pip/pipx install, <code>gitutil.is_repo()</code> is
@@ -2836,7 +2836,16 @@ False, and <code>cmd_self_update</code> raises "boost is not running from a git
2836
2836
  to clone the repo — telling a normal PyPI user to abandon their install method. Detect the install
2837
2837
  method and shell out to <code>pip install --upgrade boost-skill-cli</code> /
2838
2838
  <code>pipx upgrade boost-skill-cli</code>, falling back to the git-pull path only for source
2839
- checkouts.</p>
2839
+ checkouts. Shipped as <code>core/selfupdate.py</code>: detection reads evidence on disk —
2840
+ <code>.git</code>, then <code>pipx_metadata.json</code> or <code>uv-receipt.toml</code> in
2841
+ <code>sys.prefix</code>, then installed package metadata — and a <code>--dry-run</code> flag
2842
+ prints the exact command without running it. Two details carry the weight: the pip branch
2843
+ invokes <code>sys.executable -m pip</code>, never a bare <code>pip</code>, because the pip
2844
+ first on PATH can belong to another interpreter and would upgrade a different copy while
2845
+ reporting success; and an install nothing has a record of reports that plainly instead of
2846
+ guessing pip. The new version is read from a freshly spawned <code>boost --version</code>,
2847
+ since the running process imported its own version before the upgrade — if that probe says
2848
+ nothing, neither does boost.</p>
2840
2849
  <div class="meta">
2841
2850
  <span class="m">Complexity <b>M</b></span>
2842
2851
  <span class="m hi">Impact <b>High</b></span>
@@ -20,6 +20,7 @@ import urllib.request
20
20
  import pytest
21
21
 
22
22
  from boost_cli.core import frontmatter, journal, paths, policy, util
23
+ from boost_cli.errors import BoostError
23
24
 
24
25
 
25
26
  def _git(cwd, *args):
@@ -846,13 +847,108 @@ class TestMcp:
846
847
  # ---------------------------------------------------------------- self-update
847
848
 
848
849
  class TestSelfUpdate:
849
- def test_non_git_checkout_fails_with_hint(self, boost, sandbox, monkeypatch):
850
- # repo_root() normally resolves to the real boost checkout (a git
851
- # repo, both locally and in CI); point it at the sandbox instead
850
+ def _not_a_checkout(self, monkeypatch, sandbox):
851
+ """repo_root() normally resolves to the real boost checkout (a git repo
852
+ both locally and in CI) — point it at the sandbox so the pip/pipx paths
853
+ are reachable, and make a real upgrade impossible.
854
+
855
+ The second half is not paranoia: while these tests were being written,
856
+ a detection bug sent one of them down the pip branch for real, and it
857
+ installed boost-skill-cli from PyPI over the editable checkout. A test
858
+ must not be one bad branch away from mutating the machine.
859
+ """
852
860
  monkeypatch.setattr("boost_cli.core.paths.repo_root", lambda: sandbox)
861
+
862
+ def never(cmd, **kw):
863
+ raise AssertionError("this test must not run an upgrade: %s" % cmd)
864
+ monkeypatch.setattr("boost_cli.core.selfupdate.run_upgrade", never)
865
+
866
+ def _pipx_install(self, monkeypatch, sandbox):
867
+ self._not_a_checkout(monkeypatch, sandbox)
868
+ prefix = sandbox / "pipx" / "venvs" / "boost-skill-cli"
869
+ prefix.mkdir(parents=True)
870
+ (prefix / "pipx_metadata.json").write_text("{}", encoding="utf-8")
871
+ monkeypatch.setattr("sys.prefix", str(prefix))
872
+ monkeypatch.setattr("boost_cli.core.selfupdate.shutil.which",
873
+ lambda t: "/opt/bin/" + t)
874
+
875
+ def test_pipx_install_upgrades_with_pipx(self, boost, sandbox, monkeypatch):
876
+ # The old behaviour: rc=1, "boost is not running from a git checkout",
877
+ # and a hint telling a PyPI user to go clone the repo instead.
878
+ self._pipx_install(monkeypatch, sandbox)
879
+ r = boost("self-update", "--dry-run")
880
+ assert "installed with: pipx" in r.out
881
+ assert "would run: /opt/bin/pipx upgrade boost-skill-cli" in r.out
882
+
883
+ def test_plain_pip_install_upgrades_with_this_interpreter(
884
+ self, boost, sandbox, monkeypatch):
885
+ self._not_a_checkout(monkeypatch, sandbox)
886
+ monkeypatch.setattr("sys.prefix", str(sandbox))
887
+ monkeypatch.setattr("boost_cli.core.selfupdate.installed_version",
888
+ lambda: "1.0.0")
889
+ r = boost("self-update", "--dry-run")
890
+ assert "installed with: pip" in r.out
891
+ assert ("would run: %s -m pip install --upgrade boost-skill-cli"
892
+ % sys.executable) in r.out
893
+
894
+ def test_pipx_upgrade_reports_the_new_version(self, boost, sandbox,
895
+ monkeypatch):
896
+ self._pipx_install(monkeypatch, sandbox)
897
+ ran = []
898
+ monkeypatch.setattr("boost_cli.core.selfupdate.run_upgrade",
899
+ lambda cmd, **kw: ran.append(cmd))
900
+ monkeypatch.setattr("boost_cli.core.selfupdate.observed_version",
901
+ lambda: "9.9.9")
902
+ r = boost("self-update")
903
+ from boost_cli import __version__
904
+ assert ran == [["/opt/bin/pipx", "upgrade", "boost-skill-cli"]]
905
+ assert ("boost v%s → v9.9.9" % __version__) in r.out
906
+ ev = journal.events(action="self-update")[0]
907
+ assert ev["subject"] == "9.9.9" and ev["method"] == "pipx"
908
+
909
+ def test_upgrade_that_reveals_no_version_does_not_claim_one(
910
+ self, boost, sandbox, monkeypatch):
911
+ self._pipx_install(monkeypatch, sandbox)
912
+ monkeypatch.setattr("boost_cli.core.selfupdate.run_upgrade",
913
+ lambda cmd, **kw: None)
914
+ monkeypatch.setattr("boost_cli.core.selfupdate.observed_version",
915
+ lambda: None)
916
+ r = boost("self-update")
917
+ assert "upgraded via pipx; run `boost --version` to confirm" in r.out
918
+ assert "→" not in r.out
919
+
920
+ def test_failed_upgrade_surfaces_the_managers_message(
921
+ self, boost, sandbox, monkeypatch):
922
+ self._pipx_install(monkeypatch, sandbox)
923
+
924
+ def boom(cmd, **kw):
925
+ raise BoostError("upgrade failed (pipx exited 1)",
926
+ hint="ERROR: No matching distribution")
927
+ monkeypatch.setattr("boost_cli.core.selfupdate.run_upgrade", boom)
928
+ r = boost("self-update", expect=1)
929
+ assert "upgrade failed (pipx exited 1)" in r.err
930
+ assert "No matching distribution" in r.err
931
+
932
+ def test_unknown_install_says_so_instead_of_guessing_pip(
933
+ self, boost, sandbox, monkeypatch):
934
+ self._not_a_checkout(monkeypatch, sandbox)
935
+ monkeypatch.setattr("sys.prefix", str(sandbox))
936
+ monkeypatch.setattr("boost_cli.core.selfupdate.installed_version",
937
+ lambda: None)
853
938
  r = boost("self-update", expect=1)
854
- assert "boost is not running from a git checkout" in r.err
855
- assert "git clone the boost repo" in r.err
939
+ assert "cannot work out how boost was installed" in r.err
940
+ assert "pipx upgrade boost-skill-cli" in r.err
941
+
942
+ def test_git_checkout_dry_run_changes_nothing(self, boost, sandbox,
943
+ monkeypatch):
944
+ monkeypatch.setattr("boost_cli.core.gitutil.is_repo", lambda p: True)
945
+
946
+ def no_git(*a, **kw):
947
+ raise AssertionError("--dry-run must not run git")
948
+ monkeypatch.setattr("boost_cli.core.gitutil.run", no_git)
949
+ r = boost("self-update", "--dry-run")
950
+ assert "installed with: git checkout" in r.out
951
+ assert "pull --ff-only" in r.out
856
952
 
857
953
  def _fake_git(self, monkeypatch, *, before, after, described):
858
954
  """Stub gitutil so self-update sees a controlled HEAD move + describe.