boost-skill-cli 1.2.58__tar.gz → 1.2.60__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 (830) hide show
  1. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.vale/styles/config/vocabularies/boost/accept.txt +2 -0
  2. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/CLAUDE.md +35 -0
  3. {boost_skill_cli-1.2.58/boost_skill_cli.egg-info → boost_skill_cli-1.2.60}/PKG-INFO +24 -4
  4. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/README.md +23 -3
  5. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/_version.py +2 -2
  6. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/discovery.py +45 -2
  7. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/pkg.py +107 -1
  8. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/quality.py +15 -0
  9. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/claude_settings.py +36 -0
  10. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/config.py +25 -0
  11. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/dense.py +19 -0
  12. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/paths.py +12 -0
  13. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/registry.py +21 -0
  14. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/shards.py +133 -0
  15. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/store.py +20 -0
  16. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/data/registries.json +15 -3
  17. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60/boost_skill_cli.egg-info}/PKG-INFO +24 -4
  18. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_skill_cli.egg-info/SOURCES.txt +4 -0
  19. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/commands.html +5 -3
  20. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/index.html +4 -1
  21. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/gstack-tap-first-then-coexistence.md +16 -10
  22. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +6 -1
  23. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/tool-call-eval-tier.md +20 -3
  24. boost_skill_cli-1.2.60/docs/roadmap/items/weekly-vectors-had-no-ingestion-path.md +62 -0
  25. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap.html +102 -14
  26. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/build_registries.py +24 -0
  27. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_quality.py +40 -0
  28. boost_skill_cli-1.2.60/tests/unit/test_cli_update_shards.py +154 -0
  29. boost_skill_cli-1.2.60/tests/unit/test_gstack_coexistence.py +285 -0
  30. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_shards.py +7 -1
  31. boost_skill_cli-1.2.60/tests/unit/test_shards_ingest.py +289 -0
  32. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.gitattributes +0 -0
  33. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.gitignore +0 -0
  34. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.gitleaks.toml +0 -0
  35. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.htmlvalidate.json +0 -0
  36. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.lighthouserc.json +0 -0
  37. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.lycheeignore +0 -0
  38. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.markdownlint-cli2.jsonc +0 -0
  39. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.pre-commit-config.yaml +0 -0
  40. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.stylelintrc.json +0 -0
  41. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.vale/styles/boost/AIWriting.yml +0 -0
  42. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.vale/styles/boost/Terminology.yml +0 -0
  43. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.vale.ini +0 -0
  44. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/CODE_OF_CONDUCT.md +0 -0
  45. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/CONTRIBUTING.md +0 -0
  46. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/DCO +0 -0
  47. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/GOVERNANCE.md +0 -0
  48. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/LICENSE +0 -0
  49. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/MAINTAINERS.md +0 -0
  50. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/MANIFEST.in +0 -0
  51. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/Makefile +0 -0
  52. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/SECURITY.md +0 -0
  53. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/SUPPORT.md +0 -0
  54. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost +0 -0
  55. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/__init__.py +0 -0
  56. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/__main__.py +0 -0
  57. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/cli.py +0 -0
  58. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/cliparse.py +0 -0
  59. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/__init__.py +0 -0
  60. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/_common.py +0 -0
  61. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/bmad.py +0 -0
  62. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/configuration.py +0 -0
  63. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/hooks.py +0 -0
  64. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/info.py +0 -0
  65. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/intelligence.py +0 -0
  66. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/quickstart.py +0 -0
  67. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/run.py +0 -0
  68. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/safety.py +0 -0
  69. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/taps.py +0 -0
  70. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/team.py +0 -0
  71. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/__init__.py +0 -0
  72. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/adapters.py +0 -0
  73. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/agents.py +0 -0
  74. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/ai.py +0 -0
  75. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/aihost.py +0 -0
  76. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/bmad.py +0 -0
  77. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/bootstrap.py +0 -0
  78. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/browse.py +0 -0
  79. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/builtin.py +0 -0
  80. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/capabilities.py +0 -0
  81. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/catalog.py +0 -0
  82. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/catalogbundle.py +0 -0
  83. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/chat.py +0 -0
  84. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/complete.py +0 -0
  85. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/ed25519.py +0 -0
  86. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/embed.py +0 -0
  87. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/faithfulness.py +0 -0
  88. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/frontmatter.py +0 -0
  89. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/gitutil.py +0 -0
  90. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/hookhost.py +0 -0
  91. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/imperative.py +0 -0
  92. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/injectscan.py +0 -0
  93. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/installscan.py +0 -0
  94. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/integrity.py +0 -0
  95. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/journal.py +0 -0
  96. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/localembed.py +0 -0
  97. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/lockfile.py +0 -0
  98. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/logs.py +0 -0
  99. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/mcp.py +0 -0
  100. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/mcpdecl.py +0 -0
  101. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/mcphost.py +0 -0
  102. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/minisign.py +0 -0
  103. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/nethttp.py +0 -0
  104. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/output.py +0 -0
  105. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/policy.py +0 -0
  106. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/projectlock.py +0 -0
  107. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/provenance.py +0 -0
  108. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/rag.py +0 -0
  109. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/resolve.py +0 -0
  110. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/rules.py +0 -0
  111. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/scopes.py +0 -0
  112. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/secretscan.py +0 -0
  113. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/selfupdate.py +0 -0
  114. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/serve.py +0 -0
  115. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/stackprobe.py +0 -0
  116. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/staleness.py +0 -0
  117. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/trustaudit.py +0 -0
  118. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/typosquat.py +0 -0
  119. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/updatediff.py +0 -0
  120. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/util.py +0 -0
  121. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/workflows.py +0 -0
  122. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/data/rules/boost-first.mdc +0 -0
  123. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/errors.py +0 -0
  124. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/spin.py +0 -0
  125. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_langchain/__init__.py +0 -0
  126. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_langchain/_compat.py +0 -0
  127. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_langchain/graph.py +0 -0
  128. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_langchain/loader.py +0 -0
  129. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_langchain/py.typed +0 -0
  130. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_langchain/retriever.py +0 -0
  131. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  132. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  133. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_skill_cli.egg-info/requires.txt +0 -0
  134. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_skill_cli.egg-info/top_level.txt +0 -0
  135. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/codecov.yml +0 -0
  136. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/.claude/settings.local.json +0 -0
  137. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/DEBUGGING.md +0 -0
  138. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/adapters.html +0 -0
  139. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/architecture/README.md +0 -0
  140. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/architecture/c4-components-core.md +0 -0
  141. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/architecture/c4-containers.md +0 -0
  142. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/architecture/c4-context.md +0 -0
  143. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/architecture/c4-dynamic-install.md +0 -0
  144. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/bmad.md +0 -0
  145. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/gifs/distill.gif +0 -0
  146. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/gifs/doctor.gif +0 -0
  147. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/gifs/explain.gif +0 -0
  148. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/gifs/hooks.gif +0 -0
  149. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/gifs/install.gif +0 -0
  150. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/gifs/pulse.gif +0 -0
  151. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/gifs/search.gif +0 -0
  152. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/gifs/tap.gif +0 -0
  153. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/tapes/distill.tape +0 -0
  154. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/tapes/doctor.tape +0 -0
  155. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/tapes/explain.tape +0 -0
  156. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/tapes/hooks.tape +0 -0
  157. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/tapes/install.tape +0 -0
  158. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/tapes/pulse.tape +0 -0
  159. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/tapes/search.tape +0 -0
  160. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/tapes/tap.tape +0 -0
  161. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel.html +0 -0
  162. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/chat.html +0 -0
  163. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/code-review.md +0 -0
  164. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/commit-audit.md +0 -0
  165. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/demo-index.json +0 -0
  166. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/demo.gif +0 -0
  167. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/demo.html +0 -0
  168. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/demo.tape +0 -0
  169. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/dependencies.md +0 -0
  170. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/design-roadmap.html +0 -0
  171. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/eval-latest.json +0 -0
  172. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/eval.html +0 -0
  173. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/langchain.html +0 -0
  174. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/mcp-hub.html +0 -0
  175. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/openssf-badge.md +0 -0
  176. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/openssf-playbook.md +0 -0
  177. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/rag-architecture.md +0 -0
  178. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D01.md +0 -0
  179. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D02.md +0 -0
  180. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D03.md +0 -0
  181. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D04.md +0 -0
  182. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D05.md +0 -0
  183. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D06.md +0 -0
  184. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D07.md +0 -0
  185. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D08.md +0 -0
  186. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D09.md +0 -0
  187. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D10.md +0 -0
  188. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D11.md +0 -0
  189. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D12.md +0 -0
  190. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D13.md +0 -0
  191. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D14.md +0 -0
  192. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D15.md +0 -0
  193. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D16.md +0 -0
  194. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D17.md +0 -0
  195. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D18.md +0 -0
  196. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D19.md +0 -0
  197. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D20.md +0 -0
  198. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D21.md +0 -0
  199. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D22.md +0 -0
  200. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D23.md +0 -0
  201. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D24.md +0 -0
  202. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D25.md +0 -0
  203. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D26.md +0 -0
  204. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D27.md +0 -0
  205. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  206. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  207. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  208. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  209. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  210. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/ai-backend-fanout.md +0 -0
  211. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  212. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  213. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  214. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  215. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  216. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
  217. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  218. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  219. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/bmad-hooks-all-hosts.md +0 -0
  220. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
  221. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/boost-first-rule.md +0 -0
  222. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  223. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  224. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/branch-current-gate.md +0 -0
  225. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  226. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  227. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
  228. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  229. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  230. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  231. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  232. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
  233. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  234. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  235. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  236. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  237. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  238. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  239. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/cli-command-audit.md +0 -0
  240. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
  241. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  242. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  243. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
  244. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/command-carousel-page.md +0 -0
  245. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  246. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  247. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
  248. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  249. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  250. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  251. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  252. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  253. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  254. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
  255. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  256. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  257. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  258. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/dense-reindex-has-no-progress-or-durability.md +0 -0
  259. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/dense-reindex-reuses-whole-taps.md +0 -0
  260. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  261. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
  262. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  263. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  264. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  265. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  266. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  267. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
  268. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  269. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  270. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  271. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  272. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  273. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  274. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  275. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  276. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  277. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  278. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  279. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  280. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  281. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  282. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  283. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  284. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  285. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  286. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  287. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  288. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  289. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  290. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  291. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  292. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  293. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  294. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
  295. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
  296. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
  297. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/github-community-health-files.md +0 -0
  298. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  299. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  300. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  301. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  302. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  303. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  304. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  305. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  306. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  307. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  308. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  309. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  310. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  311. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  312. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  313. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  314. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  315. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  316. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  317. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  318. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  319. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  320. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  321. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  322. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  323. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  324. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  325. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  326. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  327. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  328. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  329. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  330. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  331. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
  332. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  333. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  334. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  335. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  336. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  337. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  338. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  339. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
  340. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  341. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  342. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-cannot-read-a-skill-before-installing.md +0 -0
  343. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  344. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  345. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  346. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  347. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  348. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  349. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  350. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  351. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  352. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  353. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  354. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  355. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  356. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  357. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  358. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  359. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  360. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  361. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  362. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  363. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  364. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  365. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  366. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  367. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  368. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  369. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  370. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  371. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  372. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
  373. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
  374. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/openssf-playbook.md +0 -0
  375. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/openssf-silver.md +0 -0
  376. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/osps-baseline-levels.md +0 -0
  377. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  378. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  379. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  380. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
  381. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  382. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  383. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  384. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  385. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  386. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  387. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  388. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  389. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  390. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  391. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  392. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  393. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  394. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  395. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  396. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  397. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/published-shards-have-no-consumer.md +0 -0
  398. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  399. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  400. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  401. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  402. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
  403. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  404. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  405. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  406. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  407. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/relicence-apache-2.md +0 -0
  408. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
  409. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  410. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  411. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  412. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  413. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  414. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  415. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  416. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  417. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  418. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  419. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  420. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  421. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  422. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  423. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  424. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  425. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  426. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  427. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  428. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  429. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  430. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  431. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
  432. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  433. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  434. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  435. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  436. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  437. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  438. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
  439. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
  440. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
  441. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  442. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/shard-runs-reembed-everything-weekly.md +0 -0
  443. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
  444. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
  445. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  446. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  447. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  448. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
  449. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  450. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  451. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  452. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  453. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  454. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  455. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
  456. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  457. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  458. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  459. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
  460. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  461. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
  462. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
  463. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
  464. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
  465. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  466. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
  467. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
  468. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  469. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  470. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  471. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  472. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  473. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  474. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  475. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  476. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  477. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  478. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  479. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/vex-openvex-feed.md +0 -0
  480. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  481. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  482. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  483. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  484. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  485. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  486. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  487. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/workspace-scope-install.md +0 -0
  488. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/zip-strict-audit.md +0 -0
  489. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  490. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  491. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/security-design.md +0 -0
  492. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/semantic-search.md +0 -0
  493. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
  494. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/verifying-releases.md +0 -0
  495. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/vex/meta.md +0 -0
  496. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/vex/openvex.json +0 -0
  497. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
  498. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
  499. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
  500. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
  501. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/eslint.config.mjs +0 -0
  502. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/evals/README.md +0 -0
  503. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/evals/__init__.py +0 -0
  504. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/evals/baseline.json +0 -0
  505. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/evals/faithfulness.py +0 -0
  506. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/evals/golden_set.json +0 -0
  507. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/evals/make_corpus.py +0 -0
  508. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/evals/make_golden.py +0 -0
  509. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/evals/metrics.py +0 -0
  510. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/evals/publish_golden_dataset.py +0 -0
  511. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/evals/run_evals.py +0 -0
  512. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/examples/README.md +0 -0
  513. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/examples/adapt-demo.sh +0 -0
  514. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/examples/boost-run-prototype.sh +0 -0
  515. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/index.html +0 -0
  516. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/noxfile.py +0 -0
  517. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/pyproject.toml +0 -0
  518. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/coverage-tools.in +0 -0
  519. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/coverage-tools.txt +0 -0
  520. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/lint-tools.in +0 -0
  521. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/lint-tools.txt +0 -0
  522. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/mutation-tools.in +0 -0
  523. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/mutation-tools.txt +0 -0
  524. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/platform-pins.lock +0 -0
  525. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/release-tools.in +0 -0
  526. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/release-tools.txt +0 -0
  527. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/test-tools.in +0 -0
  528. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/test-tools.txt +0 -0
  529. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/a11y_check.py +0 -0
  530. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/add_spdx_headers.py +0 -0
  531. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/bench_cli.sh +0 -0
  532. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/build_command_reference.py +0 -0
  533. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/build_demo_index.py +0 -0
  534. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/build_roadmap.py +0 -0
  535. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/build_scale_corpus.py +0 -0
  536. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/build_vex.py +0 -0
  537. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/check_anchors.py +0 -0
  538. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/check_branch_current.py +0 -0
  539. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/check_dco.py +0 -0
  540. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/check_licenses.py +0 -0
  541. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/check_reproducible.py +0 -0
  542. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/check_required_checks.py +0 -0
  543. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/ensure_eval_corpus.sh +0 -0
  544. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/eval_corpus.py +0 -0
  545. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/eval_explain.py +0 -0
  546. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/eval_gate.py +0 -0
  547. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/eval_recommend.py +0 -0
  548. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/eval_retrieval.py +0 -0
  549. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/eval_stats_summary.py +0 -0
  550. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/eval_tools.py +0 -0
  551. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/import_budget.py +0 -0
  552. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/lock_toolchain.py +0 -0
  553. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/measure_registry.py +0 -0
  554. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/mutation_gate.py +0 -0
  555. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/mutation_shards.py +0 -0
  556. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/mutation_weights.json +0 -0
  557. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/normalize_sdist.py +0 -0
  558. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/page_budget.py +0 -0
  559. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/perf_gate.py +0 -0
  560. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/post_deploy_smoke.py +0 -0
  561. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/publish_eval_json.py +0 -0
  562. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/publish_shards.py +0 -0
  563. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/release_guard.py +0 -0
  564. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/release_preflight.py +0 -0
  565. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/serve_docs.py +0 -0
  566. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/shard_plan.py +0 -0
  567. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/setup.cfg +0 -0
  568. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/sonar-project.properties +0 -0
  569. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/style/README.md +0 -0
  570. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/style/boost.css +0 -0
  571. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/style/boost.js +0 -0
  572. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/style/demo.html +0 -0
  573. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/adapt.feature +0 -0
  574. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/browse.feature +0 -0
  575. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/count.feature +0 -0
  576. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/discover.feature +0 -0
  577. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/doctor.feature +0 -0
  578. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/environment.py +0 -0
  579. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/explain.feature +0 -0
  580. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/index.feature +0 -0
  581. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/install.feature +0 -0
  582. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/list.feature +0 -0
  583. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/mcp.feature +0 -0
  584. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/search.feature +0 -0
  585. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/steps/cli_steps.py +0 -0
  586. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/steps/discovery_steps.py +0 -0
  587. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/steps/mcp_steps.py +0 -0
  588. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/steps/quality_steps.py +0 -0
  589. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/conftest.py +0 -0
  590. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/eval/baseline.json +0 -0
  591. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/eval/explain.jsonl +0 -0
  592. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/eval/golden-natural.jsonl +0 -0
  593. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/eval/golden.jsonl +0 -0
  594. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/eval/recommend.jsonl +0 -0
  595. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/eval/taps-scale.txt +0 -0
  596. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/eval/taps.txt +0 -0
  597. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/eval/tool_calls.jsonl +0 -0
  598. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_bmad_all_hosts.py +0 -0
  599. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_capabilities_policy.py +0 -0
  600. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_adapt.py +0 -0
  601. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_bmad.py +0 -0
  602. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_catalog.py +0 -0
  603. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_chat.py +0 -0
  604. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_configuration.py +0 -0
  605. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_discovery.py +0 -0
  606. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_hooks.py +0 -0
  607. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_hooks_gemini.py +0 -0
  608. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_info.py +0 -0
  609. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_intelligence.py +0 -0
  610. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_pane_width.py +0 -0
  611. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_pkg.py +0 -0
  612. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_quickstart.py +0 -0
  613. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_tap_pins.py +0 -0
  614. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_taps.py +0 -0
  615. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_team.py +0 -0
  616. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_everyday_loop.py +0 -0
  617. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_integrity_enforce.py +0 -0
  618. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_kind_conformance.py +0 -0
  619. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_property_parsers.py +0 -0
  620. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_run.py +0 -0
  621. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_tap_signing.py +0 -0
  622. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_workspace_scope.py +0 -0
  623. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/README.md +0 -0
  624. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  625. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  626. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  627. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  628. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  629. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  630. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  631. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  632. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  633. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  634. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  635. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  636. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  637. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  638. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  639. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  640. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  641. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  642. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  643. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  644. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
  645. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
  646. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
  647. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/fuzz_frontmatter.py +0 -0
  648. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/fuzz_registry.py +0 -0
  649. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/langchain/conftest.py +0 -0
  650. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/langchain/test_graph.py +0 -0
  651. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/langchain/test_loader.py +0 -0
  652. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/langchain/test_retriever.py +0 -0
  653. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/make_fixture.py +0 -0
  654. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/perf/test_benchmarks.py +0 -0
  655. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/smoke.sh +0 -0
  656. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_a11y_check.py +0 -0
  657. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_action_pin_lockstep.py +0 -0
  658. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_adapters.py +0 -0
  659. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_adapters_multi.py +0 -0
  660. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_adapters_runner.py +0 -0
  661. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_agents.py +0 -0
  662. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_ai.py +0 -0
  663. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_aihost.py +0 -0
  664. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_bmad_core.py +0 -0
  665. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_boost_first_offer.py +0 -0
  666. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_bootstrap.py +0 -0
  667. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_bot_pr_dco.py +0 -0
  668. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_branch_current.py +0 -0
  669. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_browse.py +0 -0
  670. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_builtin.py +0 -0
  671. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_capabilities.py +0 -0
  672. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_catalog.py +0 -0
  673. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_catalogbundle.py +0 -0
  674. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_chat.py +0 -0
  675. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_check_anchors.py +0 -0
  676. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_check_dco.py +0 -0
  677. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_check_licenses.py +0 -0
  678. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_check_reproducible.py +0 -0
  679. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_claude_settings.py +0 -0
  680. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_clean_internal_cache.py +0 -0
  681. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_cliparse.py +0 -0
  682. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_codeql_analysis_key.py +0 -0
  683. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_command_reference_fresh.py +0 -0
  684. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_community_health_files.py +0 -0
  685. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_compact.py +0 -0
  686. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_complete.py +0 -0
  687. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_complete_rc_block.py +0 -0
  688. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_config.py +0 -0
  689. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_content_dedupe.py +0 -0
  690. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_content_identity.py +0 -0
  691. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_crash_redaction.py +0 -0
  692. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dedup_trust.py +0 -0
  693. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_demo_index.py +0 -0
  694. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense.py +0 -0
  695. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_embed_dedupe.py +0 -0
  696. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_entry_reuse.py +0 -0
  697. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_fallback.py +0 -0
  698. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_fix_hint.py +0 -0
  699. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_progress.py +0 -0
  700. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_quantized.py +0 -0
  701. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_ready_order.py +0 -0
  702. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_shard_real_schema.py +0 -0
  703. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
  704. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_shards.py +0 -0
  705. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_status.py +0 -0
  706. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_status_cheap.py +0 -0
  707. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dependabot_config.py +0 -0
  708. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_docs_pages_linked.py +0 -0
  709. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_docsite_chrome.py +0 -0
  710. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_ed25519.py +0 -0
  711. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_embed.py +0 -0
  712. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_embed_local.py +0 -0
  713. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_embed_truncated_response.py +0 -0
  714. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_entry_key.py +0 -0
  715. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_errors_and_cli_table.py +0 -0
  716. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_eval_baseline.py +0 -0
  717. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_eval_corpus.py +0 -0
  718. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_eval_faithfulness.py +0 -0
  719. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_eval_gate.py +0 -0
  720. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_eval_grading.py +0 -0
  721. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_eval_metrics.py +0 -0
  722. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_eval_stats_summary.py +0 -0
  723. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_eval_tools.py +0 -0
  724. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  725. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_faithfulness.py +0 -0
  726. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_frontmatter.py +0 -0
  727. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_fuzz_targets.py +0 -0
  728. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  729. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_gitleaks_config.py +0 -0
  730. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_gitutil.py +0 -0
  731. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_gitutil_lfs.py +0 -0
  732. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_gitutil_sparse.py +0 -0
  733. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_hook_settings_hosts.py +0 -0
  734. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_hookhost.py +0 -0
  735. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_imperative.py +0 -0
  736. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_import_budget.py +0 -0
  737. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_injectscan.py +0 -0
  738. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_install_permission_error.py +0 -0
  739. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_installscan.py +0 -0
  740. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_integrity.py +0 -0
  741. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_journal.py +0 -0
  742. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_langchain_packaging.py +0 -0
  743. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_link_ownership.py +0 -0
  744. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_localembed.py +0 -0
  745. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_localembed_e2e.py +0 -0
  746. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_lockfile.py +0 -0
  747. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_logs.py +0 -0
  748. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_marketing_counts.py +0 -0
  749. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_mcp.py +0 -0
  750. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_mcp_install_scan.py +0 -0
  751. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_mcp_read.py +0 -0
  752. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_mcpdecl.py +0 -0
  753. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_mcphost.py +0 -0
  754. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_measure_registry.py +0 -0
  755. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_minisign.py +0 -0
  756. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_mutation_hardening.py +0 -0
  757. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_mutation_shards.py +0 -0
  758. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_mutation_subfile_shards.py +0 -0
  759. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_mutmut_source_paths.py +0 -0
  760. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_nethttp.py +0 -0
  761. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_normalize_sdist.py +0 -0
  762. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_output.py +0 -0
  763. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_page_budget.py +0 -0
  764. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_paths.py +0 -0
  765. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_perf_gate.py +0 -0
  766. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_pkg_confusions.py +0 -0
  767. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_pkg_injection.py +0 -0
  768. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_pkg_secrets.py +0 -0
  769. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_platform_pins.py +0 -0
  770. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_policy.py +0 -0
  771. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_post_deploy_smoke.py +0 -0
  772. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_project_mcp_sidecar.py +0 -0
  773. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_projectlock.py +0 -0
  774. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_provenance.py +0 -0
  775. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_publish_golden_dataset.py +0 -0
  776. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_rag.py +0 -0
  777. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_rag_fastpath.py +0 -0
  778. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_rag_fusion.py +0 -0
  779. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_registries_fresh.py +0 -0
  780. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_registry.py +0 -0
  781. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_registry_categories.py +0 -0
  782. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_registry_control_chars.py +0 -0
  783. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_registry_parallel.py +0 -0
  784. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_release_guard.py +0 -0
  785. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_release_preflight.py +0 -0
  786. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_required_checks.py +0 -0
  787. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_rerank_cache.py +0 -0
  788. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_resolve.py +0 -0
  789. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_roadmap_fresh.py +0 -0
  790. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_rules.py +0 -0
  791. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_scale_corpus.py +0 -0
  792. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_scopes.py +0 -0
  793. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_secretscan.py +0 -0
  794. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_selfupdate.py +0 -0
  795. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_serve.py +0 -0
  796. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_serve_docs.py +0 -0
  797. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_shard_plan.py +0 -0
  798. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_shards_incremental.py +0 -0
  799. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_shards_matrix.py +0 -0
  800. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_smoke_covers_every_command.py +0 -0
  801. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_spdx_headers.py +0 -0
  802. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_spin.py +0 -0
  803. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_stackprobe.py +0 -0
  804. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_staleness.py +0 -0
  805. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_store.py +0 -0
  806. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_store_materialize.py +0 -0
  807. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_sync_blocked_links.py +0 -0
  808. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  809. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_tap_pins.py +0 -0
  810. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_token_parity.py +0 -0
  811. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_toolchain_lock.py +0 -0
  812. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_trustaudit.py +0 -0
  813. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_typosquat.py +0 -0
  814. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_updatediff.py +0 -0
  815. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_util.py +0 -0
  816. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_version.py +0 -0
  817. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_version_tags.py +0 -0
  818. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_vex.py +0 -0
  819. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_visual_harness_flags.py +0 -0
  820. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_workflow_concurrency.py +0 -0
  821. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  822. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  823. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_workflow_timeouts.py +0 -0
  824. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_workflows.py +0 -0
  825. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  826. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/visual/a11y_check.mjs +0 -0
  827. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/visual/console_check.mjs +0 -0
  828. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/visual/package-lock.json +0 -0
  829. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/visual/package.json +0 -0
  830. {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/visual/visual_check.mjs +0 -0
@@ -34,6 +34,8 @@ config
34
34
  configs
35
35
  CPython
36
36
  CRM
37
+ cron
38
+ crontab
37
39
  cyclomatic
38
40
  Dependabot
39
41
  deps
@@ -543,6 +543,41 @@ each agent's skills dir, and updating the lock file.
543
543
  by another key-holder; `scripts/publish_shards.py manifest` refuses to
544
544
  describe two spaces in one file.
545
545
 
546
+ - **`sync` and `ingest` differ in which side is authoritative, and only one of
547
+ them survives a republish.** `shards.sync` takes this machine's commits as
548
+ given and asks whether a published shard happens to match — right on setup
549
+ day, wrong a week later, because the weekly run republishes against whatever
550
+ the registries moved to. So for most taps the answer becomes "no", and the
551
+ user is told their vectors are stale with no way to act on it but hours of
552
+ local CPU: `boost update` chases branch HEAD and `--force` chases it while
553
+ dropping the pin, neither of which can land on a commit a manifest names.
554
+ `shards.ingest` reads the manifest as the **target**: a row for a tap held at
555
+ another commit is a reason to move the tap (`registry.retarget` — checkout
556
+ then pin, never the reverse), and `boost update --shards` is the surface. Two
557
+ invariants are load-bearing. **Download and verify before moving**: a move
558
+ followed by a failed download leaves vectors stale but present, the failure
559
+ that looks like nothing at all — `retarget` is injected so the ordering is
560
+ testable without a git remote. **Skip on `built`, not on `commits`**:
561
+ `dense.tap_commits()` says which commit the *vectors* were built at, and a tap
562
+ matching on both is skipped without a download, which is the whole reason a
563
+ weekly cron line costs one manifest fetch. A registry that dropped out of the
564
+ manifest is left pinned where it sits — falling back to HEAD would invent a
565
+ target no published vectors describe. And a tap that moves invalidates more
566
+ than vectors: its catalog cache and the BM25 index name entries from the old
567
+ tree, so `catalog.rebuild_tap` and `rag.build` run for anything that moved.
568
+
569
+ - **Search reads two mtimes and makes zero network calls, and cheapness is not
570
+ the argument.** The manifest is ~170 KB, so an inline check would be
571
+ affordable; acting on its answer means moving taps and downloading hundreds of
572
+ megabytes, which cannot happen inside a sub-second search. So the most an
573
+ inline check could ever produce is the one line `_hint_stale_shards` already
574
+ prints for one `stat` — at the price of a round trip per query and
575
+ unannounced egress. `paths.shard_sync_marker()` lives under `state/`, not
576
+ `cache/`, because `boost clean` sweeps `cache/*.json` and would delete it,
577
+ after which search would nag about vectors refreshed that morning. The shard
578
+ hint suppresses the tap-age hint when it fires: its remedy moves the taps too,
579
+ and two staleness lines under one result set is how a hint becomes noise.
580
+
546
581
  **Search has two engines**, both in `core/`: `rag.py` is the always-on,
547
582
  zero-dependency BM25 engine (full-content index, auto-builds on first
548
583
  search — this is what the required `eval` gate floors at recall@k ≥ 0.78).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.58
3
+ Version: 1.2.60
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License-Expression: Apache-2.0
@@ -197,14 +197,34 @@ for every one that has a published shard.
197
197
  Already tapped? `boost reindex --fetch-shards` does the download half alone,
198
198
  and `boost reindex --dense` embeds locally whatever has no published shard.
199
199
 
200
+ Vectors are republished weekly, and `boost update --shards` is the ingestion
201
+ side of that. It reads the manifest as the *target* state: each tap is moved
202
+ onto the commit its published vectors were built from, those vectors are
203
+ imported, and the keyword index is rebuilt for anything that moved. A tap
204
+ already sitting at the published commit with those vectors already built is
205
+ skipped without downloading anything, so in a week where a registry did not
206
+ move the command does nothing at all — which is what makes it safe to schedule:
207
+
208
+ ```bash
209
+ # refresh prebuilt vectors every Monday at 09:00 — crontab -e
210
+ 0 9 * * 1 /full/path/to/boost update --shards >> ~/.boost/logs/shards.log 2>&1
211
+ ```
212
+
213
+ Plain `boost update` moves each tap to its branch head; `--shards` moves each
214
+ tap to the commit the published vectors describe. Two different targets, so
215
+ they are separate modes rather than one pass, and `--shards --taps-only` is
216
+ refused rather than silently picking one.
217
+
200
218
  Because vectors are keyed to a registry's commit, `quickstart` **pins** each tap
201
219
  it fetches vectors for, and `boost update` skips a pinned tap rather than moving
202
220
  it out from under them (`--force` moves it anyway and drops the pin). When a tap
203
221
  does move, boost checks whether a newer shard exists for the new commit and
204
222
  imports it; if none does, it says so instead of leaving stale vectors looking
205
- fresh. `boost search` never refreshes taps behind your back — it prints one line
206
- when they are more than two weeks old and leaves the fetching to
207
- `boost update --taps-only`.
223
+ fresh. `boost search` never refreshes taps behind your back, and never checks
224
+ the manifest either — acting on that answer means moving taps and downloading
225
+ hundreds of megabytes, which cannot happen inside a sub-second search. It prints
226
+ one line when the taps or the prebuilt vectors are more than two weeks old and
227
+ leaves the fetching to `boost update --taps-only` or `boost update --shards`.
208
228
  Every download is checked against the sha256 in the manifest and refused on a
209
229
  mismatch, and shards for a registry that has moved since publication are
210
230
  refused rather than merged — stale vectors would otherwise look fresh forever.
@@ -155,14 +155,34 @@ for every one that has a published shard.
155
155
  Already tapped? `boost reindex --fetch-shards` does the download half alone,
156
156
  and `boost reindex --dense` embeds locally whatever has no published shard.
157
157
 
158
+ Vectors are republished weekly, and `boost update --shards` is the ingestion
159
+ side of that. It reads the manifest as the *target* state: each tap is moved
160
+ onto the commit its published vectors were built from, those vectors are
161
+ imported, and the keyword index is rebuilt for anything that moved. A tap
162
+ already sitting at the published commit with those vectors already built is
163
+ skipped without downloading anything, so in a week where a registry did not
164
+ move the command does nothing at all — which is what makes it safe to schedule:
165
+
166
+ ```bash
167
+ # refresh prebuilt vectors every Monday at 09:00 — crontab -e
168
+ 0 9 * * 1 /full/path/to/boost update --shards >> ~/.boost/logs/shards.log 2>&1
169
+ ```
170
+
171
+ Plain `boost update` moves each tap to its branch head; `--shards` moves each
172
+ tap to the commit the published vectors describe. Two different targets, so
173
+ they are separate modes rather than one pass, and `--shards --taps-only` is
174
+ refused rather than silently picking one.
175
+
158
176
  Because vectors are keyed to a registry's commit, `quickstart` **pins** each tap
159
177
  it fetches vectors for, and `boost update` skips a pinned tap rather than moving
160
178
  it out from under them (`--force` moves it anyway and drops the pin). When a tap
161
179
  does move, boost checks whether a newer shard exists for the new commit and
162
180
  imports it; if none does, it says so instead of leaving stale vectors looking
163
- fresh. `boost search` never refreshes taps behind your back — it prints one line
164
- when they are more than two weeks old and leaves the fetching to
165
- `boost update --taps-only`.
181
+ fresh. `boost search` never refreshes taps behind your back, and never checks
182
+ the manifest either — acting on that answer means moving taps and downloading
183
+ hundreds of megabytes, which cannot happen inside a sub-second search. It prints
184
+ one line when the taps or the prebuilt vectors are more than two weeks old and
185
+ leaves the fetching to `boost update --taps-only` or `boost update --shards`.
166
186
  Every download is checked against the sha256 in the manifest and refused on a
167
187
  mismatch, and shards for a registry that has moved since publication are
168
188
  refused rather than merged — stale vectors would otherwise look fresh forever.
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.2.58'
22
- __version_tuple__ = version_tuple = (1, 2, 58)
21
+ __version__ = version = '1.2.60'
22
+ __version_tuple__ = version_tuple = (1, 2, 60)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -218,6 +218,8 @@ def _hint_stale_taps() -> None:
218
218
  price of one stat, and a machine that has never refreshed says nothing at
219
219
  all rather than inventing an age.
220
220
  """
221
+ if _hint_stale_shards():
222
+ return
221
223
  age = registry.refresh_age_days()
222
224
  if age is None or age < registry.STALE_TAPS_DAYS:
223
225
  return
@@ -226,6 +228,37 @@ def _hint_stale_taps() -> None:
226
228
  % int(age), "muted"))
227
229
 
228
230
 
231
+ def _hint_stale_shards() -> bool:
232
+ """Mention un-ingested published vectors. One `stat`, and never a network call.
233
+
234
+ The published manifest is ~170 KB, so checking it inline would be cheap —
235
+ and cheapness is not the argument. Acting on the answer means moving taps
236
+ and downloading hundreds of megabytes, which cannot happen inside a
237
+ sub-second search, so the most an inline check could ever produce is this
238
+ one line: the same line, for the price of a network round trip on every
239
+ query and unannounced egress at that. The marker's mtime answers it for
240
+ free, and a machine that has never ingested a shard says nothing rather
241
+ than inventing an age.
242
+
243
+ Returns True when it printed, so the tap-age hint stays quiet. The remedy
244
+ named here moves the taps as well, and two staleness lines under one set of
245
+ results is how a hint turns into noise.
246
+ """
247
+ from ..core import shards
248
+ age = shards.sync_age_days()
249
+ if age is None or age < shards.STALE_SHARDS_DAYS:
250
+ return False
251
+ from ..core import dense
252
+ if not dense.status().get("ready"):
253
+ # Vectors that are not serving queries cannot be stale in a way the
254
+ # user can act on; `_hint_semantic_search` owns that conversation.
255
+ return False
256
+ out.info(out.role(
257
+ "prebuilt vectors last refreshed %d days ago — `boost update --shards`"
258
+ % int(age), "muted"))
259
+ return True
260
+
261
+
229
262
  def _hint_semantic_search(engine: str) -> None:
230
263
  """Say that a better engine exists, when BM25 answered alone.
231
264
 
@@ -315,8 +348,12 @@ def _fetch_shards(args) -> int:
315
348
  hint=dense.fix_hint(dense.status().get("reason", "")))
316
349
  commits = rag._tap_commits()
317
350
  by_name = {t.name: commits.get(t.safe_name, "") for t in registry.list_taps()}
318
- results = shards.sync(list(by_name), by_name, manifest=manifest,
319
- on_event=_shard_event)
351
+ results = shards.sync(
352
+ list(by_name), by_name, manifest=manifest,
353
+ # Progress goes to stdout, and so does the JSON: emitting both left
354
+ # `--json` printing "fetching ..." lines ahead of the document, which
355
+ # no parser can read past.
356
+ on_event=None if args.as_json else _shard_event)
320
357
  if args.as_json:
321
358
  print(json.dumps({"shards": results}, indent=2))
322
359
  return 0
@@ -335,6 +372,12 @@ def _fetch_shards(args) -> int:
335
372
  out.info(out.role("%d tap(s) without usable vectors: %s"
336
373
  % (len(missing), ", ".join(missing[:5])
337
374
  + (" …" if len(missing) > 5 else "")), "muted"))
375
+ if any(r["status"] == "refused" for r in results):
376
+ # A refusal here is almost always "the tap has moved past the
377
+ # commit these vectors describe", which local embedding is the
378
+ # expensive answer to and `--shards` is the cheap one: it moves the
379
+ # tap back onto a published commit instead.
380
+ out.info("taps that moved past their vectors: `boost update --shards`")
338
381
  out.info("embed those locally with `boost reindex --dense`")
339
382
  return 0
340
383
 
@@ -16,7 +16,7 @@ from datetime import UTC, datetime
16
16
  from itertools import chain
17
17
  from pathlib import Path
18
18
 
19
- from .. import cliparse
19
+ from .. import cliparse, spin
20
20
  from ..core import (
21
21
  adapters,
22
22
  agents,
@@ -878,6 +878,103 @@ def _resync_vectors(moved: list[str]) -> None:
878
878
  "`boost reindex --dense`" % left, "muted"))
879
879
 
880
880
 
881
+ def _ingest_event(tap: str, status: str, detail: str) -> None:
882
+ """Progress for one tap, quiet enough to run over four hundred of them."""
883
+ if status == "downloading":
884
+ out.info(out.role("fetching %s %s" % (tap, detail), "muted"))
885
+ elif status == "moving":
886
+ out.info(out.role("moving %s to %s" % (tap, detail), "muted"))
887
+ elif status == "failed":
888
+ out.info(out.role("%s: failed%s"
889
+ % (tap, " (%s)" % detail if detail else ""), "muted"))
890
+
891
+
892
+ def _ingest_shards(args) -> int:
893
+ """`boost update --shards`: refresh vectors from the published manifest.
894
+
895
+ Its own mode rather than a step of the normal update, because the two move
896
+ taps toward different targets: a plain `boost update` moves each tap to its
897
+ branch HEAD, and this moves each tap to the commit the published vectors
898
+ were built from. Running both in one pass would move every tap twice and
899
+ leave the second answer standing, so the flag replaces the update rather
900
+ than extending it.
901
+
902
+ This is the ingestion path for the weekly shard run. It is a no-op on a
903
+ machine that already holds this week's vectors, which is what makes it
904
+ safe to put in a cron line — see the docs.
905
+ """
906
+ from ..core import dense, shards
907
+ taps = registry.list_taps()
908
+ if not taps:
909
+ raise BoostError("no taps configured — nothing to refresh",
910
+ hint="`boost quickstart` taps the starters and loads "
911
+ "their vectors in one pass")
912
+ manifest = shards.fetch_manifest()
913
+ why = shards.incompatible(manifest)
914
+ if why:
915
+ raise BoostError("published shards cannot serve this machine — %s" % why,
916
+ hint=dense.fix_hint(dense.status().get("reason", "")))
917
+ commits = rag._tap_commits()
918
+ stored = dense.tap_commits()
919
+ # Both maps are keyed by tap name; the two sources are keyed by safe name.
920
+ by_name = {t.name: commits.get(t.safe_name, "") for t in taps}
921
+ built = {t.name: stored.get(t.safe_name, "") for t in taps}
922
+ results = shards.ingest(
923
+ list(by_name), by_name, built=built, manifest=manifest,
924
+ # Progress goes to stdout, which is where the JSON goes: under `--json`
925
+ # the two would interleave into something no parser can read.
926
+ on_event=None if args.as_json else _ingest_event)
927
+
928
+ imported = [r for r in results if r["status"] == "imported"]
929
+ current = [r for r in results if r["status"] == "current"]
930
+ failed = [r for r in results if r["status"] == "failed"]
931
+ moved = [r["tap"] for r in results if r.get("moved")]
932
+ # Before the output branch, never inside it: a tap that moved is describing
933
+ # a different tree, so its catalog cache and the keyword index both name
934
+ # entries that may no longer exist. Vectors are not the only thing a commit
935
+ # is load-bearing for, and a `--json` caller is owed the same repair.
936
+ for name in moved:
937
+ catalog.rebuild_tap(registry.get(name))
938
+ if moved:
939
+ # Spinners write to stderr, so this is safe under `--json`.
940
+ with spin.Spinner("rebuilding the keyword index"):
941
+ rag.build()
942
+ complete.refresh_names()
943
+ journal.log("update", "--shards")
944
+ # Nothing landed and nothing was already current: the manifest and this
945
+ # machine have nothing to say to each other, which a cron line should
946
+ # notice rather than read as a quiet success.
947
+ rc = 1 if failed and not imported and not current else 0
948
+ if args.as_json:
949
+ print(json.dumps({"shards": results}, indent=2))
950
+ return rc
951
+
952
+ if imported:
953
+ total = sum(int(r.get("chunks") or 0) for r in imported)
954
+ out.ok("imported %s (%s chunk%s)%s"
955
+ % (_plural(len(imported), "shard"), format(total, ","),
956
+ "" if total == 1 else "s",
957
+ ", %d moved to a newer commit" % len(moved) if moved else ""))
958
+ if current:
959
+ out.info(out.role("%s already at the published commit"
960
+ % _plural(len(current), "tap"), "muted"))
961
+ if not imported and not current:
962
+ # Never a tick. Nothing landed, and "imported 0" with a tick reads as a
963
+ # job well done to the one user who most needs to know otherwise.
964
+ out.warn("no published vectors matched your taps")
965
+ unpublished = [r["tap"] for r in results if r["status"] == "unpublished"]
966
+ if unpublished:
967
+ out.info(out.role(
968
+ "%s not in the manifest, left where they are: %s"
969
+ % (_plural(len(unpublished), "tap"), ", ".join(unpublished[:5])
970
+ + (" …" if len(unpublished) > 5 else "")), "muted"))
971
+ for r in failed:
972
+ out.warn("%s: %s" % (r["tap"], r.get("detail") or "failed"))
973
+ if failed:
974
+ out.info("embed those locally with `boost reindex --dense`")
975
+ return rc
976
+
977
+
881
978
  def cmd_update(argv: list[str]) -> int:
882
979
  ap = cliparse.parser(prog="boost update",
883
980
  description="Sync taps or update installed skills")
@@ -894,7 +991,16 @@ def cmd_update(argv: list[str]) -> int:
894
991
  help="skip the confirmation prompt")
895
992
  ap.add_argument("--force", action="store_true",
896
993
  help="move pinned taps too, clearing their pin")
994
+ ap.add_argument("--shards", action="store_true",
995
+ help="refresh prebuilt vectors from the published "
996
+ "manifest, moving taps to the commits it names")
997
+ ap.add_argument("--json", dest="as_json", action="store_true",
998
+ help="with --shards: print the per-tap result as JSON")
897
999
  args = ap.parse_args(argv)
1000
+ if args.shards:
1001
+ if args.taps_only:
1002
+ ap.error("--shards and --taps-only move taps to different commits")
1003
+ return _ingest_shards(args)
898
1004
  results, failures = registry.update(args.tap or None, force=args.force)
899
1005
  if not results and not failures:
900
1006
  out.info("no taps configured — start with `boost tap --defaults`")
@@ -24,6 +24,7 @@ from ..core import (
24
24
  agents,
25
25
  ai,
26
26
  catalog,
27
+ claude_settings,
27
28
  complete,
28
29
  frontmatter,
29
30
  gitutil,
@@ -549,6 +550,20 @@ def cmd_doctor(argv):
549
550
  "left alone; yours to remove or repair"
550
551
  % (len(foreign), _s(len(foreign))))
551
552
 
553
+ others = claude_settings.foreign_hooks("global")
554
+ if others:
555
+ # `out.info`, not `bad`, for the same reason as the foreign symlinks
556
+ # above: boost did not write these and will never remove them, so
557
+ # counting them would leave doctor permanently red on something no
558
+ # boost command can clear. Naming them is still worth a line — at
559
+ # 130k stars gstack is now a likely second writer of this exact file,
560
+ # and a user debugging a hook needs to know boost is not the only one
561
+ # in it.
562
+ events = sorted({h["event"] for h in others})
563
+ out.info("%d hook%s in ~/.claude/settings.json not managed by boost "
564
+ "(%s) — left alone; `boost hooks` only touches its own"
565
+ % (len(others), _s(len(others)), ", ".join(events)), wrap=True)
566
+
552
567
  for dup in store.duplicate_discovery():
553
568
  # An agent that reads the canonical store natively, holding its own
554
569
  # entry for a skill that store already carries. Boost did not put it
@@ -200,6 +200,42 @@ def has_hook(scope: str, event: str, name: str,
200
200
  return False
201
201
 
202
202
 
203
+ def foreign_hooks(scope: str | None = None,
204
+ project_dir: Path | None = None,
205
+ host: str = hookhost.CLAUDE) -> list[dict]:
206
+ """Hooks in this host's settings that boost does not own.
207
+
208
+ The complement of :func:`list_hooks`, which skips every entry without the
209
+ `# boost:` marker — so boost could write this file for years and never be
210
+ able to say who else was writing it. That matters now that a settings.json
211
+ routinely has more than one writer: `garrytan/gstack`'s `./setup` registers
212
+ its own Stop hooks here and prunes "dead gstack entries" on every run, and
213
+ boost prunes its own by marker. The two namespaces are disjoint and
214
+ `tests/unit/test_gstack_coexistence.py` pins that they stay that way.
215
+
216
+ This exists so `boost doctor` can *report* the other tenant rather than
217
+ discover it by deleting something. Nothing here writes: a foreign hook is
218
+ not a boost problem to fix, it is context for a user reading a health
219
+ check — which is why doctor counts it with `out.info` rather than raising
220
+ the issue count.
221
+ """
222
+ scopes = (scope,) if scope else SCOPES
223
+ rows: list[dict] = []
224
+ for sc in scopes:
225
+ data = load(sc, project_dir, host)
226
+ for event, blocks in (data.get("hooks") or {}).items():
227
+ for block in blocks or []:
228
+ if not isinstance(block, dict):
229
+ continue
230
+ for h in block.get("hooks") or []:
231
+ raw = str(h.get("command", ""))
232
+ if _hook_name(raw) is not None:
233
+ continue # ours
234
+ rows.append({"scope": sc, "event": event, "command": raw,
235
+ "matcher": block.get("matcher", "")})
236
+ return rows
237
+
238
+
203
239
  def list_hooks(scope: str | None = None,
204
240
  project_dir: Path | None = None,
205
241
  host: str = hookhost.CLAUDE) -> list[dict]:
@@ -131,6 +131,31 @@ def load_registry_catalog() -> list:
131
131
  return data.get("registries", [])
132
132
 
133
133
 
134
+ def self_installing_command(tap: str) -> str | None:
135
+ """The repo's own install command, when boost must not copy its items.
136
+
137
+ Some registries are real catalogues of Markdown and some are programs that
138
+ happen to ship Markdown entry points. For the second kind boost's install —
139
+ copy the item's directory into the canonical store, symlink it out — yields
140
+ a skill that *looks* installed and cannot run, because the step that makes
141
+ it work is the repo's own build, not a fetch. Returns the upstream command
142
+ so the caller can name it instead of pretending; None for every other tap.
143
+
144
+ The tap may be addressed by full ``owner/repo`` or by the bare repo name a
145
+ clone directory carries, so both resolve.
146
+ """
147
+ if not tap:
148
+ return None
149
+ for row in load_registry_catalog():
150
+ cmd = row.get("self_installing")
151
+ if not cmd:
152
+ continue
153
+ name = row.get("name") or ""
154
+ if tap in (name, name.split("/")[-1]):
155
+ return cmd
156
+ return None
157
+
158
+
134
159
  def _merge(base: dict, override: dict) -> dict:
135
160
  out = deepcopy(base)
136
161
  # `or {}`: the only caller feeds this json.loads() of config.json, so a file
@@ -289,6 +289,25 @@ def _recorded_meta(*, count: bool = False) -> dict:
289
289
  con.close()
290
290
 
291
291
 
292
+ def tap_commits() -> dict[str, str]:
293
+ """Which registry commit this store holds vectors for, per tap safe-name.
294
+
295
+ The store already records this — ``build`` writes it and ``import_shard``
296
+ updates it — but only as a private meta field, so every caller that wanted
297
+ to ask "are these vectors for the commit I have?" had to re-open the
298
+ database. That question is the whole basis of skipping work: a weekly shard
299
+ refresh is a no-op exactly when the answer is yes, and without an accessor
300
+ the refresh would download and re-import a store's own rows every week.
301
+
302
+ Read without sqlite-vec (see :func:`_recorded_meta`) so a machine that lost
303
+ the extra still gets a truthful answer rather than an empty one.
304
+ """
305
+ commits = _recorded_meta().get("commits")
306
+ if not isinstance(commits, dict):
307
+ return {}
308
+ return {str(k): str(v) for k, v in commits.items() if v}
309
+
310
+
292
311
  # Why dense retrieval isn't serving, keyed by the `reason` status() returns.
293
312
  # Each names the ONE next action; the reason order in status() guarantees only
294
313
  # the first missing link is ever reported, so these never chain.
@@ -113,6 +113,18 @@ def tap_refresh_marker() -> Path:
113
113
  return state_dir() / "last-tap-refresh"
114
114
 
115
115
 
116
+ def shard_sync_marker() -> Path:
117
+ """File whose mtime records when published vectors were last ingested.
118
+
119
+ Deliberately beside the tap marker and NOT under ``cache/``: `boost clean`
120
+ sweeps `cache/*.json` whose stem is not a tap, and a marker there would be
121
+ deleted on every clean — after which search would nag about vectors that
122
+ were refreshed this morning. Same one-`stat` contract as the tap marker,
123
+ for the same reason: search reads it, and search does no network.
124
+ """
125
+ return state_dir() / "last-shard-sync"
126
+
127
+
116
128
  def snapshots_dir() -> Path:
117
129
  """Return the directory for ``snap-*`` store snapshot tarballs."""
118
130
  return state_dir() / "snapshots"
@@ -419,6 +419,27 @@ def unpin(name: str) -> Tap:
419
419
  return tap
420
420
 
421
421
 
422
+ def retarget(name: str, commit: str) -> Tap:
423
+ """Move an existing tap's clone to `commit` and pin it there.
424
+
425
+ The operation a published-vector refresh needs and no other entry point
426
+ offers. :func:`add` refuses a registry that is already tapped — deliberately
427
+ — so its ``at=`` pin only ever serves a first tap; :func:`update` moves a tap
428
+ to its branch HEAD and ``--force`` moves it and drops the pin. None of the
429
+ three can land on the commit a manifest names, and the chance that HEAD
430
+ happens to be that commit falls with every push upstream, which is why a
431
+ week-old install could see its vectors go stale with no way to act on it
432
+ but re-embedding locally.
433
+
434
+ Checkout first, pin second, and never the reverse: a pin recorded for a
435
+ tree that was not checked out is a lie :func:`update` would then honour by
436
+ skipping the tap forever.
437
+ """
438
+ tap = get(name)
439
+ gitutil.checkout_commit(tap.path, commit)
440
+ return pin(name, commit)
441
+
442
+
422
443
  def remove(name: str) -> Tap:
423
444
  """Deregister a tap and delete its clone and cache file.
424
445