boost-skill-cli 1.2.96__tar.gz → 1.2.98__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 (966) hide show
  1. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/.vale/styles/config/vocabularies/boost/accept.txt +2 -0
  2. {boost_skill_cli-1.2.96/boost_skill_cli.egg-info → boost_skill_cli-1.2.98}/PKG-INFO +8 -1
  3. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/README.md +7 -0
  4. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/_version.py +2 -2
  5. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/commands/configuration.py +78 -7
  6. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/commands/discovery.py +60 -14
  7. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/commands/info.py +16 -1
  8. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/commands/intelligence.py +13 -2
  9. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/commands/pkg.py +39 -11
  10. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/commands/quality.py +38 -12
  11. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/commands/taps.py +46 -23
  12. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/commands/team.py +16 -10
  13. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/ai.py +40 -7
  14. boost_skill_cli-1.2.98/boost_cli/core/archive.py +79 -0
  15. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/browse.py +32 -0
  16. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/chat.py +13 -1
  17. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/complete.py +191 -14
  18. boost_skill_cli-1.2.98/boost_cli/core/discovery.py +46 -0
  19. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/journal.py +11 -0
  20. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/output.py +41 -22
  21. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/policy.py +51 -0
  22. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/registry.py +123 -59
  23. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/staleness.py +28 -0
  24. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/store.py +46 -1
  25. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/util.py +29 -1
  26. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/spin.py +16 -0
  27. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98/boost_skill_cli.egg-info}/PKG-INFO +8 -1
  28. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_skill_cli.egg-info/SOURCES.txt +5 -0
  29. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/DEBUGGING.md +1 -1
  30. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/commands.html +2 -2
  31. boost_skill_cli-1.2.98/docs/demo.gif +0 -0
  32. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/eval-latest.json +2 -2
  33. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-ai-degrade-note-blames-path-api-keys-regardless-of-cause-sev.md +3 -3
  34. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-browse-findings.md +3 -3
  35. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-completions-findings.md +4 -4
  36. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-export-findings.md +3 -3
  37. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-health-findings.md +3 -3
  38. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-index-findings.md +4 -4
  39. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-outdated-findings.md +3 -3
  40. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-policy-findings.md +2 -2
  41. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-preview-findings.md +2 -2
  42. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-schedule-findings.md +5 -3
  43. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-skill-profile-name-slugging-is-inconsistent-distill-o-accept.md +3 -3
  44. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-untap-findings.md +3 -3
  45. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-update-findings.md +2 -2
  46. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-who-findings.md +3 -3
  47. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap.html +35 -26
  48. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/bdd/features/browse.feature +1 -1
  49. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/conftest.py +14 -0
  50. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_cli_chat.py +11 -0
  51. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_cli_configuration.py +138 -3
  52. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_cli_discovery.py +133 -1
  53. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_cli_info.py +116 -1
  54. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_cli_intelligence.py +27 -0
  55. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_cli_pkg.py +114 -0
  56. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_cli_quality.py +24 -0
  57. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_cli_taps.py +65 -4
  58. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_cli_team.py +43 -2
  59. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_kind_conformance.py +1 -0
  60. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_ai.py +57 -1
  61. boost_skill_cli-1.2.98/tests/unit/test_archive.py +87 -0
  62. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_browse.py +39 -0
  63. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_chat.py +27 -0
  64. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_complete.py +173 -0
  65. boost_skill_cli-1.2.98/tests/unit/test_discovery.py +59 -0
  66. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_journal.py +19 -0
  67. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_mutation_hardening.py +11 -4
  68. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_output.py +49 -0
  69. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_policy.py +96 -0
  70. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_registry.py +153 -1
  71. boost_skill_cli-1.2.98/tests/unit/test_schedule_plist.py +41 -0
  72. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_spin.py +27 -0
  73. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_staleness.py +32 -0
  74. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_store.py +94 -0
  75. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_tap_pins.py +3 -1
  76. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_util.py +39 -0
  77. boost_skill_cli-1.2.96/docs/demo.gif +0 -0
  78. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/.gitattributes +0 -0
  79. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/.gitignore +0 -0
  80. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/.gitleaks.toml +0 -0
  81. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/.htmlvalidate.json +0 -0
  82. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/.lighthouserc.json +0 -0
  83. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/.lycheeignore +0 -0
  84. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/.markdownlint-cli2.jsonc +0 -0
  85. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/.pre-commit-config.yaml +0 -0
  86. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/.stylelintrc.json +0 -0
  87. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/.vale/styles/boost/AIWriting.yml +0 -0
  88. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/.vale/styles/boost/Terminology.yml +0 -0
  89. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/.vale.ini +0 -0
  90. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/CLAUDE.md +0 -0
  91. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/CODE_OF_CONDUCT.md +0 -0
  92. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/CONTRIBUTING.md +0 -0
  93. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/DCO +0 -0
  94. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/GOVERNANCE.md +0 -0
  95. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/LICENSE +0 -0
  96. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/MAINTAINERS.md +0 -0
  97. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/MANIFEST.in +0 -0
  98. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/Makefile +0 -0
  99. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/SECURITY.md +0 -0
  100. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/SUPPORT.md +0 -0
  101. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost +0 -0
  102. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/__init__.py +0 -0
  103. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/__main__.py +0 -0
  104. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/cli.py +0 -0
  105. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/cliparse.py +0 -0
  106. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/commands/__init__.py +0 -0
  107. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/commands/_common.py +0 -0
  108. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/commands/bmad.py +0 -0
  109. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/commands/hooks.py +0 -0
  110. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/commands/quickstart.py +0 -0
  111. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/commands/run.py +0 -0
  112. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/commands/safety.py +0 -0
  113. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/__init__.py +0 -0
  114. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/adapters.py +0 -0
  115. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/agents.py +0 -0
  116. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/aihost.py +0 -0
  117. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/bmad.py +0 -0
  118. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/bootstrap.py +0 -0
  119. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/builtin.py +0 -0
  120. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/capabilities.py +0 -0
  121. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/catalog.py +0 -0
  122. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/catalogbundle.py +0 -0
  123. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/claude_settings.py +0 -0
  124. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/config.py +0 -0
  125. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/dense.py +0 -0
  126. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/ed25519.py +0 -0
  127. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/embed.py +0 -0
  128. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/faithfulness.py +0 -0
  129. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/frontmatter.py +0 -0
  130. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/gitutil.py +0 -0
  131. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/hookhost.py +0 -0
  132. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/imperative.py +0 -0
  133. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/injectscan.py +0 -0
  134. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/installscan.py +0 -0
  135. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/integrity.py +0 -0
  136. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/jsonstate.py +0 -0
  137. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/localembed.py +0 -0
  138. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/lockfile.py +0 -0
  139. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/logs.py +0 -0
  140. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/mcp.py +0 -0
  141. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/mcpdecl.py +0 -0
  142. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/mcphost.py +0 -0
  143. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/minisign.py +0 -0
  144. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/nethttp.py +0 -0
  145. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/paths.py +0 -0
  146. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/projectlock.py +0 -0
  147. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/provenance.py +0 -0
  148. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/rag.py +0 -0
  149. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/resolve.py +0 -0
  150. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/rules.py +0 -0
  151. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/scopes.py +0 -0
  152. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/secretscan.py +0 -0
  153. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/selfupdate.py +0 -0
  154. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/serve.py +0 -0
  155. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/shards.py +0 -0
  156. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/stackprobe.py +0 -0
  157. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/trustaudit.py +0 -0
  158. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/typedvalue.py +0 -0
  159. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/typosquat.py +0 -0
  160. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/updatediff.py +0 -0
  161. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/core/workflows.py +0 -0
  162. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/data/registries.json +0 -0
  163. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/data/rules/boost-first.mdc +0 -0
  164. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_cli/errors.py +0 -0
  165. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_langchain/__init__.py +0 -0
  166. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_langchain/_compat.py +0 -0
  167. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_langchain/graph.py +0 -0
  168. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_langchain/loader.py +0 -0
  169. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_langchain/py.typed +0 -0
  170. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_langchain/retriever.py +0 -0
  171. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  172. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  173. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_skill_cli.egg-info/requires.txt +0 -0
  174. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/boost_skill_cli.egg-info/top_level.txt +0 -0
  175. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/codecov.yml +0 -0
  176. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/.claude/settings.local.json +0 -0
  177. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/adapters.html +0 -0
  178. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/architecture/README.md +0 -0
  179. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/architecture/c4-components-core.md +0 -0
  180. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/architecture/c4-containers.md +0 -0
  181. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/architecture/c4-context.md +0 -0
  182. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/architecture/c4-dynamic-install.md +0 -0
  183. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/bmad.md +0 -0
  184. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/carousel/gifs/distill.gif +0 -0
  185. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/carousel/gifs/doctor.gif +0 -0
  186. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/carousel/gifs/explain.gif +0 -0
  187. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/carousel/gifs/hooks.gif +0 -0
  188. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/carousel/gifs/install.gif +0 -0
  189. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/carousel/gifs/pulse.gif +0 -0
  190. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/carousel/gifs/search.gif +0 -0
  191. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/carousel/gifs/tap.gif +0 -0
  192. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/carousel/tapes/distill.tape +0 -0
  193. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/carousel/tapes/doctor.tape +0 -0
  194. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/carousel/tapes/explain.tape +0 -0
  195. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/carousel/tapes/hooks.tape +0 -0
  196. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/carousel/tapes/install.tape +0 -0
  197. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/carousel/tapes/pulse.tape +0 -0
  198. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/carousel/tapes/search.tape +0 -0
  199. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/carousel/tapes/tap.tape +0 -0
  200. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/carousel.html +0 -0
  201. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/chat.html +0 -0
  202. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/code-review.md +0 -0
  203. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/commit-audit.md +0 -0
  204. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/demo-index.json +0 -0
  205. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/demo.html +0 -0
  206. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/demo.tape +0 -0
  207. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/dependencies.md +0 -0
  208. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/design-roadmap.html +0 -0
  209. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/eval.html +0 -0
  210. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/index.html +0 -0
  211. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/langchain.html +0 -0
  212. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/mcp-hub.html +0 -0
  213. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/openssf-badge.md +0 -0
  214. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/openssf-playbook.md +0 -0
  215. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/rag-architecture.md +0 -0
  216. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D01.md +0 -0
  217. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D02.md +0 -0
  218. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D03.md +0 -0
  219. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D04.md +0 -0
  220. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D05.md +0 -0
  221. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D06.md +0 -0
  222. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D07.md +0 -0
  223. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D08.md +0 -0
  224. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D09.md +0 -0
  225. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D10.md +0 -0
  226. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D11.md +0 -0
  227. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D12.md +0 -0
  228. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D13.md +0 -0
  229. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D14.md +0 -0
  230. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D15.md +0 -0
  231. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D16.md +0 -0
  232. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D17.md +0 -0
  233. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D18.md +0 -0
  234. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D19.md +0 -0
  235. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D20.md +0 -0
  236. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D21.md +0 -0
  237. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D22.md +0 -0
  238. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D23.md +0 -0
  239. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D24.md +0 -0
  240. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D25.md +0 -0
  241. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D26.md +0 -0
  242. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D27.md +0 -0
  243. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  244. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  245. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  246. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  247. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  248. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/ai-backend-fanout.md +0 -0
  249. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  250. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  251. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  252. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  253. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-absorb-findings.md +0 -0
  254. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-adapt-findings.md +0 -0
  255. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-adapt-renders-every-sibling-of-a-flat-agents-dir-workflow-as.md +0 -0
  256. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-adapt-run-stats-edit-tag-export-reject-the-tap-name-qualifie.md +0 -0
  257. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-attest-findings.md +0 -0
  258. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-audit-findings.md +0 -0
  259. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-bmad-findings.md +0 -0
  260. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-bundle-findings.md +0 -0
  261. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-catalog-findings.md +0 -0
  262. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-catalog-resolve-one-s-duplicate-name-hint-advertises-path-to.md +0 -0
  263. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-changelog-findings.md +0 -0
  264. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-chat-findings.md +0 -0
  265. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-clean-counts-failed-removals-as-cleaned-journals-the-inflate.md +0 -0
  266. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-cli-py-commands-summaries-and-parser-help-contradict-behavio.md +0 -0
  267. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-cohort-findings.md +0 -0
  268. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-config-findings.md +0 -0
  269. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-config-policy-set-store-type-unchecked-values-consumers-cras.md +0 -0
  270. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-context-findings.md +0 -0
  271. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-corrupt-settings-config-state-json-silently-read-as-empty-th.md +0 -0
  272. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-create-distill-infer-absorb-install-silently-replace-an-inst.md +0 -0
  273. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-create-findings.md +0 -0
  274. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-declined-confirms-never-name-y-boost-assume-yes-snapshot-cle.md +0 -0
  275. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-deps-findings.md +0 -0
  276. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-discover-findings.md +0 -0
  277. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-distill-s-heuristic-merge-drops-repeated-fences-braces-writi.md +0 -0
  278. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-doctor-findings.md +0 -0
  279. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-drift-findings.md +0 -0
  280. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-dry-runs-disagree-with-the-real-run-compact-counts-bytes-it.md +0 -0
  281. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-edit-findings.md +0 -0
  282. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-evolve-findings.md +0 -0
  283. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-explain-findings.md +0 -0
  284. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-export-o-cohort-create-and-profile-save-silently-overwrite-e.md +0 -0
  285. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-fingerprint-findings.md +0 -0
  286. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-five-exit-70-crashes-on-bad-paths-data-catalog-export-serve.md +0 -0
  287. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-focus-profile-sideline-by-unlinking-without-recording-it-lis.md +0 -0
  288. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-git-operations-never-set-git-terminal-prompt-0-so-a-404-priv.md +0 -0
  289. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-hooks-remove-n-cannot-find-hooks-boost-itself-added-unknown.md +0 -0
  290. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-import-all-skips-the-injection-secret-scans-and-the-per-skil.md +0 -0
  291. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-import-findings.md +0 -0
  292. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-info-stats-explain-render-a-different-smaller-shape-for-rule.md +0 -0
  293. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-install-dry-run-promises-agents-the-real-install-never-write.md +0 -0
  294. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-install-findings.md +0 -0
  295. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-install-local-writes-empties-the-repo-s-mcp-json-silently-of.md +0 -0
  296. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-json-accepted-but-ignored-on-many-branches-cohort-config-pol.md +0 -0
  297. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-lint-findings.md +0 -0
  298. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-log-findings.md +0 -0
  299. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-log-simulate-changelog-headings-echo-the-raw-qualified-argum.md +0 -0
  300. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-mcp-findings.md +0 -0
  301. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-mcp-register-s-boost-first-consent-names-only-the-registered.md +0 -0
  302. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-missing-json-on-doctor-test-health-changelog-trending-log-ho.md +0 -0
  303. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-name-miss-errors-unknown-tap-qualifier-unnamed-no-close-matc.md +0 -0
  304. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-onboard-findings.md +0 -0
  305. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-out-table-clips-data-columns-to-an-assumed-80-columns-when-s.md +0 -0
  306. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-out-warn-defaults-to-stdout-infer-absorb-corrupt-skill-md-se.md +0 -0
  307. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-output-wrap-tokens-splits-punctuation-off-backtick-spans-ins.md +0 -0
  308. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-pinned-taps-silently-moved-to-head-by-update-re-clone-and-co.md +0 -0
  309. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-profile-findings.md +0 -0
  310. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-project-scope-seams-uninstall-verify-list-info-reinstall-dis.md +0 -0
  311. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-protocol-findings.md +0 -0
  312. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-pulse-findings.md +0 -0
  313. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-quarantine-findings.md +0 -0
  314. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-quarantine-pin-state-invisible-list-info-doctor-report-links.md +0 -0
  315. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-quickstart-findings.md +0 -0
  316. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-recommend-findings.md +0 -0
  317. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-reindex-findings.md +0 -0
  318. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-reinstall-sync-repair-and-audit-resolve-by-name-tap-ignoring.md +0 -0
  319. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-replay-findings.md +0 -0
  320. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-root-findings.md +0 -0
  321. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-rules-workflows-reported-as-skills-uninstall-claims-a-store.md +0 -0
  322. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-run-findings.md +0 -0
  323. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-search-findings.md +0 -0
  324. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-simulate-findings.md +0 -0
  325. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-singular-plural-misses-1-skills-1-issue-need-1-skill-pass-ac.md +0 -0
  326. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-six-count-flags-tap-chat-absorb-lint-changelog-hooks-skip-ut.md +0 -0
  327. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-snapshot-restore-replaces-the-lock-wholesale-orphaning-newer.md +0 -0
  328. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-stale-prose-after-shipped-changes-catalog-export-live-discov.md +0 -0
  329. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-stray-positionals-and-inapplicable-flags-silently-ignored-ac.md +0 -0
  330. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-sweep-positionals-json-lack-help-strings-and-no-command-help.md +0 -0
  331. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-sync-findings.md +0 -0
  332. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-tag-findings.md +0 -0
  333. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-tap-dry-run-is-silently-ignored-outside-catalog-spec-and-def.md +0 -0
  334. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-tap-findings.md +0 -0
  335. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-taps-findings.md +0 -0
  336. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-taps-outdated-decay-policy-snapshot-json-emit-display-string.md +0 -0
  337. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-test-findings.md +0 -0
  338. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-trust-findings.md +0 -0
  339. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-trust-verify-labels-a-manifest-tampered-after-signing-by-a-t.md +0 -0
  340. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-unpin-findings.md +0 -0
  341. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-verify-drift-say-nothing-installed-exit-0-and-doctor-says-lo.md +0 -0
  342. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-verify-findings.md +0 -0
  343. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  344. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
  345. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  346. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  347. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/bmad-hooks-all-hosts.md +0 -0
  348. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
  349. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/boost-first-rule.md +0 -0
  350. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  351. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  352. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/branch-current-gate.md +0 -0
  353. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  354. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  355. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
  356. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  357. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  358. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  359. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  360. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/capability-policy-skips-rules-and-workflows.md +0 -0
  361. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/catalog-categories-beyond-curated.md +0 -0
  362. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
  363. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  364. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  365. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  366. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  367. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  368. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  369. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/cli-audit-2026-08-full-sweep.md +0 -0
  370. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/cli-command-audit.md +0 -0
  371. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
  372. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  373. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  374. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
  375. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/command-carousel-page.md +0 -0
  376. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  377. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  378. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
  379. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  380. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/concurrent-rag-builds-delete-each-others-temp-index.md +0 -0
  381. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  382. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  383. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  384. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  385. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  386. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
  387. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/delay-true-defeats-the-log-suppress.md +0 -0
  388. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  389. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  390. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  391. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/dense-reindex-has-no-progress-or-durability.md +0 -0
  392. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/dense-reindex-reuses-whole-taps.md +0 -0
  393. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  394. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
  395. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/dense-store-holds-every-vector-once-per-copy.md +0 -0
  396. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  397. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  398. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  399. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  400. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  401. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
  402. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  403. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  404. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  405. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  406. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  407. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  408. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  409. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  410. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  411. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  412. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  413. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  414. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  415. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  416. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  417. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  418. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  419. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  420. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  421. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  422. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  423. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  424. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  425. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  426. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  427. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  428. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
  429. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
  430. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
  431. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/github-community-health-files.md +0 -0
  432. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  433. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  434. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  435. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/gstack-tap-first-then-coexistence.md +0 -0
  436. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  437. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  438. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  439. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  440. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  441. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  442. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  443. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  444. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  445. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  446. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  447. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  448. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  449. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  450. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  451. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  452. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  453. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  454. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  455. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  456. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  457. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  458. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  459. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  460. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  461. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  462. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  463. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  464. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  465. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  466. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
  467. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  468. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  469. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  470. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  471. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  472. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  473. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  474. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
  475. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  476. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  477. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-cannot-read-a-skill-before-installing.md +0 -0
  478. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  479. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  480. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  481. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  482. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  483. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  484. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  485. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  486. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  487. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  488. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  489. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  490. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  491. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  492. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  493. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  494. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  495. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  496. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  497. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  498. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  499. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mutation-shards-rerun-full-set-every-push.md +0 -0
  500. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  501. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  502. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/near-identical-copies-still-eat-the-slots.md +0 -0
  503. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  504. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  505. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  506. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  507. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  508. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  509. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
  510. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
  511. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/openssf-playbook.md +0 -0
  512. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/openssf-silver.md +0 -0
  513. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/osps-baseline-levels.md +0 -0
  514. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  515. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  516. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  517. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
  518. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  519. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  520. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  521. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  522. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  523. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  524. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  525. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  526. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  527. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  528. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  529. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  530. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  531. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  532. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  533. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/publish-the-keyword-index.md +0 -0
  534. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  535. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/published-shards-have-no-consumer.md +0 -0
  536. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  537. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  538. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  539. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  540. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  541. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
  542. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  543. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  544. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  545. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  546. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/relicence-apache-2.md +0 -0
  547. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
  548. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  549. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  550. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  551. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  552. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  553. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  554. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  555. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  556. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  557. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  558. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  559. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  560. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  561. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  562. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  563. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  564. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  565. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  566. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  567. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  568. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  569. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  570. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
  571. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  572. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  573. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  574. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  575. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  576. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  577. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
  578. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
  579. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
  580. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  581. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/shard-refresh-skips-processed-commits.md +0 -0
  582. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/shard-runs-reembed-everything-weekly.md +0 -0
  583. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
  584. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
  585. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  586. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/shrink-the-published-index.md +0 -0
  587. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  588. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  589. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
  590. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  591. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  592. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  593. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  594. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  595. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  596. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
  597. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  598. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  599. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  600. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
  601. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  602. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
  603. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
  604. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
  605. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
  606. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  607. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
  608. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
  609. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
  610. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  611. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  612. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  613. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  614. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  615. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  616. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  617. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  618. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  619. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  620. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  621. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/vex-openvex-feed.md +0 -0
  622. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  623. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/weekly-vectors-had-no-ingestion-path.md +0 -0
  624. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  625. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  626. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  627. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  628. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  629. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  630. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/workspace-scope-install.md +0 -0
  631. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/zip-strict-audit.md +0 -0
  632. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  633. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  634. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/security-design.md +0 -0
  635. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/semantic-search.md +0 -0
  636. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
  637. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/verifying-releases.md +0 -0
  638. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/vex/meta.md +0 -0
  639. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/vex/openvex.json +0 -0
  640. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
  641. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
  642. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
  643. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
  644. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/eslint.config.mjs +0 -0
  645. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/evals/README.md +0 -0
  646. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/evals/__init__.py +0 -0
  647. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/evals/baseline.json +0 -0
  648. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/evals/faithfulness.py +0 -0
  649. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/evals/golden_set.json +0 -0
  650. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/evals/make_corpus.py +0 -0
  651. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/evals/make_golden.py +0 -0
  652. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/evals/metrics.py +0 -0
  653. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/evals/publish_golden_dataset.py +0 -0
  654. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/evals/run_evals.py +0 -0
  655. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/examples/README.md +0 -0
  656. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/examples/adapt-demo.sh +0 -0
  657. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/examples/boost-run-prototype.sh +0 -0
  658. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/index.html +0 -0
  659. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/noxfile.py +0 -0
  660. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/pyproject.toml +0 -0
  661. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/requirements/coverage-tools.in +0 -0
  662. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/requirements/coverage-tools.txt +0 -0
  663. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/requirements/lint-tools.in +0 -0
  664. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/requirements/lint-tools.txt +0 -0
  665. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/requirements/mutation-tools.in +0 -0
  666. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/requirements/mutation-tools.txt +0 -0
  667. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/requirements/platform-pins.lock +0 -0
  668. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/requirements/release-tools.in +0 -0
  669. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/requirements/release-tools.txt +0 -0
  670. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/requirements/test-tools.in +0 -0
  671. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/requirements/test-tools.txt +0 -0
  672. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/a11y_check.py +0 -0
  673. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/add_spdx_headers.py +0 -0
  674. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/bench_cli.sh +0 -0
  675. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/build_command_reference.py +0 -0
  676. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/build_demo_index.py +0 -0
  677. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/build_registries.py +0 -0
  678. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/build_roadmap.py +0 -0
  679. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/build_scale_corpus.py +0 -0
  680. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/build_vex.py +0 -0
  681. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/check_anchors.py +0 -0
  682. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/check_branch_current.py +0 -0
  683. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/check_dco.py +0 -0
  684. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/check_licenses.py +0 -0
  685. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/check_reproducible.py +0 -0
  686. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/check_required_checks.py +0 -0
  687. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/ensure_eval_corpus.sh +0 -0
  688. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/eval_corpus.py +0 -0
  689. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/eval_explain.py +0 -0
  690. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/eval_gate.py +0 -0
  691. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/eval_recommend.py +0 -0
  692. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/eval_retrieval.py +0 -0
  693. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/eval_stats_summary.py +0 -0
  694. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/eval_tools.py +0 -0
  695. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/import_budget.py +0 -0
  696. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/lock_toolchain.py +0 -0
  697. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/measure_near_duplicate_bound.py +0 -0
  698. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/measure_registry.py +0 -0
  699. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/mutation_gate.py +0 -0
  700. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/mutation_shards.py +0 -0
  701. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/mutation_weights.json +0 -0
  702. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/normalize_sdist.py +0 -0
  703. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/page_budget.py +0 -0
  704. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/perf_gate.py +0 -0
  705. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/post_deploy_smoke.py +0 -0
  706. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/publish_eval_json.py +0 -0
  707. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/publish_shards.py +0 -0
  708. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/release_guard.py +0 -0
  709. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/release_preflight.py +0 -0
  710. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/serve_docs.py +0 -0
  711. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/scripts/shard_plan.py +0 -0
  712. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/setup.cfg +0 -0
  713. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/sonar-project.properties +0 -0
  714. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/style/README.md +0 -0
  715. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/style/boost.css +0 -0
  716. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/style/boost.js +0 -0
  717. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/style/demo.html +0 -0
  718. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/bdd/features/adapt.feature +0 -0
  719. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/bdd/features/count.feature +0 -0
  720. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/bdd/features/discover.feature +0 -0
  721. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/bdd/features/doctor.feature +0 -0
  722. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/bdd/features/environment.py +0 -0
  723. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/bdd/features/explain.feature +0 -0
  724. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/bdd/features/index.feature +0 -0
  725. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/bdd/features/install.feature +0 -0
  726. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/bdd/features/list.feature +0 -0
  727. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/bdd/features/mcp.feature +0 -0
  728. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/bdd/features/search.feature +0 -0
  729. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/bdd/features/steps/cli_steps.py +0 -0
  730. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/bdd/features/steps/discovery_steps.py +0 -0
  731. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/bdd/features/steps/mcp_steps.py +0 -0
  732. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/bdd/features/steps/quality_steps.py +0 -0
  733. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/eval/baseline.json +0 -0
  734. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/eval/explain.jsonl +0 -0
  735. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/eval/fixtures/claude_init_event.jsonl +0 -0
  736. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/eval/golden-natural.jsonl +0 -0
  737. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/eval/golden.jsonl +0 -0
  738. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/eval/recommend.jsonl +0 -0
  739. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/eval/taps-scale.txt +0 -0
  740. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/eval/taps.txt +0 -0
  741. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/eval/tool_calls.jsonl +0 -0
  742. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_bmad_all_hosts.py +0 -0
  743. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_capabilities_policy.py +0 -0
  744. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_cli_adapt.py +0 -0
  745. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_cli_bmad.py +0 -0
  746. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_cli_catalog.py +0 -0
  747. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_cli_hooks.py +0 -0
  748. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_cli_hooks_gemini.py +0 -0
  749. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_cli_pane_width.py +0 -0
  750. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_cli_quickstart.py +0 -0
  751. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_cli_tap_pins.py +0 -0
  752. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_everyday_loop.py +0 -0
  753. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_integrity_enforce.py +0 -0
  754. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_property_parsers.py +0 -0
  755. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_run.py +0 -0
  756. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_tap_signing.py +0 -0
  757. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/functional/test_workspace_scope.py +0 -0
  758. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/README.md +0 -0
  759. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  760. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  761. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  762. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  763. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  764. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  765. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  766. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  767. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  768. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  769. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  770. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  771. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  772. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  773. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  774. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  775. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  776. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  777. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  778. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  779. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
  780. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
  781. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
  782. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/fuzz_frontmatter.py +0 -0
  783. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/fuzz/fuzz_registry.py +0 -0
  784. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/langchain/conftest.py +0 -0
  785. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/langchain/test_graph.py +0 -0
  786. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/langchain/test_loader.py +0 -0
  787. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/langchain/test_retriever.py +0 -0
  788. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/make_fixture.py +0 -0
  789. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/perf/test_benchmarks.py +0 -0
  790. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/smoke.sh +0 -0
  791. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_a11y_check.py +0 -0
  792. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_action_pin_lockstep.py +0 -0
  793. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_adapters.py +0 -0
  794. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_adapters_multi.py +0 -0
  795. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_adapters_runner.py +0 -0
  796. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_agents.py +0 -0
  797. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_aihost.py +0 -0
  798. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_bmad_core.py +0 -0
  799. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_boost_first_offer.py +0 -0
  800. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_bootstrap.py +0 -0
  801. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_bot_pr_dco.py +0 -0
  802. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_branch_current.py +0 -0
  803. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_builtin.py +0 -0
  804. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_capabilities.py +0 -0
  805. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_catalog.py +0 -0
  806. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_catalogbundle.py +0 -0
  807. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_check_anchors.py +0 -0
  808. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_check_dco.py +0 -0
  809. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_check_licenses.py +0 -0
  810. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_check_reproducible.py +0 -0
  811. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_claude_settings.py +0 -0
  812. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_clean_internal_cache.py +0 -0
  813. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_cli_update_shards.py +0 -0
  814. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_cliparse.py +0 -0
  815. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_codeql_analysis_key.py +0 -0
  816. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_command_reference_fresh.py +0 -0
  817. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_community_health_files.py +0 -0
  818. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_compact.py +0 -0
  819. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_complete_rc_block.py +0 -0
  820. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_config.py +0 -0
  821. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_content_dedupe.py +0 -0
  822. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_content_identity.py +0 -0
  823. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_crash_redaction.py +0 -0
  824. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_dedup_trust.py +0 -0
  825. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_demo_index.py +0 -0
  826. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_dense.py +0 -0
  827. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_dense_boilerplate_cluster.py +0 -0
  828. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_dense_embed_dedupe.py +0 -0
  829. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_dense_entry_reuse.py +0 -0
  830. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_dense_entry_vectors.py +0 -0
  831. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_dense_fallback.py +0 -0
  832. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_dense_fix_hint.py +0 -0
  833. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_dense_progress.py +0 -0
  834. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_dense_quantized.py +0 -0
  835. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_dense_ready_order.py +0 -0
  836. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_dense_shard_real_schema.py +0 -0
  837. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
  838. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_dense_shards.py +0 -0
  839. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_dense_status.py +0 -0
  840. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_dense_status_cheap.py +0 -0
  841. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_dense_vector_dedupe.py +0 -0
  842. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_dependabot_config.py +0 -0
  843. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_distill_merge.py +0 -0
  844. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_docs_pages_linked.py +0 -0
  845. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_docsite_chrome.py +0 -0
  846. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_doctor_output_polish.py +0 -0
  847. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_drift_hint.py +0 -0
  848. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_ed25519.py +0 -0
  849. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_embed.py +0 -0
  850. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_embed_local.py +0 -0
  851. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_embed_truncated_response.py +0 -0
  852. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_entry_key.py +0 -0
  853. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_errors_and_cli_table.py +0 -0
  854. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_eval_baseline.py +0 -0
  855. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_eval_corpus.py +0 -0
  856. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_eval_faithfulness.py +0 -0
  857. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_eval_gate.py +0 -0
  858. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_eval_grading.py +0 -0
  859. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_eval_metrics.py +0 -0
  860. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_eval_stats_summary.py +0 -0
  861. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_eval_tools.py +0 -0
  862. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_eval_tools_probe.py +0 -0
  863. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  864. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_faithfulness.py +0 -0
  865. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_frontmatter.py +0 -0
  866. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_fuzz_targets.py +0 -0
  867. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  868. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_gitleaks_config.py +0 -0
  869. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_gitutil.py +0 -0
  870. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_gitutil_lfs.py +0 -0
  871. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_gitutil_sparse.py +0 -0
  872. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_gstack_coexistence.py +0 -0
  873. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_hook_settings_hosts.py +0 -0
  874. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_hookhost.py +0 -0
  875. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_imperative.py +0 -0
  876. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_import_budget.py +0 -0
  877. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_injectscan.py +0 -0
  878. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_install_permission_error.py +0 -0
  879. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_installscan.py +0 -0
  880. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_integrity.py +0 -0
  881. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_jsonstate.py +0 -0
  882. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_langchain_packaging.py +0 -0
  883. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_link_ownership.py +0 -0
  884. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_localembed.py +0 -0
  885. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_localembed_e2e.py +0 -0
  886. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_lockfile.py +0 -0
  887. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_logs.py +0 -0
  888. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_marketing_counts.py +0 -0
  889. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_mcp.py +0 -0
  890. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_mcp_install_scan.py +0 -0
  891. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_mcp_read.py +0 -0
  892. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_mcpdecl.py +0 -0
  893. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_mcphost.py +0 -0
  894. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_measure_registry.py +0 -0
  895. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_minisign.py +0 -0
  896. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_mutation_shards.py +0 -0
  897. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_mutation_subfile_shards.py +0 -0
  898. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_mutmut_source_paths.py +0 -0
  899. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_near_duplicate_collapse.py +0 -0
  900. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_nethttp.py +0 -0
  901. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_normalize_sdist.py +0 -0
  902. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_page_budget.py +0 -0
  903. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_paths.py +0 -0
  904. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_perf_gate.py +0 -0
  905. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_pkg_confusions.py +0 -0
  906. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_pkg_injection.py +0 -0
  907. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_pkg_secrets.py +0 -0
  908. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_platform_pins.py +0 -0
  909. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_post_deploy_smoke.py +0 -0
  910. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_project_mcp_sidecar.py +0 -0
  911. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_projectlock.py +0 -0
  912. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_provenance.py +0 -0
  913. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_publish_golden_dataset.py +0 -0
  914. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_rag.py +0 -0
  915. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_rag_fastpath.py +0 -0
  916. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_rag_fusion.py +0 -0
  917. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_registries_fresh.py +0 -0
  918. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_registry_categories.py +0 -0
  919. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_registry_control_chars.py +0 -0
  920. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_registry_parallel.py +0 -0
  921. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_release_guard.py +0 -0
  922. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_release_preflight.py +0 -0
  923. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_required_checks.py +0 -0
  924. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_rerank_cache.py +0 -0
  925. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_resolve.py +0 -0
  926. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_retrieve_any_near_duplicates.py +0 -0
  927. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_roadmap_fresh.py +0 -0
  928. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_rules.py +0 -0
  929. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_scale_corpus.py +0 -0
  930. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_scopes.py +0 -0
  931. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_secretscan.py +0 -0
  932. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_selfupdate.py +0 -0
  933. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_serve.py +0 -0
  934. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_serve_docs.py +0 -0
  935. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_shard_plan.py +0 -0
  936. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_shards.py +0 -0
  937. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_shards_incremental.py +0 -0
  938. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_shards_ingest.py +0 -0
  939. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_shards_matrix.py +0 -0
  940. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_smoke_covers_every_command.py +0 -0
  941. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_spdx_headers.py +0 -0
  942. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_stackprobe.py +0 -0
  943. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_store_materialize.py +0 -0
  944. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_sync_blocked_links.py +0 -0
  945. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  946. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_token_parity.py +0 -0
  947. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_toolchain_lock.py +0 -0
  948. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_trustaudit.py +0 -0
  949. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_typedvalue.py +0 -0
  950. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_typosquat.py +0 -0
  951. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_updatediff.py +0 -0
  952. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_version.py +0 -0
  953. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_version_tags.py +0 -0
  954. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_vex.py +0 -0
  955. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_visual_harness_flags.py +0 -0
  956. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_workflow_concurrency.py +0 -0
  957. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  958. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  959. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_workflow_timeouts.py +0 -0
  960. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_workflows.py +0 -0
  961. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  962. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/visual/a11y_check.mjs +0 -0
  963. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/visual/console_check.mjs +0 -0
  964. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/visual/package-lock.json +0 -0
  965. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/visual/package.json +0 -0
  966. {boost_skill_cli-1.2.96 → boost_skill_cli-1.2.98}/tests/visual/visual_check.mjs +0 -0
@@ -37,6 +37,8 @@ CRM
37
37
  cron
38
38
  crontab
39
39
  cyclomatic
40
+ dedupe
41
+ deduped
40
42
  Dependabot
41
43
  deps
42
44
  deserialization
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.96
3
+ Version: 1.2.98
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License-Expression: Apache-2.0
@@ -421,6 +421,13 @@ at least 95% alike, fold into one badged `×5`, with `^D` to show them again.
421
421
  Identity is the description and never the name: `code-reviewer` appears 75 times
422
422
  with 42 different descriptions, and those are 42 real skills.
423
423
 
424
+ Without a real TTY (a pipe, an IDE run console, a terminal curses can't drive)
425
+ `browse` falls back to a plain, deduped table — name, version, tap, kind — with
426
+ a footer breaking the total down by kind and pointing at `boost search` to
427
+ narrow it. The same fallback covers a curses initialization failure, so a
428
+ terminal that merely *claims* `isatty()` degrades gracefully instead of
429
+ crashing mid-draw.
430
+
424
431
  ## 81 commands, organized into 8 groups
425
432
 
426
433
  `boost --help` prints the full grouped list. For every flag of every command see
@@ -379,6 +379,13 @@ at least 95% alike, fold into one badged `×5`, with `^D` to show them again.
379
379
  Identity is the description and never the name: `code-reviewer` appears 75 times
380
380
  with 42 different descriptions, and those are 42 real skills.
381
381
 
382
+ Without a real TTY (a pipe, an IDE run console, a terminal curses can't drive)
383
+ `browse` falls back to a plain, deduped table — name, version, tap, kind — with
384
+ a footer breaking the total down by kind and pointing at `boost search` to
385
+ narrow it. The same fallback covers a curses initialization failure, so a
386
+ terminal that merely *claims* `isatty()` degrades gracefully instead of
387
+ crashing mid-draw.
388
+
382
389
  ## 81 commands, organized into 8 groups
383
390
 
384
391
  `boost --help` prints the full grouped list. For every flag of every command see
@@ -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.96'
22
- __version_tuple__ = version_tuple = (1, 2, 96)
21
+ __version__ = version = '1.2.98'
22
+ __version_tuple__ = version_tuple = (1, 2, 98)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -401,7 +401,7 @@ def cmd_create(argv) -> int:
401
401
  help="install the new skill immediately")
402
402
  args = p.parse_args(argv)
403
403
 
404
- name = util.slugify(args.name)
404
+ name = util.resolve_slug(args.name)
405
405
  parent = paths.expand(args.dir) if args.dir else Path.cwd()
406
406
  target = parent / name
407
407
  skill_md = target / "SKILL.md"
@@ -529,7 +529,9 @@ def cmd_policy(argv) -> int:
529
529
  everything = lockfile.all_installed()
530
530
  min_score = int(pol.get("min_quality_score") or 0)
531
531
  violations = [] # (name, problem)
532
+ not_checked: set[str] = set()
532
533
  total = 0
534
+ skill_count = len(everything.get("skill", {}))
533
535
  for kind, section in everything.items():
534
536
  for name, entry in sorted(section.items()):
535
537
  total += 1
@@ -541,12 +543,36 @@ def cmd_policy(argv) -> int:
541
543
  violations.append((label, "tap %s is blocked" % tap))
542
544
  if pol["allowed_taps"] and tap not in pol["allowed_taps"] and tap != "local":
543
545
  violations.append((label, "tap %s is not on the allowlist" % tap))
546
+ violations.extend(
547
+ (label, msg) for msg in policy.check_installed_version(entry))
548
+ # require_description and denied_capabilities need the item's
549
+ # own content, which only a skill has on disk (see
550
+ # store.read_skill_meta) — a rule or workflow lands in a shared
551
+ # agent file with no per-item body to check.
552
+ if kind == "skill" and (pol["require_description"] or pol["denied_capabilities"]):
553
+ meta_body = store.read_skill_meta(name)
554
+ if meta_body is None:
555
+ not_checked.add(
556
+ "require_description/denied_capabilities "
557
+ "(store copy unreadable)")
558
+ else:
559
+ meta, body = meta_body
560
+ violations.extend(
561
+ (label, msg)
562
+ for msg in policy.check_installed_meta(meta, body))
563
+ elif kind != "skill" and (pol["require_description"] or pol["denied_capabilities"]):
564
+ not_checked.add(
565
+ "require_description/denied_capabilities for %s items "
566
+ "(no on-disk body to check)" % kind)
544
567
  # Quality scoring reads a store directory, which only skills have.
545
568
  if min_score and kind == "skill":
546
569
  score, _notes = util.score_skill(store.skill_store_dir(name))
547
570
  if score < min_score:
548
571
  violations.append(
549
572
  (label, "quality score %d < required %d" % (score, min_score)))
573
+ max_skills_msg = policy.max_skills_violation(skill_count)
574
+ if max_skills_msg:
575
+ violations.append(("(environment)", max_skills_msg))
550
576
  unpinned = sorted(
551
577
  n if k == "skill" else "%s (%s)" % (n, k)
552
578
  for k, section in everything.items()
@@ -560,6 +586,8 @@ def cmd_policy(argv) -> int:
560
586
  else ", ".join("%d %s%s" % (n, kind, _s(n))
561
587
  for kind, n in counts.items()))
562
588
 
589
+ enforce = config.get("policy_enforce", True)
590
+
563
591
  if args.json:
564
592
  print(json.dumps({
565
593
  # "skills" keeps its original meaning — the skill count — with the
@@ -570,14 +598,23 @@ def cmd_policy(argv) -> int:
570
598
  "violations": [{"skill": s, "violation": v} for s, v in violations],
571
599
  "pin_only": bool(pol["pin_only"]),
572
600
  "unpinned": unpinned if pol["pin_only"] else [],
601
+ "enforce": enforce,
602
+ "not_checked": sorted(not_checked),
573
603
  }, indent=2))
574
604
  return 1 if violations else 0
575
605
 
576
606
  _warn_invalid_policy_values()
607
+ if not enforce:
608
+ out.warn("policy_enforce is off — `boost install` does not enforce "
609
+ "any of the rules below; this report names what would be "
610
+ "flagged, not what is currently blocked")
577
611
  if pol["pin_only"]:
578
- out.info("pin-only mode is on — installs/updates are frozen"
612
+ out.info("pin-only mode is on — new installs and skill updates are "
613
+ "frozen (tap refreshes via `boost update` are unaffected)"
579
614
  + (" (%d unpinned item(s): %s)"
580
615
  % (len(unpinned), ", ".join(unpinned)) if unpinned else ""))
616
+ for note in sorted(not_checked):
617
+ out.dim(" not checked: %s" % note)
581
618
  if violations:
582
619
  out.table(violations, headers=("ITEM", "VIOLATION"))
583
620
  print()
@@ -823,6 +860,17 @@ def cmd_completions(argv) -> int:
823
860
 
824
861
  detected = args.shell or Path(os.environ.get("SHELL", "")).name
825
862
 
863
+ # Fixed once, here, rather than in each branch below: an empty $SHELL
864
+ # used to fall through silently to the bash script (print path) or to
865
+ # `_rc_path("")`'s confusing "no one-shot install for yet" (install
866
+ # path) — neither ever told the user *why*. Raising here means every
867
+ # path downstream — print, --install, --uninstall, --dry-run — sees the
868
+ # same clear error instead of reinventing it.
869
+ if not detected:
870
+ raise BoostError(
871
+ "cannot detect your shell ($SHELL unset)",
872
+ hint="pass bash, zsh or fish, e.g. `boost completions bash`")
873
+
826
874
  if args.dry_run and not (args.install or args.uninstall):
827
875
  p.error("--dry-run qualifies --install or --uninstall; "
828
876
  "pass one of them")
@@ -851,6 +899,15 @@ def cmd_completions(argv) -> int:
851
899
  return 0
852
900
 
853
901
  shell = detected if detected in ("bash", "zsh", "fish") else "bash"
902
+ if shell != detected:
903
+ # A real shell boost has no script for (e.g. nu, xonsh) — silently
904
+ # substituting bash used to look like success while handing the user
905
+ # a script their shell cannot source. stderr, not stdout: stdout here
906
+ # is the completion script itself (piped to a file or `eval`'d), and
907
+ # a warning line mixed into it would corrupt both uses.
908
+ out.warn("%s is not a supported shell (bash, zsh, fish) — showing "
909
+ "bash's completion script instead" % detected,
910
+ stream=sys.stderr)
854
911
  # The script is a thin shim that calls `boost __complete`; the candidate
855
912
  # rules live in core/complete.py so all three shells share one tested
856
913
  # implementation instead of three hand-maintained static lists.
@@ -940,6 +997,21 @@ def _interval_label(seconds) -> str:
940
997
  return "%ss" % seconds
941
998
 
942
999
 
1000
+ def _plist_interval_seconds(text: str) -> int | None:
1001
+ """Parse a usable ``StartInterval`` out of plist ``text``.
1002
+
1003
+ None for both "no ``StartInterval`` key" and "``StartInterval`` present
1004
+ but not positive" — a zero or negative interval can never fire, and
1005
+ treating it as usable is what let the next-run loop in ``cmd_schedule``
1006
+ spin forever advancing ``nxt`` by zero seconds each pass.
1007
+ """
1008
+ m = re.search(r"<key>StartInterval</key>\s*<integer>(-?\d+)</integer>", text)
1009
+ if not m:
1010
+ return None
1011
+ secs = int(m.group(1))
1012
+ return secs if secs > 0 else None
1013
+
1014
+
943
1015
  def cmd_schedule(argv) -> int:
944
1016
  """boost schedule [status|enable [--interval 6h|12h|daily]|disable]"""
945
1017
  p = cliparse.parser(
@@ -965,10 +1037,8 @@ def cmd_schedule(argv) -> int:
965
1037
  plist = _plist_path()
966
1038
  if plist.exists():
967
1039
  present = True
968
- m = re.search(r"<key>StartInterval</key>\s*<integer>(\d+)</integer>",
969
- plist.read_text(encoding="utf-8"))
970
- if m:
971
- secs = int(m.group(1))
1040
+ secs = _plist_interval_seconds(plist.read_text(encoding="utf-8"))
1041
+ if secs is not None:
972
1042
  interval = _interval_label(secs)
973
1043
  nxt = datetime.fromtimestamp(plist.stat().st_mtime + secs)
974
1044
  while nxt < datetime.now():
@@ -995,7 +1065,8 @@ def cmd_schedule(argv) -> int:
995
1065
  out.kv("platform", "%s (%s)" % (sys.platform, "launchd" if darwin else "cron"))
996
1066
  out.kv("scheduled", "yes" if present else "no")
997
1067
  if present:
998
- out.kv("interval", "every %s" % interval)
1068
+ out.kv("interval", "every %s" % interval if interval is not None
1069
+ else "unknown (plist has no usable StartInterval)")
999
1070
  out.kv("next run", next_run.strftime("%Y-%m-%d %H:%M (approx)")
1000
1071
  if next_run else "unknown")
1001
1072
  else:
@@ -37,6 +37,7 @@ from ..core import (
37
37
  store,
38
38
  util,
39
39
  )
40
+ from ..core import discovery as discovery_core
40
41
  from ..core import output as out
41
42
  from ..core.stackprobe import detect_stack # re-exported: shared with Quality
42
43
  from ..errors import BoostError
@@ -64,6 +65,17 @@ def _discovery_path() -> Path:
64
65
  return paths.cache_dir() / "discovery.json"
65
66
 
66
67
 
68
+ def _index_item_count(path: Path) -> int:
69
+ """Item count of an existing discovery.json, or 0 if absent/unreadable."""
70
+ if not path.exists():
71
+ return 0
72
+ try:
73
+ data = json.loads(path.read_text(encoding="utf-8"))
74
+ except (OSError, json.JSONDecodeError):
75
+ return 0
76
+ return len(data.get("items") or [])
77
+
78
+
67
79
  def _ai_rank(query: str, scored):
68
80
  """Ask Claude to reorder the top hits. Returns a new scored list or None."""
69
81
  top = scored[:15]
@@ -172,14 +184,18 @@ def cmd_search(argv):
172
184
  # is pinned in tests/eval/baseline.json. Map instead of moving either.
173
185
  ranker = _ENGINE_LABEL.get(engine, engine) if use_rag else "heuristic relevance"
174
186
  if args.smart:
187
+ reranked = None
175
188
  if ai.available():
176
189
  with spin.Spinner("ranking %d matches with Claude" % len(scored)):
177
190
  reranked = _ai_rank(query, scored)
178
- if reranked:
179
- scored, ranker = reranked, "Claude Haiku relevance"
191
+ if reranked:
192
+ scored, ranker = reranked, "Claude Haiku relevance"
180
193
  else:
181
- # On stderr and unconditional on --json: a script reading stdout
182
- # as JSON must still learn --smart silently did nothing.
194
+ # Fires whether AI was never available or was tried and failed —
195
+ # a silent unranked list otherwise looks identical to a
196
+ # deliberate BM25-only result. On stderr and unconditional on
197
+ # --json: a script reading stdout as JSON must still learn that
198
+ # --smart silently did nothing.
183
199
  out.warn(ai.fallback_note(), wrap=True, stream=sys.stderr)
184
200
  if args.as_json:
185
201
  print(json.dumps([e | {"score": s, "ranker": ranker}
@@ -648,19 +664,21 @@ def cmd_index(argv):
648
664
  % (urllib.parse.quote(q, safe=":"), page)],
649
665
  capture_output=True, text=True, timeout=120)
650
666
  except (subprocess.TimeoutExpired, OSError) as e:
667
+ spin.progress_clear()
651
668
  raise BoostError("gh api timed out on page %d" % page, hint=str(e)) from e
652
669
  if proc.returncode != 0:
653
- tail = "\n".join((proc.stderr or proc.stdout or "").strip()
654
- .splitlines()[-3:])
670
+ spin.progress_clear()
655
671
  if not items:
656
672
  raise BoostError("GitHub code search failed",
657
- hint=tail or "check `gh auth status`")
673
+ hint=discovery_core.gh_failure_hint(
674
+ proc.stderr or proc.stdout or ""))
658
675
  out.warn("page %d failed — keeping the %d items fetched so far"
659
676
  % (page, len(items)))
660
677
  break
661
678
  try:
662
679
  data = json.loads(proc.stdout)
663
680
  except json.JSONDecodeError:
681
+ spin.progress_clear()
664
682
  raise BoostError("gh api returned unparseable JSON",
665
683
  hint="try `boost index` again, or `gh auth status`") from None
666
684
  if page == 1:
@@ -678,8 +696,14 @@ def cmd_index(argv):
678
696
  break
679
697
  if len(items) >= args.limit or len(batch) < 100:
680
698
  break
699
+ dpath = _discovery_path()
700
+ if not discovery_core.should_write_index(len(items), dpath.exists()):
701
+ prev = _index_item_count(dpath)
702
+ out.warn("no SKILL.md files match %s — keeping the previous index "
703
+ "of %d entries" % (query or "your query", prev))
704
+ return 0
681
705
  paths.ensure_dirs()
682
- _discovery_path().write_text(json.dumps(
706
+ dpath.write_text(json.dumps(
683
707
  {"generated": util.now_iso(), "github_total": total, "query": query,
684
708
  "items": items}, indent=1), encoding="utf-8")
685
709
  repos = len({it["repo"] for it in items})
@@ -994,11 +1018,23 @@ def cmd_recommend(argv):
994
1018
 
995
1019
  def _browse_plain(entries, why: str):
996
1020
  out.warn(why + " — showing the full catalog")
997
- out.table([(e["name"], "v" + e["version"], e["tap"],
998
- "★" if e.get("curated") else "") for e in entries],
999
- headers=("name", "version", "tap", ""))
1000
- out.info(out.role("%d skills · install with `boost install <name>`"
1001
- % len(entries), "muted"))
1021
+ # Same collapse the TUI does: a registry renders one skill into
1022
+ # .claude/, .cursor/, .gemini/ and a plugin root, and this fallback used
1023
+ # to list every copy with nothing to tell them apart.
1024
+ unique = [e for e, _n in browse.dedupe(entries)]
1025
+ show_curated = any(e.get("curated") for e in unique)
1026
+ headers = ["name", "version", "tap", "kind"]
1027
+ rows = [[e["name"], "v" + e["version"], e["tap"],
1028
+ out.kind_label(e.get("kind", "skill"))]
1029
+ for e in unique]
1030
+ if show_curated:
1031
+ headers.append("")
1032
+ for row, e in zip(rows, unique, strict=True):
1033
+ row.append("★" if e.get("curated") else "")
1034
+ out.table([tuple(row) for row in rows], headers=tuple(headers))
1035
+ out.info(out.role(
1036
+ "%s · install with `boost install <name>` · narrow with `boost search <query>`"
1037
+ % browse.plain_footer(unique), "muted"))
1002
1038
  return 0
1003
1039
 
1004
1040
 
@@ -1747,7 +1783,17 @@ def cmd_browse(argv):
1747
1783
  import curses
1748
1784
  except ImportError:
1749
1785
  return _browse_plain(entries, "curses is unavailable on this Python")
1750
- picked = _browse_tui(curses, entries)
1786
+ try:
1787
+ picked = _browse_tui(curses, entries)
1788
+ except curses.error as e:
1789
+ # An fd that claims isatty() but isn't a real pty (IDE run consoles,
1790
+ # `script`, TERM=dumb) can fail deep inside curses.wrapper's own
1791
+ # setup/teardown rather than at the isatty() check above. wrapper
1792
+ # already ran its finally block (endwin() included), so the screen is
1793
+ # restored by the time this is caught — printing here lands on a
1794
+ # normal terminal, not a hosed one.
1795
+ return _browse_plain(entries,
1796
+ "the terminal does not support curses (%s)" % e)
1751
1797
  if not picked:
1752
1798
  return 0
1753
1799
  # The browser installs in place now, so anything it hands back is usually
@@ -703,8 +703,18 @@ def cmd_preview(argv):
703
703
  args = ap.parse_args(argv)
704
704
  text, _kind, lock, cat = _resolve_text(args.name)
705
705
  meta, body = frontmatter.parse(text)
706
+ if not sys.stdout.isatty():
707
+ # A piped/redirected preview renders nothing — no ANSI, so the
708
+ # per-chunk `_inline()` substitution would strip `**`/backtick
709
+ # markers with no styled substitute, and lines with no special-cased
710
+ # handling (a bare `---`, a wrapped `> quote` continuation) print
711
+ # mangled rather than as either faithful Markdown or a real render.
712
+ # `boost cat` already resolves this the same way: raw text through.
713
+ sys.stdout.write(body if body.endswith("\n") else body + "\n")
714
+ return 0
715
+ version = meta.get("version") or (lock or cat or {}).get("version") or "?"
706
716
  print(out.titlebar("%s · v%s · %s" % (meta.get("name") or args.name,
707
- meta.get("version") or "?",
717
+ version,
708
718
  (lock or cat or {}).get("tap", "local"))))
709
719
  print()
710
720
  _render_markdown(body)
@@ -757,6 +767,11 @@ def cmd_explain(argv):
757
767
  "extractive summary instead"
758
768
  % ", ".join(faithfulness.ungrounded_terms(reply, text)[:4]),
759
769
  stream=sys.stderr)
770
+ else:
771
+ # The backend was available but the call itself produced nothing —
772
+ # distinct from "no backend at all", so it gets the same
773
+ # attributed note rather than silence.
774
+ out.warn(ai.fallback_note(), wrap=True, stream=sys.stderr)
760
775
  else:
761
776
  out.warn(ai.fallback_note(), wrap=True, stream=sys.stderr)
762
777
  meta, body = frontmatter.parse(text)
@@ -14,6 +14,7 @@ import difflib
14
14
  import fnmatch
15
15
  import json
16
16
  import re
17
+ import shlex
17
18
  import sys
18
19
  import tempfile
19
20
  import textwrap
@@ -213,7 +214,8 @@ def cmd_distill(argv: list[str]) -> int:
213
214
  meta, body = frontmatter.parse(text)
214
215
  sources.append({"name": name, "origin": origin, "text": text,
215
216
  "meta": meta, "body": body})
216
- new = args.output or (names[0] + "-distilled")
217
+ new = util.resolve_slug(args.output, what="output name") if args.output \
218
+ else names[0] + "-distilled"
217
219
 
218
220
  out.heading("distilling %s → %s" % (", ".join(names), new))
219
221
  merged = _distill_ai(new, sources) if ai.available() else None
@@ -227,7 +229,9 @@ def cmd_distill(argv: list[str]) -> int:
227
229
  dest = Path.cwd() / new / "SKILL.md"
228
230
  if not _write_generated(dest, merged, yes=args.yes):
229
231
  return 1
230
- out.info(out.role("install it with `boost import ./%s`" % new, "muted"))
232
+ out.info(out.role(
233
+ "install it with `boost import %s`" % shlex.quote("./" + new),
234
+ "muted"))
231
235
  journal.log("distill", new, sources=names)
232
236
  return 0
233
237
 
@@ -1188,6 +1192,8 @@ def cmd_impact(argv: list[str]) -> int:
1188
1192
  if reply:
1189
1193
  print()
1190
1194
  print(textwrap.indent(textwrap.fill(reply, width=76), " "))
1195
+ else:
1196
+ _note_fallback()
1191
1197
  else:
1192
1198
  _note_fallback()
1193
1199
  out.dim(" " + note)
@@ -1252,6 +1258,11 @@ def _print_reply(reply: chat_engine.Reply, show_sources: bool) -> None:
1252
1258
  # a downgraded answer that looks identical to a confident one.
1253
1259
  out.warn("the AI reply named something outside the retrieved skills — "
1254
1260
  "showing the grounded matches instead")
1261
+ elif reply.ai_failed:
1262
+ # AI was available and was tried, but the call itself produced
1263
+ # nothing — distinct from never having a backend, and otherwise
1264
+ # indistinguishable from a deliberate extractive answer.
1265
+ out.warn(ai.fallback_note(), wrap=True, stream=sys.stderr)
1255
1266
 
1256
1267
 
1257
1268
  def cmd_chat(argv: list[str]) -> int:
@@ -21,6 +21,7 @@ from .. import cliparse, spin
21
21
  from ..core import (
22
22
  adapters,
23
23
  agents,
24
+ archive,
24
25
  catalog,
25
26
  complete,
26
27
  config,
@@ -1072,9 +1073,12 @@ def cmd_update(argv: list[str]) -> int:
1072
1073
  out.info("no taps configured — start with `boost tap --defaults`")
1073
1074
  return 0
1074
1075
  moved = []
1076
+ pinned_skips = 0
1075
1077
  for tname, summary in results.items():
1076
1078
  if "skipped" not in summary:
1077
1079
  catalog.rebuild_tap(registry.get(tname))
1080
+ else:
1081
+ pinned_skips += 1
1078
1082
  # "abc1234 → def5678" is a tap whose tree changed; "already up to date"
1079
1083
  # and "pinned at ..." are not. Only the first invalidates vectors.
1080
1084
  if "→" in summary:
@@ -1090,6 +1094,14 @@ def cmd_update(argv: list[str]) -> int:
1090
1094
  "%d of %d taps could not be refreshed — the rest are up to date. "
1091
1095
  "Drop a dead one with `boost untap <name>`."
1092
1096
  % (len(failures), len(results) + len(failures)), "muted"))
1097
+ if pinned_skips:
1098
+ out.info(out.role(
1099
+ "%d tap%s pinned and left alone — `boost update --force` moves "
1100
+ "%s too, dropping %s pin%s"
1101
+ % (pinned_skips, "s" if pinned_skips != 1 else "",
1102
+ "them" if pinned_skips != 1 else "it",
1103
+ "their" if pinned_skips != 1 else "its",
1104
+ "s" if pinned_skips != 1 else ""), "muted"))
1093
1105
  # A pulled tap can add, drop, or rename catalogue entries, so the
1094
1106
  # completion name cache must not survive an update unrefreshed.
1095
1107
  complete.refresh_names()
@@ -1144,10 +1156,18 @@ def cmd_update(argv: list[str]) -> int:
1144
1156
  upgraded += _update_materialized("rule", lockfile.installed_rules(), results)
1145
1157
  upgraded += _update_materialized("workflow", lockfile.installed_workflows(), results)
1146
1158
  if not upgraded:
1147
- # Don't claim "everything up to date" when some taps were never
1148
- # reached — that is exactly the false all-clear this fix exists to stop.
1149
- out.ok("everything up to date" if not failures
1150
- else "everything up to date, except the taps above")
1159
+ if pinned_skips and pinned_skips == len(results) and not failures:
1160
+ # Every tap was a pinned skip: nothing was actually checked over
1161
+ # the network, which "everything up to date" would misreport as
1162
+ # a fresh confirmation rather than the truth — the run never left
1163
+ # config.json.
1164
+ out.ok("nothing to refresh — all taps pinned")
1165
+ else:
1166
+ # Don't claim "everything up to date" when some taps were never
1167
+ # reached — that is exactly the false all-clear this fix exists
1168
+ # to stop.
1169
+ out.ok("everything up to date" if not failures
1170
+ else "everything up to date, except the taps above")
1151
1171
  # Non-zero only when nothing was refreshed at all. A partial run did the job
1152
1172
  # it could do, and failing it would put us back to one dead upstream
1153
1173
  # breaking `boost update` for the other 79.
@@ -1769,11 +1789,17 @@ def cmd_export(argv: list[str]) -> int:
1769
1789
  "agent config files; reinstall them "
1770
1790
  "from their tap")
1771
1791
  if not store.skill_store_dir(name).is_dir():
1772
- raise BoostError("store dir for %s is missing" % name,
1773
- hint="repair with `boost sync`")
1792
+ raise BoostError(
1793
+ "store dir for %s is missing" % name,
1794
+ hint=("repair with `boost reinstall %s`" % name)
1795
+ if entry.get("tap") == "local"
1796
+ else "repair with `boost sync`")
1774
1797
  chosen[name] = entry
1775
1798
  stamp = datetime.now(UTC).strftime("%Y%m%d")
1776
- ext = ".zip" if args.zip else ".tar.gz"
1799
+ use_zip, format_warning = archive.resolve_export_format(args.out, args.zip)
1800
+ if format_warning:
1801
+ out.warn(format_warning)
1802
+ ext = ".zip" if use_zip else ".tar.gz"
1777
1803
  dest = paths.expand(args.out) if args.out else Path(
1778
1804
  "boost-skills-%s%s" % (stamp, ext))
1779
1805
  if dest.exists() and not args.force:
@@ -1782,9 +1808,10 @@ def cmd_export(argv: list[str]) -> int:
1782
1808
  "different -o path")
1783
1809
  manifest = _boostfile_text(chosen, via="boost export")
1784
1810
  try:
1785
- if args.zip:
1811
+ if use_zip:
1786
1812
  with zipfile.ZipFile(str(dest), "w", zipfile.ZIP_DEFLATED) as zf:
1787
- zf.writestr("Boostfile", manifest)
1813
+ zf.writestr(archive.boostfile_zipinfo(
1814
+ datetime.now(UTC).timetuple()[:6]), manifest)
1788
1815
  for name in chosen:
1789
1816
  sdir = store.skill_store_dir(name)
1790
1817
  for f in sorted(p for p in sdir.rglob("*") if p.is_file()):
@@ -1796,9 +1823,10 @@ def cmd_export(argv: list[str]) -> int:
1796
1823
  ti.size = len(data)
1797
1824
  ti.mtime = int(datetime.now(UTC).timestamp())
1798
1825
  ti.mode = 0o644
1799
- tf.addfile(ti, io.BytesIO(data))
1826
+ tf.addfile(archive.normalize_tar_member(ti), io.BytesIO(data))
1800
1827
  for name in chosen:
1801
- tf.add(str(store.skill_store_dir(name)), arcname=name)
1828
+ tf.add(str(store.skill_store_dir(name)), arcname=name,
1829
+ filter=archive.normalize_tar_member)
1802
1830
  except OSError as e:
1803
1831
  raise BoostError("cannot write %s: %s" % (_tilde(dest), e.strerror or e),
1804
1832
  hint="check the output path exists and is writable") from e
@@ -1233,6 +1233,12 @@ def cmd_conflict(argv):
1233
1233
  for i, p in enumerate(heuristic, 1):
1234
1234
  if i in confirmed:
1235
1235
  p["kind"] = "ai-confirmed"
1236
+ elif not args.json:
1237
+ # The backend was available but the call itself produced nothing —
1238
+ # distinct from "no backend at all", so it gets the same
1239
+ # attributed note rather than leaving the pairs silently
1240
+ # unconfirmed.
1241
+ out.warn(ai.fallback_note(), wrap=True)
1236
1242
  elif heuristic and not args.json:
1237
1243
  out.warn(ai.fallback_note(), wrap=True)
1238
1244
 
@@ -1294,15 +1300,27 @@ def cmd_health(argv):
1294
1300
  prog="boost health", description="Dashboard of skill-environment health")
1295
1301
  ap.parse_args(argv)
1296
1302
 
1297
- installed = _iter_installed()
1298
- quarantined = sum(1 for _n, e in installed if e.get("quarantined"))
1299
- pinned = sum(1 for _n, e in installed if e.get("pinned"))
1303
+ # Skills-only used to be the whole dashboard, so a rule or workflow could
1304
+ # drift — or vanish from the store entirely — invisibly: the skills line
1305
+ # and the drift row below both only ever saw `_iter_installed()`. Walking
1306
+ # every kind here is what lets the drift row match `boost drift` on the
1307
+ # same lock file instead of silently under-reporting it.
1308
+ all_installed = _iter_installed_all()
1309
+ by_kind: dict[str, list[tuple[str, dict]]] = {}
1310
+ for kind, name, entry in all_installed:
1311
+ by_kind.setdefault(kind, []).append((name, entry))
1312
+ installed = by_kind.get("skill", [])
1300
1313
  taps = registry.list_taps()
1301
1314
  cloned = [t for t in taps if t.is_cloned]
1302
1315
 
1303
1316
  out.heading("boost health")
1304
- out.kv("skills", "%d installed · %d quarantined · %d pinned"
1305
- % (len(installed), quarantined, pinned))
1317
+ for kind, label in (("skill", "skills"), ("rule", "rules"),
1318
+ ("workflow", "workflows")):
1319
+ items = by_kind.get(kind, [])
1320
+ q = sum(1 for _n, e in items if e.get("quarantined"))
1321
+ p = sum(1 for _n, e in items if e.get("pinned"))
1322
+ out.kv(label, "%d installed · %d quarantined · %d pinned"
1323
+ % (len(items), q, p))
1306
1324
  out.kv("taps", "%d configured · %d cloned" % (len(taps), len(cloned)))
1307
1325
 
1308
1326
  expected = [n for n, e in installed if not e.get("quarantined")]
@@ -1315,17 +1333,25 @@ def cmd_health(argv):
1315
1333
  out.kv(agent, "%d/%d %s" % (linked, len(expected),
1316
1334
  out.role("✓", "success") if full
1317
1335
  else out.role("!", "warn")))
1318
- # Agents that read the canonical store have no links to count — scoring
1319
- # them 0/N would report a healthy setup as broken. They are listed anyway,
1320
- # because an agent silently absent from a health report reads as "boost is
1321
- # not wired up for it".
1336
+ # Agents that read the canonical store have no links to count, so they
1337
+ # used to be scored an unconditional len(expected)/len(expected) — green
1338
+ # even with a skill's store directory gone, in the same report `drift`
1339
+ # called store-missing. Stat the store instead. They are listed even when
1340
+ # full, because an agent silently absent from a health report reads as
1341
+ # "boost is not wired up for it".
1342
+ store_present = sum(1 for n in expected if store.skill_store_dir(n).is_dir())
1343
+ store_full = store_present == len(expected)
1322
1344
  for agent in agents.native_store_agents():
1345
+ coverage_ok = coverage_ok and store_full
1323
1346
  out.kv(agent, "%d/%d %s (reads the store directly)"
1324
- % (len(expected), len(expected), out.role("✓", "success")))
1347
+ % (store_present, len(expected),
1348
+ out.role("✓", "success") if store_full
1349
+ else out.role("!", "warn")))
1325
1350
 
1326
1351
  drift_counts: dict = {}
1327
- for name, entry in installed:
1328
- st = _drift_status(name, entry)
1352
+ for kind, name, entry in all_installed:
1353
+ st = (_drift_status(name, entry) if kind == "skill"
1354
+ else _drift_status_materialized(kind, name, entry))
1329
1355
  drift_counts[st] = drift_counts.get(st, 0) + 1
1330
1356
  out.kv("drift", " · ".join("%d %s" % (n, s)
1331
1357
  for s, n in sorted(drift_counts.items())) or "—")