boost-skill-cli 1.2.59__tar.gz → 1.2.61__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.59 → boost_skill_cli-1.2.61}/.vale/styles/config/vocabularies/boost/accept.txt +2 -0
  2. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/CLAUDE.md +35 -0
  3. {boost_skill_cli-1.2.59/boost_skill_cli.egg-info → boost_skill_cli-1.2.61}/PKG-INFO +24 -4
  4. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/README.md +23 -3
  5. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/_version.py +2 -2
  6. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/discovery.py +45 -2
  7. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/pkg.py +107 -1
  8. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/dense.py +19 -0
  9. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/paths.py +12 -0
  10. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/registry.py +21 -0
  11. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/shards.py +133 -0
  12. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61/boost_skill_cli.egg-info}/PKG-INFO +24 -4
  13. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_skill_cli.egg-info/SOURCES.txt +3 -0
  14. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/commands.html +5 -3
  15. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/index.html +4 -1
  16. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/bm25-has-no-stemming.md +2 -2
  17. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +2 -1
  18. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/branch-current-gate.md +2 -2
  19. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/browse-could-not-search-two-words.md +2 -2
  20. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/cli-output-ignored-the-terminal.md +2 -1
  21. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +2 -2
  22. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +2 -2
  23. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/dense-search-rescans-every-vector.md +2 -1
  24. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +2 -1
  25. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +2 -2
  26. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/gemini-hooks-host-aware.md +2 -2
  27. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/gemini-mcp-parity.md +2 -2
  28. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +2 -2
  29. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +2 -1
  30. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/openssf-gold-ceiling.md +2 -2
  31. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/openssf-silver.md +2 -2
  32. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/osps-baseline-levels.md +2 -2
  33. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/readme-prune-and-search-guide.md +2 -2
  34. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/search-and-browse-visual-refresh.md +2 -1
  35. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/serve-404-reflected-the-request.md +2 -1
  36. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +2 -1
  37. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +2 -2
  38. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +2 -2
  39. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +2 -2
  40. boost_skill_cli-1.2.61/docs/roadmap/items/weekly-vectors-had-no-ingestion-path.md +62 -0
  41. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap.html +132 -49
  42. boost_skill_cli-1.2.61/tests/unit/test_cli_update_shards.py +154 -0
  43. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_shards.py +7 -1
  44. boost_skill_cli-1.2.61/tests/unit/test_shards_ingest.py +289 -0
  45. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.gitattributes +0 -0
  46. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.gitignore +0 -0
  47. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.gitleaks.toml +0 -0
  48. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.htmlvalidate.json +0 -0
  49. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.lighthouserc.json +0 -0
  50. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.lycheeignore +0 -0
  51. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.markdownlint-cli2.jsonc +0 -0
  52. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.pre-commit-config.yaml +0 -0
  53. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.stylelintrc.json +0 -0
  54. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.vale/styles/boost/AIWriting.yml +0 -0
  55. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.vale/styles/boost/Terminology.yml +0 -0
  56. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.vale.ini +0 -0
  57. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/CODE_OF_CONDUCT.md +0 -0
  58. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/CONTRIBUTING.md +0 -0
  59. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/DCO +0 -0
  60. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/GOVERNANCE.md +0 -0
  61. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/LICENSE +0 -0
  62. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/MAINTAINERS.md +0 -0
  63. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/MANIFEST.in +0 -0
  64. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/Makefile +0 -0
  65. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/SECURITY.md +0 -0
  66. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/SUPPORT.md +0 -0
  67. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost +0 -0
  68. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/__init__.py +0 -0
  69. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/__main__.py +0 -0
  70. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/cli.py +0 -0
  71. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/cliparse.py +0 -0
  72. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/__init__.py +0 -0
  73. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/_common.py +0 -0
  74. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/bmad.py +0 -0
  75. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/configuration.py +0 -0
  76. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/hooks.py +0 -0
  77. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/info.py +0 -0
  78. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/intelligence.py +0 -0
  79. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/quality.py +0 -0
  80. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/quickstart.py +0 -0
  81. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/run.py +0 -0
  82. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/safety.py +0 -0
  83. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/taps.py +0 -0
  84. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/team.py +0 -0
  85. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/__init__.py +0 -0
  86. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/adapters.py +0 -0
  87. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/agents.py +0 -0
  88. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/ai.py +0 -0
  89. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/aihost.py +0 -0
  90. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/bmad.py +0 -0
  91. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/bootstrap.py +0 -0
  92. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/browse.py +0 -0
  93. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/builtin.py +0 -0
  94. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/capabilities.py +0 -0
  95. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/catalog.py +0 -0
  96. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/catalogbundle.py +0 -0
  97. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/chat.py +0 -0
  98. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/claude_settings.py +0 -0
  99. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/complete.py +0 -0
  100. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/config.py +0 -0
  101. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/ed25519.py +0 -0
  102. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/embed.py +0 -0
  103. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/faithfulness.py +0 -0
  104. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/frontmatter.py +0 -0
  105. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/gitutil.py +0 -0
  106. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/hookhost.py +0 -0
  107. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/imperative.py +0 -0
  108. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/injectscan.py +0 -0
  109. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/installscan.py +0 -0
  110. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/integrity.py +0 -0
  111. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/journal.py +0 -0
  112. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/localembed.py +0 -0
  113. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/lockfile.py +0 -0
  114. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/logs.py +0 -0
  115. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/mcp.py +0 -0
  116. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/mcpdecl.py +0 -0
  117. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/mcphost.py +0 -0
  118. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/minisign.py +0 -0
  119. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/nethttp.py +0 -0
  120. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/output.py +0 -0
  121. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/policy.py +0 -0
  122. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/projectlock.py +0 -0
  123. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/provenance.py +0 -0
  124. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/rag.py +0 -0
  125. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/resolve.py +0 -0
  126. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/rules.py +0 -0
  127. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/scopes.py +0 -0
  128. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/secretscan.py +0 -0
  129. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/selfupdate.py +0 -0
  130. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/serve.py +0 -0
  131. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/stackprobe.py +0 -0
  132. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/staleness.py +0 -0
  133. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/store.py +0 -0
  134. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/trustaudit.py +0 -0
  135. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/typosquat.py +0 -0
  136. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/updatediff.py +0 -0
  137. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/util.py +0 -0
  138. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/workflows.py +0 -0
  139. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/data/registries.json +0 -0
  140. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/data/rules/boost-first.mdc +0 -0
  141. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/errors.py +0 -0
  142. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/spin.py +0 -0
  143. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_langchain/__init__.py +0 -0
  144. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_langchain/_compat.py +0 -0
  145. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_langchain/graph.py +0 -0
  146. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_langchain/loader.py +0 -0
  147. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_langchain/py.typed +0 -0
  148. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_langchain/retriever.py +0 -0
  149. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  150. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  151. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_skill_cli.egg-info/requires.txt +0 -0
  152. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_skill_cli.egg-info/top_level.txt +0 -0
  153. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/codecov.yml +0 -0
  154. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/.claude/settings.local.json +0 -0
  155. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/DEBUGGING.md +0 -0
  156. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/adapters.html +0 -0
  157. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/architecture/README.md +0 -0
  158. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/architecture/c4-components-core.md +0 -0
  159. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/architecture/c4-containers.md +0 -0
  160. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/architecture/c4-context.md +0 -0
  161. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/architecture/c4-dynamic-install.md +0 -0
  162. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/bmad.md +0 -0
  163. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/gifs/distill.gif +0 -0
  164. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/gifs/doctor.gif +0 -0
  165. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/gifs/explain.gif +0 -0
  166. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/gifs/hooks.gif +0 -0
  167. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/gifs/install.gif +0 -0
  168. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/gifs/pulse.gif +0 -0
  169. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/gifs/search.gif +0 -0
  170. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/gifs/tap.gif +0 -0
  171. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/tapes/distill.tape +0 -0
  172. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/tapes/doctor.tape +0 -0
  173. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/tapes/explain.tape +0 -0
  174. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/tapes/hooks.tape +0 -0
  175. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/tapes/install.tape +0 -0
  176. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/tapes/pulse.tape +0 -0
  177. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/tapes/search.tape +0 -0
  178. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/tapes/tap.tape +0 -0
  179. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel.html +0 -0
  180. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/chat.html +0 -0
  181. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/code-review.md +0 -0
  182. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/commit-audit.md +0 -0
  183. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/demo-index.json +0 -0
  184. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/demo.gif +0 -0
  185. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/demo.html +0 -0
  186. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/demo.tape +0 -0
  187. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/dependencies.md +0 -0
  188. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/design-roadmap.html +0 -0
  189. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/eval-latest.json +0 -0
  190. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/eval.html +0 -0
  191. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/langchain.html +0 -0
  192. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/mcp-hub.html +0 -0
  193. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/openssf-badge.md +0 -0
  194. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/openssf-playbook.md +0 -0
  195. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/rag-architecture.md +0 -0
  196. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D01.md +0 -0
  197. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D02.md +0 -0
  198. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D03.md +0 -0
  199. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D04.md +0 -0
  200. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D05.md +0 -0
  201. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D06.md +0 -0
  202. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D07.md +0 -0
  203. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D08.md +0 -0
  204. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D09.md +0 -0
  205. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D10.md +0 -0
  206. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D11.md +0 -0
  207. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D12.md +0 -0
  208. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D13.md +0 -0
  209. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D14.md +0 -0
  210. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D15.md +0 -0
  211. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D16.md +0 -0
  212. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D17.md +0 -0
  213. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D18.md +0 -0
  214. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D19.md +0 -0
  215. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D20.md +0 -0
  216. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D21.md +0 -0
  217. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D22.md +0 -0
  218. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D23.md +0 -0
  219. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D24.md +0 -0
  220. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D25.md +0 -0
  221. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D26.md +0 -0
  222. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D27.md +0 -0
  223. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  224. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  225. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  226. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  227. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  228. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/ai-backend-fanout.md +0 -0
  229. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  230. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  231. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  232. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  233. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  234. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  235. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  236. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/bmad-hooks-all-hosts.md +0 -0
  237. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/boost-first-rule.md +0 -0
  238. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  239. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  240. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  241. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  242. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  243. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  244. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  245. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  246. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
  247. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  248. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  249. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  250. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  251. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  252. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  253. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/cli-command-audit.md +0 -0
  254. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  255. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  256. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/command-carousel-page.md +0 -0
  257. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  258. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  259. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  260. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  261. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  262. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  263. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  264. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  265. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
  266. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  267. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  268. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  269. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/dense-reindex-has-no-progress-or-durability.md +0 -0
  270. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/dense-reindex-reuses-whole-taps.md +0 -0
  271. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  272. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  273. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  274. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  275. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  276. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  277. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  278. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  279. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  280. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  281. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  282. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  283. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  284. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  285. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  286. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  287. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  288. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  289. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  290. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  291. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  292. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  293. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  294. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  295. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  296. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  297. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  298. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  299. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  300. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  301. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  302. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  303. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/github-community-health-files.md +0 -0
  304. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  305. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  306. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  307. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/gstack-tap-first-then-coexistence.md +0 -0
  308. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  309. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  310. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  311. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  312. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  313. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  314. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  315. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  316. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  317. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  318. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  319. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  320. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  321. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  322. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  323. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  324. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  325. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  326. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  327. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  328. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  329. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  330. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  331. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  332. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  333. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  334. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  335. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  336. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  337. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  338. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  339. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  340. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  341. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  342. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  343. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  344. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  345. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  346. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  347. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-cannot-read-a-skill-before-installing.md +0 -0
  348. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  349. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  350. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  351. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  352. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  353. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  354. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  355. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  356. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  357. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  358. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  359. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  360. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  361. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  362. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  363. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  364. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  365. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  366. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  367. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  368. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  369. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  370. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  371. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  372. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  373. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  374. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  375. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  376. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  377. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
  378. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/openssf-playbook.md +0 -0
  379. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  380. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  381. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  382. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
  383. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  384. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  385. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  386. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  387. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  388. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  389. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  390. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  391. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  392. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  393. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  394. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  395. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  396. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  397. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  398. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  399. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/published-shards-have-no-consumer.md +0 -0
  400. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  401. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  402. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  403. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  404. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  405. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  406. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  407. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  408. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  409. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/relicence-apache-2.md +0 -0
  410. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
  411. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  412. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  413. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  414. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  415. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  416. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  417. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  418. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  419. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  420. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  421. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  422. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  423. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  424. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  425. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  426. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  427. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  428. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  429. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  430. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  431. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  432. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  433. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  434. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  435. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  436. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  437. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  438. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  439. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
  440. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  441. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/shard-runs-reembed-everything-weekly.md +0 -0
  442. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
  443. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
  444. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  445. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  446. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  447. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  448. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  449. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  450. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  451. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  452. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  453. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  454. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  455. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  456. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
  457. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  458. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
  459. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
  460. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
  461. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  462. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
  463. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
  464. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
  465. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  466. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  467. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  468. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  469. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  470. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  471. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  472. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  473. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  474. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  475. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  476. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/vex-openvex-feed.md +0 -0
  477. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  478. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  479. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  480. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  481. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  482. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  483. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  484. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/workspace-scope-install.md +0 -0
  485. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/zip-strict-audit.md +0 -0
  486. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  487. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  488. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/security-design.md +0 -0
  489. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/semantic-search.md +0 -0
  490. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
  491. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/verifying-releases.md +0 -0
  492. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/vex/meta.md +0 -0
  493. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/vex/openvex.json +0 -0
  494. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
  495. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
  496. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
  497. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
  498. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/eslint.config.mjs +0 -0
  499. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/evals/README.md +0 -0
  500. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/evals/__init__.py +0 -0
  501. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/evals/baseline.json +0 -0
  502. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/evals/faithfulness.py +0 -0
  503. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/evals/golden_set.json +0 -0
  504. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/evals/make_corpus.py +0 -0
  505. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/evals/make_golden.py +0 -0
  506. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/evals/metrics.py +0 -0
  507. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/evals/publish_golden_dataset.py +0 -0
  508. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/evals/run_evals.py +0 -0
  509. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/examples/README.md +0 -0
  510. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/examples/adapt-demo.sh +0 -0
  511. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/examples/boost-run-prototype.sh +0 -0
  512. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/index.html +0 -0
  513. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/noxfile.py +0 -0
  514. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/pyproject.toml +0 -0
  515. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/coverage-tools.in +0 -0
  516. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/coverage-tools.txt +0 -0
  517. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/lint-tools.in +0 -0
  518. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/lint-tools.txt +0 -0
  519. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/mutation-tools.in +0 -0
  520. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/mutation-tools.txt +0 -0
  521. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/platform-pins.lock +0 -0
  522. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/release-tools.in +0 -0
  523. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/release-tools.txt +0 -0
  524. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/test-tools.in +0 -0
  525. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/test-tools.txt +0 -0
  526. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/a11y_check.py +0 -0
  527. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/add_spdx_headers.py +0 -0
  528. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/bench_cli.sh +0 -0
  529. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/build_command_reference.py +0 -0
  530. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/build_demo_index.py +0 -0
  531. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/build_registries.py +0 -0
  532. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/build_roadmap.py +0 -0
  533. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/build_scale_corpus.py +0 -0
  534. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/build_vex.py +0 -0
  535. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/check_anchors.py +0 -0
  536. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/check_branch_current.py +0 -0
  537. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/check_dco.py +0 -0
  538. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/check_licenses.py +0 -0
  539. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/check_reproducible.py +0 -0
  540. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/check_required_checks.py +0 -0
  541. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/ensure_eval_corpus.sh +0 -0
  542. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/eval_corpus.py +0 -0
  543. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/eval_explain.py +0 -0
  544. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/eval_gate.py +0 -0
  545. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/eval_recommend.py +0 -0
  546. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/eval_retrieval.py +0 -0
  547. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/eval_stats_summary.py +0 -0
  548. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/eval_tools.py +0 -0
  549. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/import_budget.py +0 -0
  550. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/lock_toolchain.py +0 -0
  551. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/measure_registry.py +0 -0
  552. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/mutation_gate.py +0 -0
  553. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/mutation_shards.py +0 -0
  554. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/mutation_weights.json +0 -0
  555. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/normalize_sdist.py +0 -0
  556. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/page_budget.py +0 -0
  557. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/perf_gate.py +0 -0
  558. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/post_deploy_smoke.py +0 -0
  559. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/publish_eval_json.py +0 -0
  560. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/publish_shards.py +0 -0
  561. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/release_guard.py +0 -0
  562. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/release_preflight.py +0 -0
  563. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/serve_docs.py +0 -0
  564. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/shard_plan.py +0 -0
  565. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/setup.cfg +0 -0
  566. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/sonar-project.properties +0 -0
  567. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/style/README.md +0 -0
  568. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/style/boost.css +0 -0
  569. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/style/boost.js +0 -0
  570. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/style/demo.html +0 -0
  571. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/adapt.feature +0 -0
  572. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/browse.feature +0 -0
  573. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/count.feature +0 -0
  574. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/discover.feature +0 -0
  575. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/doctor.feature +0 -0
  576. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/environment.py +0 -0
  577. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/explain.feature +0 -0
  578. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/index.feature +0 -0
  579. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/install.feature +0 -0
  580. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/list.feature +0 -0
  581. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/mcp.feature +0 -0
  582. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/search.feature +0 -0
  583. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/steps/cli_steps.py +0 -0
  584. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/steps/discovery_steps.py +0 -0
  585. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/steps/mcp_steps.py +0 -0
  586. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/steps/quality_steps.py +0 -0
  587. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/conftest.py +0 -0
  588. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/eval/baseline.json +0 -0
  589. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/eval/explain.jsonl +0 -0
  590. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/eval/golden-natural.jsonl +0 -0
  591. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/eval/golden.jsonl +0 -0
  592. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/eval/recommend.jsonl +0 -0
  593. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/eval/taps-scale.txt +0 -0
  594. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/eval/taps.txt +0 -0
  595. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/eval/tool_calls.jsonl +0 -0
  596. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_bmad_all_hosts.py +0 -0
  597. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_capabilities_policy.py +0 -0
  598. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_adapt.py +0 -0
  599. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_bmad.py +0 -0
  600. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_catalog.py +0 -0
  601. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_chat.py +0 -0
  602. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_configuration.py +0 -0
  603. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_discovery.py +0 -0
  604. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_hooks.py +0 -0
  605. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_hooks_gemini.py +0 -0
  606. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_info.py +0 -0
  607. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_intelligence.py +0 -0
  608. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_pane_width.py +0 -0
  609. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_pkg.py +0 -0
  610. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_quality.py +0 -0
  611. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_quickstart.py +0 -0
  612. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_tap_pins.py +0 -0
  613. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_taps.py +0 -0
  614. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_team.py +0 -0
  615. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_everyday_loop.py +0 -0
  616. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_integrity_enforce.py +0 -0
  617. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_kind_conformance.py +0 -0
  618. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_property_parsers.py +0 -0
  619. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_run.py +0 -0
  620. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_tap_signing.py +0 -0
  621. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_workspace_scope.py +0 -0
  622. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/README.md +0 -0
  623. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  624. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  625. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  626. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  627. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  628. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  629. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  630. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  631. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  632. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  633. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  634. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  635. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  636. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  637. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  638. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  639. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  640. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  641. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  642. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  643. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
  644. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
  645. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
  646. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/fuzz_frontmatter.py +0 -0
  647. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/fuzz_registry.py +0 -0
  648. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/langchain/conftest.py +0 -0
  649. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/langchain/test_graph.py +0 -0
  650. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/langchain/test_loader.py +0 -0
  651. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/langchain/test_retriever.py +0 -0
  652. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/make_fixture.py +0 -0
  653. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/perf/test_benchmarks.py +0 -0
  654. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/smoke.sh +0 -0
  655. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_a11y_check.py +0 -0
  656. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_action_pin_lockstep.py +0 -0
  657. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_adapters.py +0 -0
  658. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_adapters_multi.py +0 -0
  659. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_adapters_runner.py +0 -0
  660. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_agents.py +0 -0
  661. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_ai.py +0 -0
  662. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_aihost.py +0 -0
  663. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_bmad_core.py +0 -0
  664. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_boost_first_offer.py +0 -0
  665. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_bootstrap.py +0 -0
  666. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_bot_pr_dco.py +0 -0
  667. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_branch_current.py +0 -0
  668. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_browse.py +0 -0
  669. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_builtin.py +0 -0
  670. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_capabilities.py +0 -0
  671. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_catalog.py +0 -0
  672. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_catalogbundle.py +0 -0
  673. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_chat.py +0 -0
  674. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_check_anchors.py +0 -0
  675. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_check_dco.py +0 -0
  676. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_check_licenses.py +0 -0
  677. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_check_reproducible.py +0 -0
  678. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_claude_settings.py +0 -0
  679. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_clean_internal_cache.py +0 -0
  680. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_cliparse.py +0 -0
  681. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_codeql_analysis_key.py +0 -0
  682. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_command_reference_fresh.py +0 -0
  683. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_community_health_files.py +0 -0
  684. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_compact.py +0 -0
  685. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_complete.py +0 -0
  686. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_complete_rc_block.py +0 -0
  687. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_config.py +0 -0
  688. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_content_dedupe.py +0 -0
  689. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_content_identity.py +0 -0
  690. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_crash_redaction.py +0 -0
  691. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dedup_trust.py +0 -0
  692. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_demo_index.py +0 -0
  693. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense.py +0 -0
  694. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_embed_dedupe.py +0 -0
  695. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_entry_reuse.py +0 -0
  696. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_fallback.py +0 -0
  697. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_fix_hint.py +0 -0
  698. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_progress.py +0 -0
  699. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_quantized.py +0 -0
  700. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_ready_order.py +0 -0
  701. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_shard_real_schema.py +0 -0
  702. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
  703. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_shards.py +0 -0
  704. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_status.py +0 -0
  705. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_status_cheap.py +0 -0
  706. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dependabot_config.py +0 -0
  707. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_docs_pages_linked.py +0 -0
  708. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_docsite_chrome.py +0 -0
  709. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_ed25519.py +0 -0
  710. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_embed.py +0 -0
  711. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_embed_local.py +0 -0
  712. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_embed_truncated_response.py +0 -0
  713. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_entry_key.py +0 -0
  714. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_errors_and_cli_table.py +0 -0
  715. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_eval_baseline.py +0 -0
  716. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_eval_corpus.py +0 -0
  717. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_eval_faithfulness.py +0 -0
  718. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_eval_gate.py +0 -0
  719. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_eval_grading.py +0 -0
  720. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_eval_metrics.py +0 -0
  721. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_eval_stats_summary.py +0 -0
  722. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_eval_tools.py +0 -0
  723. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  724. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_faithfulness.py +0 -0
  725. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_frontmatter.py +0 -0
  726. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_fuzz_targets.py +0 -0
  727. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  728. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_gitleaks_config.py +0 -0
  729. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_gitutil.py +0 -0
  730. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_gitutil_lfs.py +0 -0
  731. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_gitutil_sparse.py +0 -0
  732. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_gstack_coexistence.py +0 -0
  733. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_hook_settings_hosts.py +0 -0
  734. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_hookhost.py +0 -0
  735. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_imperative.py +0 -0
  736. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_import_budget.py +0 -0
  737. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_injectscan.py +0 -0
  738. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_install_permission_error.py +0 -0
  739. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_installscan.py +0 -0
  740. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_integrity.py +0 -0
  741. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_journal.py +0 -0
  742. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_langchain_packaging.py +0 -0
  743. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_link_ownership.py +0 -0
  744. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_localembed.py +0 -0
  745. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_localembed_e2e.py +0 -0
  746. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_lockfile.py +0 -0
  747. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_logs.py +0 -0
  748. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_marketing_counts.py +0 -0
  749. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_mcp.py +0 -0
  750. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_mcp_install_scan.py +0 -0
  751. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_mcp_read.py +0 -0
  752. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_mcpdecl.py +0 -0
  753. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_mcphost.py +0 -0
  754. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_measure_registry.py +0 -0
  755. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_minisign.py +0 -0
  756. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_mutation_hardening.py +0 -0
  757. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_mutation_shards.py +0 -0
  758. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_mutation_subfile_shards.py +0 -0
  759. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_mutmut_source_paths.py +0 -0
  760. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_nethttp.py +0 -0
  761. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_normalize_sdist.py +0 -0
  762. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_output.py +0 -0
  763. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_page_budget.py +0 -0
  764. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_paths.py +0 -0
  765. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_perf_gate.py +0 -0
  766. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_pkg_confusions.py +0 -0
  767. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_pkg_injection.py +0 -0
  768. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_pkg_secrets.py +0 -0
  769. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_platform_pins.py +0 -0
  770. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_policy.py +0 -0
  771. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_post_deploy_smoke.py +0 -0
  772. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_project_mcp_sidecar.py +0 -0
  773. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_projectlock.py +0 -0
  774. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_provenance.py +0 -0
  775. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_publish_golden_dataset.py +0 -0
  776. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_rag.py +0 -0
  777. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_rag_fastpath.py +0 -0
  778. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_rag_fusion.py +0 -0
  779. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_registries_fresh.py +0 -0
  780. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_registry.py +0 -0
  781. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_registry_categories.py +0 -0
  782. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_registry_control_chars.py +0 -0
  783. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_registry_parallel.py +0 -0
  784. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_release_guard.py +0 -0
  785. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_release_preflight.py +0 -0
  786. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_required_checks.py +0 -0
  787. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_rerank_cache.py +0 -0
  788. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_resolve.py +0 -0
  789. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_roadmap_fresh.py +0 -0
  790. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_rules.py +0 -0
  791. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_scale_corpus.py +0 -0
  792. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_scopes.py +0 -0
  793. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_secretscan.py +0 -0
  794. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_selfupdate.py +0 -0
  795. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_serve.py +0 -0
  796. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_serve_docs.py +0 -0
  797. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_shard_plan.py +0 -0
  798. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_shards_incremental.py +0 -0
  799. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_shards_matrix.py +0 -0
  800. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_smoke_covers_every_command.py +0 -0
  801. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_spdx_headers.py +0 -0
  802. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_spin.py +0 -0
  803. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_stackprobe.py +0 -0
  804. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_staleness.py +0 -0
  805. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_store.py +0 -0
  806. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_store_materialize.py +0 -0
  807. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_sync_blocked_links.py +0 -0
  808. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  809. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_tap_pins.py +0 -0
  810. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_token_parity.py +0 -0
  811. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_toolchain_lock.py +0 -0
  812. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_trustaudit.py +0 -0
  813. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_typosquat.py +0 -0
  814. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_updatediff.py +0 -0
  815. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_util.py +0 -0
  816. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_version.py +0 -0
  817. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_version_tags.py +0 -0
  818. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_vex.py +0 -0
  819. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_visual_harness_flags.py +0 -0
  820. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_workflow_concurrency.py +0 -0
  821. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  822. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  823. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_workflow_timeouts.py +0 -0
  824. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_workflows.py +0 -0
  825. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  826. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/visual/a11y_check.mjs +0 -0
  827. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/visual/console_check.mjs +0 -0
  828. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/visual/package-lock.json +0 -0
  829. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/visual/package.json +0 -0
  830. {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/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.59
3
+ Version: 1.2.61
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.59'
22
- __version_tuple__ = version_tuple = (1, 2, 59)
21
+ __version__ = version = '1.2.61'
22
+ __version_tuple__ = version_tuple = (1, 2, 61)
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`")
@@ -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
 
@@ -34,9 +34,11 @@ from __future__ import annotations
34
34
  import hashlib
35
35
  import json
36
36
  import os
37
+ import time
37
38
  import urllib.error
38
39
  import urllib.parse
39
40
  import urllib.request
41
+ from contextlib import suppress
40
42
  from pathlib import Path
41
43
 
42
44
  from ..errors import BoostError
@@ -328,6 +330,13 @@ def sync(taps: list[str], commits: dict[str, str],
328
330
  results.append({"tap": tap, "status": status, "detail": reason,
329
331
  "chunks": int(row.get("chunks") or 0)})
330
332
  _emit(on_event, tap, status, reason)
333
+ if any(r["status"] == "imported" for r in results):
334
+ # Stamped here as well as in `ingest`, because this is the path a new
335
+ # machine takes: `boost quickstart` imports through `sync`, so without
336
+ # this the marker stays unset for exactly the users the staleness hint
337
+ # is written for, and the one surface that teaches `boost update
338
+ # --shards` exists would never fire on the onboarding path.
339
+ mark_synced()
331
340
  return results
332
341
 
333
342
 
@@ -343,3 +352,127 @@ def _size_label(row: dict) -> str:
343
352
  if not isinstance(size, int) or size <= 0:
344
353
  return ""
345
354
  return util.human_size(size)
355
+
356
+
357
+ #: How long published vectors may go un-ingested before `boost search` says so.
358
+ #: The publish cadence is weekly, so this is two missed runs — a hint that fires
359
+ #: the morning after every run is one users learn to read past, and the remedy
360
+ #: it names moves taps, which is not a thing to nag anyone into hourly.
361
+ STALE_SHARDS_DAYS = 14
362
+
363
+
364
+ def mark_synced() -> None:
365
+ """Stamp "published vectors were ingested just now"; never fails a run."""
366
+ with suppress(OSError):
367
+ paths.ensure_dirs()
368
+ paths.shard_sync_marker().write_text("", encoding="utf-8")
369
+
370
+
371
+ def sync_age_days() -> float | None:
372
+ """Days since published vectors were last ingested, or None if never.
373
+
374
+ None is not zero and not infinity, the same distinction
375
+ ``registry.refresh_age_days`` draws: a machine that embedded everything
376
+ locally has never ingested a shard and must not be nagged about the age of
377
+ something it does not use.
378
+ """
379
+ try:
380
+ age = time.time() - paths.shard_sync_marker().stat().st_mtime
381
+ except OSError:
382
+ return None
383
+ return max(0.0, age / 86400.0)
384
+
385
+
386
+ def ingest(taps: list[str], commits: dict[str, str],
387
+ built: dict[str, str] | None = None, manifest: dict | None = None,
388
+ cache_dir: Path | None = None, on_event=None,
389
+ retarget=None) -> list[dict]:
390
+ """Bring `taps` to the state the published manifest describes.
391
+
392
+ WHICH SIDE IS AUTHORITATIVE is the whole difference from :func:`sync`.
393
+ `sync` takes this machine's commits as given and asks whether a published
394
+ shard happens to match. That is right on the day a machine is set up, and
395
+ wrong a week later: the weekly run republishes against whatever the
396
+ registries have moved to, so for most taps the answer becomes "no", and the
397
+ user is told their vectors are stale with no way to act on it but hours of
398
+ local CPU. `ingest` reads the manifest as the *target*: a row for a tap this
399
+ machine holds at another commit is a reason to move the tap, because the
400
+ commit was pinned to match the vectors in the first place.
401
+
402
+ `built` maps tap name -> the commit this machine's vector store holds for
403
+ it (``dense.tap_commits``), and it is what makes the weekly case free: a tap
404
+ already at the row's commit *with vectors already built there* is skipped
405
+ without downloading anything. Passing only `commits` would re-download a
406
+ store's own rows every week.
407
+
408
+ ORDER IS LOAD-BEARING: download and verify the bytes, and only then move the
409
+ tap. Moving first and failing the download leaves the clone on a commit
410
+ whose vectors are stale but still present — the failure that looks like
411
+ nothing at all, and the one this module exists to refuse. `retarget` is
412
+ injected so the ordering can be tested without a git remote; it defaults to
413
+ ``registry.retarget``.
414
+
415
+ Never raises for one tap. A registry that dropped out of the manifest is
416
+ reported "unpublished" and left pinned exactly where it sits — falling back
417
+ to moving it to HEAD would be inventing a target no vectors describe.
418
+ """
419
+ from . import dense
420
+ manifest = manifest if manifest is not None else fetch_manifest()
421
+ why = incompatible(manifest)
422
+ if why:
423
+ return [{"tap": t, "status": "incompatible", "detail": why,
424
+ "moved": False} for t in taps]
425
+ if retarget is None:
426
+ from . import registry
427
+ retarget = registry.retarget
428
+ index = rows(manifest)
429
+ cache_dir = cache_dir or (paths.cache_dir() / "shards")
430
+ built = built or {}
431
+ results: list[dict] = []
432
+ for tap in taps:
433
+ row = index.get(tap)
434
+ if row is None:
435
+ results.append({"tap": tap, "status": "unpublished", "moved": False})
436
+ _emit(on_event, tap, "unpublished", "")
437
+ continue
438
+ want = str(row.get("commit") or "")
439
+ local = commits.get(tap, "")
440
+ if want and local == want == built.get(tap, ""):
441
+ results.append({"tap": tap, "status": "current", "moved": False})
442
+ _emit(on_event, tap, "current", "")
443
+ continue
444
+ dest = cache_dir / (tap.replace("/", "__") + ".shard.json")
445
+ moved = False
446
+ try:
447
+ _emit(on_event, tap, "downloading", _size_label(row))
448
+ download(row, dest, manifest)
449
+ shard = json.loads(dest.read_text(encoding="utf-8"))
450
+ if local != want:
451
+ _emit(on_event, tap, "moving", want[:7])
452
+ retarget(tap, want)
453
+ moved = True
454
+ ok, reason = dense.import_shard(shard, commit=want)
455
+ except BoostError as exc:
456
+ results.append({"tap": tap, "status": "failed", "moved": moved,
457
+ "detail": exc.message})
458
+ _emit(on_event, tap, "failed", exc.message)
459
+ continue
460
+ except (OSError, json.JSONDecodeError) as exc:
461
+ results.append({"tap": tap, "status": "failed", "moved": moved,
462
+ "detail": str(exc)})
463
+ _emit(on_event, tap, "failed", str(exc))
464
+ continue
465
+ finally:
466
+ # The shard is a transfer format, not a cache — see `sync`.
467
+ dest.unlink(missing_ok=True)
468
+ status = "imported" if ok else "failed"
469
+ results.append({"tap": tap, "status": status, "detail": reason,
470
+ "moved": moved, "chunks": int(row.get("chunks") or 0)})
471
+ _emit(on_event, tap, status, reason)
472
+ if any(r["status"] in ("imported", "current") for r in results):
473
+ # Stamped for "the manifest was read and acted on", not for "something
474
+ # changed": a run where every tap was already current is the successful
475
+ # weekly case, and leaving the marker cold would make search nag about
476
+ # vectors refreshed this morning.
477
+ mark_synced()
478
+ return results
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.59
3
+ Version: 1.2.61
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.
@@ -479,6 +479,7 @@ docs/roadmap/items/update-refreshes-rules-and-workflows.md
479
479
  docs/roadmap/items/update-reinstall-widens-agent-scope.md
480
480
  docs/roadmap/items/vex-openvex-feed.md
481
481
  docs/roadmap/items/visual-regression-pass-on-the-guide.md
482
+ docs/roadmap/items/weekly-vectors-had-no-ingestion-path.md
482
483
  docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md
483
484
  docs/roadmap/items/windows-in-the-ci-matrix.md
484
485
  docs/roadmap/items/wire-bdd-suite-into-ci.md
@@ -672,6 +673,7 @@ tests/unit/test_check_licenses.py
672
673
  tests/unit/test_check_reproducible.py
673
674
  tests/unit/test_claude_settings.py
674
675
  tests/unit/test_clean_internal_cache.py
676
+ tests/unit/test_cli_update_shards.py
675
677
  tests/unit/test_cliparse.py
676
678
  tests/unit/test_codeql_analysis_key.py
677
679
  tests/unit/test_command_reference_fresh.py
@@ -792,6 +794,7 @@ tests/unit/test_serve_docs.py
792
794
  tests/unit/test_shard_plan.py
793
795
  tests/unit/test_shards.py
794
796
  tests/unit/test_shards_incremental.py
797
+ tests/unit/test_shards_ingest.py
795
798
  tests/unit/test_shards_matrix.py
796
799
  tests/unit/test_smoke_covers_every_command.py
797
800
  tests/unit/test_spdx_headers.py