boost-skill-cli 1.2.97__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.97/boost_skill_cli.egg-info → boost_skill_cli-1.2.98}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/commands/configuration.py +57 -6
  4. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/commands/discovery.py +32 -8
  5. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/commands/info.py +5 -0
  6. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/commands/intelligence.py +7 -0
  7. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/commands/pkg.py +23 -4
  8. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/commands/quality.py +6 -0
  9. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/commands/taps.py +13 -4
  10. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/commands/team.py +2 -3
  11. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/ai.py +40 -7
  12. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/chat.py +13 -1
  13. boost_skill_cli-1.2.98/boost_cli/core/discovery.py +46 -0
  14. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/journal.py +11 -0
  15. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/output.py +10 -2
  16. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/policy.py +51 -0
  17. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/registry.py +109 -58
  18. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/staleness.py +28 -0
  19. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/store.py +25 -0
  20. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/spin.py +16 -0
  21. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98/boost_skill_cli.egg-info}/PKG-INFO +1 -1
  22. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_skill_cli.egg-info/SOURCES.txt +3 -0
  23. boost_skill_cli-1.2.98/docs/demo.gif +0 -0
  24. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/eval-latest.json +2 -2
  25. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-ai-degrade-note-blames-path-api-keys-regardless-of-cause-sev.md +3 -3
  26. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-index-findings.md +4 -4
  27. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-outdated-findings.md +3 -3
  28. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-policy-findings.md +2 -2
  29. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-schedule-findings.md +5 -3
  30. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-update-findings.md +2 -2
  31. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-who-findings.md +3 -3
  32. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap.html +20 -14
  33. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/conftest.py +14 -0
  34. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_cli_chat.py +11 -0
  35. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_cli_configuration.py +82 -2
  36. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_cli_discovery.py +86 -0
  37. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_cli_info.py +13 -0
  38. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_cli_intelligence.py +9 -0
  39. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_cli_pkg.py +57 -0
  40. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_cli_quality.py +10 -0
  41. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_cli_taps.py +33 -2
  42. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_cli_team.py +18 -2
  43. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_ai.py +57 -1
  44. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_chat.py +27 -0
  45. boost_skill_cli-1.2.98/tests/unit/test_discovery.py +59 -0
  46. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_journal.py +19 -0
  47. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_mutation_hardening.py +11 -4
  48. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_output.py +11 -0
  49. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_policy.py +96 -0
  50. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_registry.py +121 -0
  51. boost_skill_cli-1.2.98/tests/unit/test_schedule_plist.py +41 -0
  52. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_spin.py +27 -0
  53. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_staleness.py +32 -0
  54. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_store.py +49 -0
  55. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_tap_pins.py +3 -1
  56. boost_skill_cli-1.2.97/docs/demo.gif +0 -0
  57. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/.gitattributes +0 -0
  58. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/.gitignore +0 -0
  59. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/.gitleaks.toml +0 -0
  60. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/.htmlvalidate.json +0 -0
  61. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/.lighthouserc.json +0 -0
  62. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/.lycheeignore +0 -0
  63. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/.markdownlint-cli2.jsonc +0 -0
  64. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/.pre-commit-config.yaml +0 -0
  65. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/.stylelintrc.json +0 -0
  66. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/.vale/styles/boost/AIWriting.yml +0 -0
  67. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/.vale/styles/boost/Terminology.yml +0 -0
  68. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  69. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/.vale.ini +0 -0
  70. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/CLAUDE.md +0 -0
  71. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/CODE_OF_CONDUCT.md +0 -0
  72. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/CONTRIBUTING.md +0 -0
  73. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/DCO +0 -0
  74. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/GOVERNANCE.md +0 -0
  75. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/LICENSE +0 -0
  76. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/MAINTAINERS.md +0 -0
  77. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/MANIFEST.in +0 -0
  78. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/Makefile +0 -0
  79. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/README.md +0 -0
  80. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/SECURITY.md +0 -0
  81. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/SUPPORT.md +0 -0
  82. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost +0 -0
  83. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/__init__.py +0 -0
  84. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/__main__.py +0 -0
  85. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/cli.py +0 -0
  86. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/cliparse.py +0 -0
  87. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/commands/__init__.py +0 -0
  88. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/commands/_common.py +0 -0
  89. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/commands/bmad.py +0 -0
  90. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/commands/hooks.py +0 -0
  91. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/commands/quickstart.py +0 -0
  92. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/commands/run.py +0 -0
  93. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/commands/safety.py +0 -0
  94. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/__init__.py +0 -0
  95. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/adapters.py +0 -0
  96. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/agents.py +0 -0
  97. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/aihost.py +0 -0
  98. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/archive.py +0 -0
  99. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/bmad.py +0 -0
  100. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/bootstrap.py +0 -0
  101. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/browse.py +0 -0
  102. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/builtin.py +0 -0
  103. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/capabilities.py +0 -0
  104. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/catalog.py +0 -0
  105. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/catalogbundle.py +0 -0
  106. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/claude_settings.py +0 -0
  107. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/complete.py +0 -0
  108. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/config.py +0 -0
  109. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/dense.py +0 -0
  110. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/ed25519.py +0 -0
  111. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/embed.py +0 -0
  112. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/faithfulness.py +0 -0
  113. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/frontmatter.py +0 -0
  114. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/gitutil.py +0 -0
  115. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/hookhost.py +0 -0
  116. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/imperative.py +0 -0
  117. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/injectscan.py +0 -0
  118. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/installscan.py +0 -0
  119. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/integrity.py +0 -0
  120. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/jsonstate.py +0 -0
  121. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/localembed.py +0 -0
  122. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/lockfile.py +0 -0
  123. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/logs.py +0 -0
  124. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/mcp.py +0 -0
  125. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/mcpdecl.py +0 -0
  126. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/mcphost.py +0 -0
  127. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/minisign.py +0 -0
  128. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/nethttp.py +0 -0
  129. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/paths.py +0 -0
  130. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/projectlock.py +0 -0
  131. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/provenance.py +0 -0
  132. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/rag.py +0 -0
  133. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/resolve.py +0 -0
  134. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/rules.py +0 -0
  135. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/scopes.py +0 -0
  136. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/secretscan.py +0 -0
  137. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/selfupdate.py +0 -0
  138. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/serve.py +0 -0
  139. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/shards.py +0 -0
  140. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/stackprobe.py +0 -0
  141. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/trustaudit.py +0 -0
  142. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/typedvalue.py +0 -0
  143. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/typosquat.py +0 -0
  144. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/updatediff.py +0 -0
  145. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/util.py +0 -0
  146. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/core/workflows.py +0 -0
  147. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/data/registries.json +0 -0
  148. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/data/rules/boost-first.mdc +0 -0
  149. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_cli/errors.py +0 -0
  150. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_langchain/__init__.py +0 -0
  151. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_langchain/_compat.py +0 -0
  152. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_langchain/graph.py +0 -0
  153. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_langchain/loader.py +0 -0
  154. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_langchain/py.typed +0 -0
  155. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_langchain/retriever.py +0 -0
  156. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  157. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  158. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_skill_cli.egg-info/requires.txt +0 -0
  159. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/boost_skill_cli.egg-info/top_level.txt +0 -0
  160. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/codecov.yml +0 -0
  161. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/.claude/settings.local.json +0 -0
  162. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/DEBUGGING.md +0 -0
  163. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/adapters.html +0 -0
  164. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/architecture/README.md +0 -0
  165. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/architecture/c4-components-core.md +0 -0
  166. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/architecture/c4-containers.md +0 -0
  167. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/architecture/c4-context.md +0 -0
  168. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/architecture/c4-dynamic-install.md +0 -0
  169. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/bmad.md +0 -0
  170. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/carousel/gifs/distill.gif +0 -0
  171. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/carousel/gifs/doctor.gif +0 -0
  172. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/carousel/gifs/explain.gif +0 -0
  173. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/carousel/gifs/hooks.gif +0 -0
  174. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/carousel/gifs/install.gif +0 -0
  175. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/carousel/gifs/pulse.gif +0 -0
  176. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/carousel/gifs/search.gif +0 -0
  177. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/carousel/gifs/tap.gif +0 -0
  178. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/carousel/tapes/distill.tape +0 -0
  179. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/carousel/tapes/doctor.tape +0 -0
  180. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/carousel/tapes/explain.tape +0 -0
  181. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/carousel/tapes/hooks.tape +0 -0
  182. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/carousel/tapes/install.tape +0 -0
  183. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/carousel/tapes/pulse.tape +0 -0
  184. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/carousel/tapes/search.tape +0 -0
  185. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/carousel/tapes/tap.tape +0 -0
  186. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/carousel.html +0 -0
  187. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/chat.html +0 -0
  188. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/code-review.md +0 -0
  189. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/commands.html +0 -0
  190. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/commit-audit.md +0 -0
  191. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/demo-index.json +0 -0
  192. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/demo.html +0 -0
  193. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/demo.tape +0 -0
  194. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/dependencies.md +0 -0
  195. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/design-roadmap.html +0 -0
  196. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/eval.html +0 -0
  197. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/index.html +0 -0
  198. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/langchain.html +0 -0
  199. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/mcp-hub.html +0 -0
  200. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/openssf-badge.md +0 -0
  201. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/openssf-playbook.md +0 -0
  202. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/rag-architecture.md +0 -0
  203. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D01.md +0 -0
  204. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D02.md +0 -0
  205. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D03.md +0 -0
  206. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D04.md +0 -0
  207. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D05.md +0 -0
  208. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D06.md +0 -0
  209. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D07.md +0 -0
  210. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D08.md +0 -0
  211. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D09.md +0 -0
  212. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D10.md +0 -0
  213. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D11.md +0 -0
  214. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D12.md +0 -0
  215. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D13.md +0 -0
  216. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D14.md +0 -0
  217. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D15.md +0 -0
  218. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D16.md +0 -0
  219. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D17.md +0 -0
  220. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D18.md +0 -0
  221. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D19.md +0 -0
  222. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D20.md +0 -0
  223. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D21.md +0 -0
  224. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D22.md +0 -0
  225. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D23.md +0 -0
  226. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D24.md +0 -0
  227. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D25.md +0 -0
  228. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D26.md +0 -0
  229. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/BOOST-D27.md +0 -0
  230. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  231. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  232. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  233. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  234. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  235. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/ai-backend-fanout.md +0 -0
  236. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  237. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  238. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  239. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  240. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-absorb-findings.md +0 -0
  241. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-adapt-findings.md +0 -0
  242. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-adapt-renders-every-sibling-of-a-flat-agents-dir-workflow-as.md +0 -0
  243. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-adapt-run-stats-edit-tag-export-reject-the-tap-name-qualifie.md +0 -0
  244. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-attest-findings.md +0 -0
  245. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-audit-findings.md +0 -0
  246. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-bmad-findings.md +0 -0
  247. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-browse-findings.md +0 -0
  248. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-bundle-findings.md +0 -0
  249. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-catalog-findings.md +0 -0
  250. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-catalog-resolve-one-s-duplicate-name-hint-advertises-path-to.md +0 -0
  251. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-changelog-findings.md +0 -0
  252. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-chat-findings.md +0 -0
  253. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-clean-counts-failed-removals-as-cleaned-journals-the-inflate.md +0 -0
  254. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-cli-py-commands-summaries-and-parser-help-contradict-behavio.md +0 -0
  255. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-cohort-findings.md +0 -0
  256. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-completions-findings.md +0 -0
  257. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-config-findings.md +0 -0
  258. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-config-policy-set-store-type-unchecked-values-consumers-cras.md +0 -0
  259. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-context-findings.md +0 -0
  260. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-corrupt-settings-config-state-json-silently-read-as-empty-th.md +0 -0
  261. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-create-distill-infer-absorb-install-silently-replace-an-inst.md +0 -0
  262. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-create-findings.md +0 -0
  263. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-declined-confirms-never-name-y-boost-assume-yes-snapshot-cle.md +0 -0
  264. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-deps-findings.md +0 -0
  265. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-discover-findings.md +0 -0
  266. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-distill-s-heuristic-merge-drops-repeated-fences-braces-writi.md +0 -0
  267. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-doctor-findings.md +0 -0
  268. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-drift-findings.md +0 -0
  269. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-dry-runs-disagree-with-the-real-run-compact-counts-bytes-it.md +0 -0
  270. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-edit-findings.md +0 -0
  271. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-evolve-findings.md +0 -0
  272. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-explain-findings.md +0 -0
  273. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-export-findings.md +0 -0
  274. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-export-o-cohort-create-and-profile-save-silently-overwrite-e.md +0 -0
  275. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-fingerprint-findings.md +0 -0
  276. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-five-exit-70-crashes-on-bad-paths-data-catalog-export-serve.md +0 -0
  277. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-focus-profile-sideline-by-unlinking-without-recording-it-lis.md +0 -0
  278. {boost_skill_cli-1.2.97 → 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
  279. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-health-findings.md +0 -0
  280. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-hooks-remove-n-cannot-find-hooks-boost-itself-added-unknown.md +0 -0
  281. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-import-all-skips-the-injection-secret-scans-and-the-per-skil.md +0 -0
  282. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-import-findings.md +0 -0
  283. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-info-stats-explain-render-a-different-smaller-shape-for-rule.md +0 -0
  284. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-install-dry-run-promises-agents-the-real-install-never-write.md +0 -0
  285. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-install-findings.md +0 -0
  286. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-install-local-writes-empties-the-repo-s-mcp-json-silently-of.md +0 -0
  287. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-json-accepted-but-ignored-on-many-branches-cohort-config-pol.md +0 -0
  288. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-lint-findings.md +0 -0
  289. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-log-findings.md +0 -0
  290. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-log-simulate-changelog-headings-echo-the-raw-qualified-argum.md +0 -0
  291. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-mcp-findings.md +0 -0
  292. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-mcp-register-s-boost-first-consent-names-only-the-registered.md +0 -0
  293. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-missing-json-on-doctor-test-health-changelog-trending-log-ho.md +0 -0
  294. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-name-miss-errors-unknown-tap-qualifier-unnamed-no-close-matc.md +0 -0
  295. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-onboard-findings.md +0 -0
  296. {boost_skill_cli-1.2.97 → 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
  297. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-out-warn-defaults-to-stdout-infer-absorb-corrupt-skill-md-se.md +0 -0
  298. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-output-wrap-tokens-splits-punctuation-off-backtick-spans-ins.md +0 -0
  299. {boost_skill_cli-1.2.97 → 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
  300. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-preview-findings.md +0 -0
  301. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-profile-findings.md +0 -0
  302. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-project-scope-seams-uninstall-verify-list-info-reinstall-dis.md +0 -0
  303. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-protocol-findings.md +0 -0
  304. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-pulse-findings.md +0 -0
  305. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-quarantine-findings.md +0 -0
  306. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-quarantine-pin-state-invisible-list-info-doctor-report-links.md +0 -0
  307. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-quickstart-findings.md +0 -0
  308. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-recommend-findings.md +0 -0
  309. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-reindex-findings.md +0 -0
  310. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-reinstall-sync-repair-and-audit-resolve-by-name-tap-ignoring.md +0 -0
  311. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-replay-findings.md +0 -0
  312. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-root-findings.md +0 -0
  313. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-rules-workflows-reported-as-skills-uninstall-claims-a-store.md +0 -0
  314. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-run-findings.md +0 -0
  315. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-search-findings.md +0 -0
  316. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-simulate-findings.md +0 -0
  317. {boost_skill_cli-1.2.97 → 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
  318. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-six-count-flags-tap-chat-absorb-lint-changelog-hooks-skip-ut.md +0 -0
  319. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-skill-profile-name-slugging-is-inconsistent-distill-o-accept.md +0 -0
  320. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-snapshot-restore-replaces-the-lock-wholesale-orphaning-newer.md +0 -0
  321. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-stale-prose-after-shipped-changes-catalog-export-live-discov.md +0 -0
  322. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-stray-positionals-and-inapplicable-flags-silently-ignored-ac.md +0 -0
  323. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-sweep-positionals-json-lack-help-strings-and-no-command-help.md +0 -0
  324. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-sync-findings.md +0 -0
  325. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-tag-findings.md +0 -0
  326. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-tap-dry-run-is-silently-ignored-outside-catalog-spec-and-def.md +0 -0
  327. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-tap-findings.md +0 -0
  328. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-taps-findings.md +0 -0
  329. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-taps-outdated-decay-policy-snapshot-json-emit-display-string.md +0 -0
  330. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-test-findings.md +0 -0
  331. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-trust-findings.md +0 -0
  332. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-trust-verify-labels-a-manifest-tampered-after-signing-by-a-t.md +0 -0
  333. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-unpin-findings.md +0 -0
  334. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-untap-findings.md +0 -0
  335. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-verify-drift-say-nothing-installed-exit-0-and-doctor-says-lo.md +0 -0
  336. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/audit-verify-findings.md +0 -0
  337. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  338. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
  339. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  340. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  341. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/bmad-hooks-all-hosts.md +0 -0
  342. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
  343. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/boost-first-rule.md +0 -0
  344. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  345. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  346. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/branch-current-gate.md +0 -0
  347. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  348. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  349. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
  350. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  351. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  352. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  353. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  354. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/capability-policy-skips-rules-and-workflows.md +0 -0
  355. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/catalog-categories-beyond-curated.md +0 -0
  356. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
  357. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  358. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  359. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  360. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  361. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  362. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  363. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/cli-audit-2026-08-full-sweep.md +0 -0
  364. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/cli-command-audit.md +0 -0
  365. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
  366. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  367. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  368. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
  369. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/command-carousel-page.md +0 -0
  370. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  371. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  372. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
  373. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  374. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/concurrent-rag-builds-delete-each-others-temp-index.md +0 -0
  375. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  376. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  377. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  378. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  379. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  380. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
  381. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/delay-true-defeats-the-log-suppress.md +0 -0
  382. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  383. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  384. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  385. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/dense-reindex-has-no-progress-or-durability.md +0 -0
  386. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/dense-reindex-reuses-whole-taps.md +0 -0
  387. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  388. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
  389. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/dense-store-holds-every-vector-once-per-copy.md +0 -0
  390. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  391. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  392. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  393. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  394. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  395. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
  396. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  397. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  398. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  399. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  400. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  401. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  402. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  403. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  404. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  405. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  406. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  407. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  408. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  409. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  410. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  411. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  412. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  413. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  414. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  415. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  416. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  417. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  418. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  419. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  420. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  421. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  422. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
  423. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
  424. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
  425. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/github-community-health-files.md +0 -0
  426. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  427. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  428. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  429. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/gstack-tap-first-then-coexistence.md +0 -0
  430. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  431. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  432. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  433. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  434. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  435. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  436. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  437. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  438. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  439. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  440. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  441. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  442. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  443. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  444. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  445. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  446. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  447. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  448. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  449. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  450. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  451. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  452. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  453. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  454. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  455. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  456. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  457. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  458. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  459. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  460. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
  461. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  462. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  463. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  464. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  465. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  466. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  467. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  468. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
  469. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  470. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  471. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-cannot-read-a-skill-before-installing.md +0 -0
  472. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  473. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  474. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  475. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  476. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  477. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  478. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  479. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  480. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  481. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  482. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  483. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  484. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  485. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  486. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  487. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  488. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  489. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  490. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  491. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  492. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  493. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mutation-shards-rerun-full-set-every-push.md +0 -0
  494. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  495. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  496. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/near-identical-copies-still-eat-the-slots.md +0 -0
  497. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  498. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  499. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  500. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  501. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  502. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  503. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
  504. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
  505. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/openssf-playbook.md +0 -0
  506. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/openssf-silver.md +0 -0
  507. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/osps-baseline-levels.md +0 -0
  508. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  509. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  510. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  511. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
  512. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  513. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  514. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  515. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  516. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  517. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  518. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  519. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  520. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  521. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  522. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  523. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  524. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  525. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  526. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  527. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/publish-the-keyword-index.md +0 -0
  528. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  529. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/published-shards-have-no-consumer.md +0 -0
  530. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  531. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  532. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  533. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  534. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  535. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
  536. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  537. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  538. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  539. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  540. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/relicence-apache-2.md +0 -0
  541. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
  542. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  543. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  544. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  545. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  546. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  547. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  548. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  549. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  550. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  551. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  552. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  553. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  554. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  555. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  556. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  557. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  558. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  559. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  560. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  561. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  562. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  563. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  564. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
  565. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  566. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  567. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  568. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  569. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  570. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  571. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
  572. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
  573. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
  574. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  575. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/shard-refresh-skips-processed-commits.md +0 -0
  576. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/shard-runs-reembed-everything-weekly.md +0 -0
  577. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
  578. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
  579. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  580. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/shrink-the-published-index.md +0 -0
  581. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  582. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  583. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
  584. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  585. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  586. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  587. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  588. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  589. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  590. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
  591. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  592. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  593. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  594. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
  595. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  596. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
  597. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
  598. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
  599. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
  600. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  601. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
  602. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
  603. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
  604. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  605. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  606. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  607. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  608. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  609. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  610. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  611. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  612. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  613. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  614. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  615. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/vex-openvex-feed.md +0 -0
  616. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  617. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/weekly-vectors-had-no-ingestion-path.md +0 -0
  618. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  619. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  620. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  621. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  622. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  623. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  624. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/workspace-scope-install.md +0 -0
  625. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/zip-strict-audit.md +0 -0
  626. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  627. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  628. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/security-design.md +0 -0
  629. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/semantic-search.md +0 -0
  630. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
  631. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/verifying-releases.md +0 -0
  632. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/vex/meta.md +0 -0
  633. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/vex/openvex.json +0 -0
  634. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
  635. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
  636. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
  637. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
  638. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/eslint.config.mjs +0 -0
  639. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/evals/README.md +0 -0
  640. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/evals/__init__.py +0 -0
  641. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/evals/baseline.json +0 -0
  642. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/evals/faithfulness.py +0 -0
  643. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/evals/golden_set.json +0 -0
  644. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/evals/make_corpus.py +0 -0
  645. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/evals/make_golden.py +0 -0
  646. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/evals/metrics.py +0 -0
  647. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/evals/publish_golden_dataset.py +0 -0
  648. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/evals/run_evals.py +0 -0
  649. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/examples/README.md +0 -0
  650. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/examples/adapt-demo.sh +0 -0
  651. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/examples/boost-run-prototype.sh +0 -0
  652. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/index.html +0 -0
  653. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/noxfile.py +0 -0
  654. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/pyproject.toml +0 -0
  655. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/requirements/coverage-tools.in +0 -0
  656. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/requirements/coverage-tools.txt +0 -0
  657. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/requirements/lint-tools.in +0 -0
  658. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/requirements/lint-tools.txt +0 -0
  659. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/requirements/mutation-tools.in +0 -0
  660. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/requirements/mutation-tools.txt +0 -0
  661. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/requirements/platform-pins.lock +0 -0
  662. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/requirements/release-tools.in +0 -0
  663. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/requirements/release-tools.txt +0 -0
  664. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/requirements/test-tools.in +0 -0
  665. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/requirements/test-tools.txt +0 -0
  666. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/a11y_check.py +0 -0
  667. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/add_spdx_headers.py +0 -0
  668. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/bench_cli.sh +0 -0
  669. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/build_command_reference.py +0 -0
  670. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/build_demo_index.py +0 -0
  671. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/build_registries.py +0 -0
  672. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/build_roadmap.py +0 -0
  673. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/build_scale_corpus.py +0 -0
  674. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/build_vex.py +0 -0
  675. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/check_anchors.py +0 -0
  676. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/check_branch_current.py +0 -0
  677. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/check_dco.py +0 -0
  678. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/check_licenses.py +0 -0
  679. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/check_reproducible.py +0 -0
  680. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/check_required_checks.py +0 -0
  681. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/ensure_eval_corpus.sh +0 -0
  682. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/eval_corpus.py +0 -0
  683. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/eval_explain.py +0 -0
  684. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/eval_gate.py +0 -0
  685. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/eval_recommend.py +0 -0
  686. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/eval_retrieval.py +0 -0
  687. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/eval_stats_summary.py +0 -0
  688. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/eval_tools.py +0 -0
  689. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/import_budget.py +0 -0
  690. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/lock_toolchain.py +0 -0
  691. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/measure_near_duplicate_bound.py +0 -0
  692. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/measure_registry.py +0 -0
  693. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/mutation_gate.py +0 -0
  694. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/mutation_shards.py +0 -0
  695. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/mutation_weights.json +0 -0
  696. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/normalize_sdist.py +0 -0
  697. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/page_budget.py +0 -0
  698. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/perf_gate.py +0 -0
  699. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/post_deploy_smoke.py +0 -0
  700. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/publish_eval_json.py +0 -0
  701. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/publish_shards.py +0 -0
  702. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/release_guard.py +0 -0
  703. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/release_preflight.py +0 -0
  704. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/serve_docs.py +0 -0
  705. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/scripts/shard_plan.py +0 -0
  706. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/setup.cfg +0 -0
  707. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/sonar-project.properties +0 -0
  708. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/style/README.md +0 -0
  709. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/style/boost.css +0 -0
  710. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/style/boost.js +0 -0
  711. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/style/demo.html +0 -0
  712. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/bdd/features/adapt.feature +0 -0
  713. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/bdd/features/browse.feature +0 -0
  714. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/bdd/features/count.feature +0 -0
  715. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/bdd/features/discover.feature +0 -0
  716. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/bdd/features/doctor.feature +0 -0
  717. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/bdd/features/environment.py +0 -0
  718. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/bdd/features/explain.feature +0 -0
  719. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/bdd/features/index.feature +0 -0
  720. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/bdd/features/install.feature +0 -0
  721. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/bdd/features/list.feature +0 -0
  722. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/bdd/features/mcp.feature +0 -0
  723. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/bdd/features/search.feature +0 -0
  724. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/bdd/features/steps/cli_steps.py +0 -0
  725. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/bdd/features/steps/discovery_steps.py +0 -0
  726. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/bdd/features/steps/mcp_steps.py +0 -0
  727. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/bdd/features/steps/quality_steps.py +0 -0
  728. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/eval/baseline.json +0 -0
  729. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/eval/explain.jsonl +0 -0
  730. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/eval/fixtures/claude_init_event.jsonl +0 -0
  731. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/eval/golden-natural.jsonl +0 -0
  732. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/eval/golden.jsonl +0 -0
  733. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/eval/recommend.jsonl +0 -0
  734. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/eval/taps-scale.txt +0 -0
  735. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/eval/taps.txt +0 -0
  736. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/eval/tool_calls.jsonl +0 -0
  737. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_bmad_all_hosts.py +0 -0
  738. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_capabilities_policy.py +0 -0
  739. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_cli_adapt.py +0 -0
  740. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_cli_bmad.py +0 -0
  741. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_cli_catalog.py +0 -0
  742. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_cli_hooks.py +0 -0
  743. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_cli_hooks_gemini.py +0 -0
  744. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_cli_pane_width.py +0 -0
  745. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_cli_quickstart.py +0 -0
  746. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_cli_tap_pins.py +0 -0
  747. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_everyday_loop.py +0 -0
  748. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_integrity_enforce.py +0 -0
  749. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_kind_conformance.py +0 -0
  750. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_property_parsers.py +0 -0
  751. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_run.py +0 -0
  752. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_tap_signing.py +0 -0
  753. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/functional/test_workspace_scope.py +0 -0
  754. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/README.md +0 -0
  755. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  756. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  757. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  758. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  759. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  760. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  761. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  762. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  763. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  764. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  765. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  766. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  767. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  768. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  769. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  770. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  771. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  772. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  773. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  774. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  775. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
  776. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
  777. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
  778. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/fuzz_frontmatter.py +0 -0
  779. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/fuzz/fuzz_registry.py +0 -0
  780. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/langchain/conftest.py +0 -0
  781. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/langchain/test_graph.py +0 -0
  782. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/langchain/test_loader.py +0 -0
  783. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/langchain/test_retriever.py +0 -0
  784. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/make_fixture.py +0 -0
  785. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/perf/test_benchmarks.py +0 -0
  786. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/smoke.sh +0 -0
  787. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_a11y_check.py +0 -0
  788. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_action_pin_lockstep.py +0 -0
  789. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_adapters.py +0 -0
  790. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_adapters_multi.py +0 -0
  791. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_adapters_runner.py +0 -0
  792. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_agents.py +0 -0
  793. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_aihost.py +0 -0
  794. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_archive.py +0 -0
  795. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_bmad_core.py +0 -0
  796. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_boost_first_offer.py +0 -0
  797. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_bootstrap.py +0 -0
  798. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_bot_pr_dco.py +0 -0
  799. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_branch_current.py +0 -0
  800. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_browse.py +0 -0
  801. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_builtin.py +0 -0
  802. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_capabilities.py +0 -0
  803. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_catalog.py +0 -0
  804. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_catalogbundle.py +0 -0
  805. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_check_anchors.py +0 -0
  806. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_check_dco.py +0 -0
  807. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_check_licenses.py +0 -0
  808. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_check_reproducible.py +0 -0
  809. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_claude_settings.py +0 -0
  810. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_clean_internal_cache.py +0 -0
  811. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_cli_update_shards.py +0 -0
  812. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_cliparse.py +0 -0
  813. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_codeql_analysis_key.py +0 -0
  814. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_command_reference_fresh.py +0 -0
  815. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_community_health_files.py +0 -0
  816. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_compact.py +0 -0
  817. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_complete.py +0 -0
  818. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_complete_rc_block.py +0 -0
  819. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_config.py +0 -0
  820. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_content_dedupe.py +0 -0
  821. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_content_identity.py +0 -0
  822. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_crash_redaction.py +0 -0
  823. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_dedup_trust.py +0 -0
  824. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_demo_index.py +0 -0
  825. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_dense.py +0 -0
  826. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_dense_boilerplate_cluster.py +0 -0
  827. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_dense_embed_dedupe.py +0 -0
  828. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_dense_entry_reuse.py +0 -0
  829. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_dense_entry_vectors.py +0 -0
  830. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_dense_fallback.py +0 -0
  831. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_dense_fix_hint.py +0 -0
  832. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_dense_progress.py +0 -0
  833. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_dense_quantized.py +0 -0
  834. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_dense_ready_order.py +0 -0
  835. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_dense_shard_real_schema.py +0 -0
  836. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
  837. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_dense_shards.py +0 -0
  838. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_dense_status.py +0 -0
  839. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_dense_status_cheap.py +0 -0
  840. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_dense_vector_dedupe.py +0 -0
  841. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_dependabot_config.py +0 -0
  842. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_distill_merge.py +0 -0
  843. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_docs_pages_linked.py +0 -0
  844. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_docsite_chrome.py +0 -0
  845. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_doctor_output_polish.py +0 -0
  846. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_drift_hint.py +0 -0
  847. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_ed25519.py +0 -0
  848. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_embed.py +0 -0
  849. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_embed_local.py +0 -0
  850. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_embed_truncated_response.py +0 -0
  851. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_entry_key.py +0 -0
  852. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_errors_and_cli_table.py +0 -0
  853. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_eval_baseline.py +0 -0
  854. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_eval_corpus.py +0 -0
  855. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_eval_faithfulness.py +0 -0
  856. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_eval_gate.py +0 -0
  857. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_eval_grading.py +0 -0
  858. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_eval_metrics.py +0 -0
  859. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_eval_stats_summary.py +0 -0
  860. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_eval_tools.py +0 -0
  861. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_eval_tools_probe.py +0 -0
  862. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  863. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_faithfulness.py +0 -0
  864. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_frontmatter.py +0 -0
  865. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_fuzz_targets.py +0 -0
  866. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  867. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_gitleaks_config.py +0 -0
  868. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_gitutil.py +0 -0
  869. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_gitutil_lfs.py +0 -0
  870. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_gitutil_sparse.py +0 -0
  871. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_gstack_coexistence.py +0 -0
  872. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_hook_settings_hosts.py +0 -0
  873. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_hookhost.py +0 -0
  874. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_imperative.py +0 -0
  875. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_import_budget.py +0 -0
  876. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_injectscan.py +0 -0
  877. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_install_permission_error.py +0 -0
  878. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_installscan.py +0 -0
  879. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_integrity.py +0 -0
  880. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_jsonstate.py +0 -0
  881. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_langchain_packaging.py +0 -0
  882. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_link_ownership.py +0 -0
  883. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_localembed.py +0 -0
  884. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_localembed_e2e.py +0 -0
  885. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_lockfile.py +0 -0
  886. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_logs.py +0 -0
  887. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_marketing_counts.py +0 -0
  888. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_mcp.py +0 -0
  889. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_mcp_install_scan.py +0 -0
  890. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_mcp_read.py +0 -0
  891. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_mcpdecl.py +0 -0
  892. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_mcphost.py +0 -0
  893. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_measure_registry.py +0 -0
  894. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_minisign.py +0 -0
  895. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_mutation_shards.py +0 -0
  896. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_mutation_subfile_shards.py +0 -0
  897. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_mutmut_source_paths.py +0 -0
  898. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_near_duplicate_collapse.py +0 -0
  899. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_nethttp.py +0 -0
  900. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_normalize_sdist.py +0 -0
  901. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_page_budget.py +0 -0
  902. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_paths.py +0 -0
  903. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_perf_gate.py +0 -0
  904. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_pkg_confusions.py +0 -0
  905. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_pkg_injection.py +0 -0
  906. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_pkg_secrets.py +0 -0
  907. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_platform_pins.py +0 -0
  908. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_post_deploy_smoke.py +0 -0
  909. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_project_mcp_sidecar.py +0 -0
  910. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_projectlock.py +0 -0
  911. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_provenance.py +0 -0
  912. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_publish_golden_dataset.py +0 -0
  913. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_rag.py +0 -0
  914. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_rag_fastpath.py +0 -0
  915. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_rag_fusion.py +0 -0
  916. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_registries_fresh.py +0 -0
  917. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_registry_categories.py +0 -0
  918. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_registry_control_chars.py +0 -0
  919. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_registry_parallel.py +0 -0
  920. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_release_guard.py +0 -0
  921. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_release_preflight.py +0 -0
  922. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_required_checks.py +0 -0
  923. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_rerank_cache.py +0 -0
  924. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_resolve.py +0 -0
  925. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_retrieve_any_near_duplicates.py +0 -0
  926. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_roadmap_fresh.py +0 -0
  927. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_rules.py +0 -0
  928. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_scale_corpus.py +0 -0
  929. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_scopes.py +0 -0
  930. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_secretscan.py +0 -0
  931. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_selfupdate.py +0 -0
  932. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_serve.py +0 -0
  933. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_serve_docs.py +0 -0
  934. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_shard_plan.py +0 -0
  935. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_shards.py +0 -0
  936. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_shards_incremental.py +0 -0
  937. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_shards_ingest.py +0 -0
  938. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_shards_matrix.py +0 -0
  939. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_smoke_covers_every_command.py +0 -0
  940. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_spdx_headers.py +0 -0
  941. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_stackprobe.py +0 -0
  942. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_store_materialize.py +0 -0
  943. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_sync_blocked_links.py +0 -0
  944. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  945. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_token_parity.py +0 -0
  946. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_toolchain_lock.py +0 -0
  947. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_trustaudit.py +0 -0
  948. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_typedvalue.py +0 -0
  949. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_typosquat.py +0 -0
  950. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_updatediff.py +0 -0
  951. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_util.py +0 -0
  952. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_version.py +0 -0
  953. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_version_tags.py +0 -0
  954. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_vex.py +0 -0
  955. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_visual_harness_flags.py +0 -0
  956. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_workflow_concurrency.py +0 -0
  957. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  958. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  959. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_workflow_timeouts.py +0 -0
  960. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_workflows.py +0 -0
  961. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  962. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/visual/a11y_check.mjs +0 -0
  963. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/visual/console_check.mjs +0 -0
  964. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/visual/package-lock.json +0 -0
  965. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/visual/package.json +0 -0
  966. {boost_skill_cli-1.2.97 → boost_skill_cli-1.2.98}/tests/visual/visual_check.mjs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.2.97
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
@@ -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.97'
22
- __version_tuple__ = version_tuple = (1, 2, 97)
21
+ __version__ = version = '1.2.98'
22
+ __version_tuple__ = version_tuple = (1, 2, 98)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -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()
@@ -960,6 +997,21 @@ def _interval_label(seconds) -> str:
960
997
  return "%ss" % seconds
961
998
 
962
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
+
963
1015
  def cmd_schedule(argv) -> int:
964
1016
  """boost schedule [status|enable [--interval 6h|12h|daily]|disable]"""
965
1017
  p = cliparse.parser(
@@ -985,10 +1037,8 @@ def cmd_schedule(argv) -> int:
985
1037
  plist = _plist_path()
986
1038
  if plist.exists():
987
1039
  present = True
988
- m = re.search(r"<key>StartInterval</key>\s*<integer>(\d+)</integer>",
989
- plist.read_text(encoding="utf-8"))
990
- if m:
991
- secs = int(m.group(1))
1040
+ secs = _plist_interval_seconds(plist.read_text(encoding="utf-8"))
1041
+ if secs is not None:
992
1042
  interval = _interval_label(secs)
993
1043
  nxt = datetime.fromtimestamp(plist.stat().st_mtime + secs)
994
1044
  while nxt < datetime.now():
@@ -1015,7 +1065,8 @@ def cmd_schedule(argv) -> int:
1015
1065
  out.kv("platform", "%s (%s)" % (sys.platform, "launchd" if darwin else "cron"))
1016
1066
  out.kv("scheduled", "yes" if present else "no")
1017
1067
  if present:
1018
- 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)")
1019
1070
  out.kv("next run", next_run.strftime("%Y-%m-%d %H:%M (approx)")
1020
1071
  if next_run else "unknown")
1021
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})
@@ -767,6 +767,11 @@ def cmd_explain(argv):
767
767
  "extractive summary instead"
768
768
  % ", ".join(faithfulness.ungrounded_terms(reply, text)[:4]),
769
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)
770
775
  else:
771
776
  out.warn(ai.fallback_note(), wrap=True, stream=sys.stderr)
772
777
  meta, body = frontmatter.parse(text)
@@ -1192,6 +1192,8 @@ def cmd_impact(argv: list[str]) -> int:
1192
1192
  if reply:
1193
1193
  print()
1194
1194
  print(textwrap.indent(textwrap.fill(reply, width=76), " "))
1195
+ else:
1196
+ _note_fallback()
1195
1197
  else:
1196
1198
  _note_fallback()
1197
1199
  out.dim(" " + note)
@@ -1256,6 +1258,11 @@ def _print_reply(reply: chat_engine.Reply, show_sources: bool) -> None:
1256
1258
  # a downgraded answer that looks identical to a confident one.
1257
1259
  out.warn("the AI reply named something outside the retrieved skills — "
1258
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)
1259
1266
 
1260
1267
 
1261
1268
  def cmd_chat(argv: list[str]) -> int:
@@ -1073,9 +1073,12 @@ def cmd_update(argv: list[str]) -> int:
1073
1073
  out.info("no taps configured — start with `boost tap --defaults`")
1074
1074
  return 0
1075
1075
  moved = []
1076
+ pinned_skips = 0
1076
1077
  for tname, summary in results.items():
1077
1078
  if "skipped" not in summary:
1078
1079
  catalog.rebuild_tap(registry.get(tname))
1080
+ else:
1081
+ pinned_skips += 1
1079
1082
  # "abc1234 → def5678" is a tap whose tree changed; "already up to date"
1080
1083
  # and "pinned at ..." are not. Only the first invalidates vectors.
1081
1084
  if "→" in summary:
@@ -1091,6 +1094,14 @@ def cmd_update(argv: list[str]) -> int:
1091
1094
  "%d of %d taps could not be refreshed — the rest are up to date. "
1092
1095
  "Drop a dead one with `boost untap <name>`."
1093
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"))
1094
1105
  # A pulled tap can add, drop, or rename catalogue entries, so the
1095
1106
  # completion name cache must not survive an update unrefreshed.
1096
1107
  complete.refresh_names()
@@ -1145,10 +1156,18 @@ def cmd_update(argv: list[str]) -> int:
1145
1156
  upgraded += _update_materialized("rule", lockfile.installed_rules(), results)
1146
1157
  upgraded += _update_materialized("workflow", lockfile.installed_workflows(), results)
1147
1158
  if not upgraded:
1148
- # Don't claim "everything up to date" when some taps were never
1149
- # reached — that is exactly the false all-clear this fix exists to stop.
1150
- out.ok("everything up to date" if not failures
1151
- 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")
1152
1171
  # Non-zero only when nothing was refreshed at all. A partial run did the job
1153
1172
  # it could do, and failing it would put us back to one dead upstream
1154
1173
  # breaking `boost update` for the other 79.
@@ -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
 
@@ -326,6 +326,13 @@ def cmd_outdated(argv) -> int:
326
326
  continue
327
327
  matches = [e for e in catalog.find(name) if e["tap"] == tap_name]
328
328
  if not matches:
329
+ # The tap is untapped, or dropped this entry entirely — same
330
+ # condition the rule/workflow loop below reports honestly, so a
331
+ # skill shouldn't just vanish from the table.
332
+ results.append({"name": name, "kind": "skill",
333
+ "installed": str(lk.get("version") or "0.0.0"),
334
+ "latest": staleness.OUTDATED_SOURCE_MISSING,
335
+ "tap": tap_name, "pinned": bool(lk.get("pinned"))})
329
336
  continue
330
337
  entry, _warning = catalog.select_lock_source(matches, lk)
331
338
  entry = cast(dict, entry) # matches is non-empty above
@@ -348,7 +355,7 @@ def cmd_outdated(argv) -> int:
348
355
  except BoostError:
349
356
  src_missing = True
350
357
  if src_missing:
351
- stale, latest_disp = True, "source missing"
358
+ stale, latest_disp = True, staleness.OUTDATED_SOURCE_MISSING
352
359
  else:
353
360
  reason = staleness.upstream_reason(
354
361
  installed_v, latest, lk.get("commit", ""), head,
@@ -379,7 +386,8 @@ def cmd_outdated(argv) -> int:
379
386
  except (OSError, BoostError):
380
387
  results.append({"name": name, "kind": kind,
381
388
  "installed": installed_v,
382
- "latest": "source missing", "tap": tap_name,
389
+ "latest": staleness.OUTDATED_SOURCE_MISSING,
390
+ "tap": tap_name,
383
391
  "pinned": bool(lk.get("pinned"))})
384
392
  continue
385
393
  if hashlib.sha256(raw.encode("utf-8")).hexdigest() == lk.get("sha256"):
@@ -406,8 +414,9 @@ def cmd_outdated(argv) -> int:
406
414
  r["latest"], r["tap"]) for r in results]
407
415
  out.table(rows, headers=("NAME", "INSTALLED", "LATEST", "TAP"))
408
416
  print()
409
- out.dim("%d outdated · `boost update` upgrades (pinned items stay put)"
410
- % len(results))
417
+ source_missing = sum(1 for r in results
418
+ if r["latest"] == staleness.OUTDATED_SOURCE_MISSING)
419
+ out.dim(staleness.outdated_footer(len(results), source_missing))
411
420
  return 0
412
421
 
413
422
 
@@ -782,10 +782,9 @@ def cmd_who(argv) -> int:
782
782
  # being installed would contradict `boost list`.
783
783
  found = lockfile.find_any(args.skill)
784
784
  kind, lk = found if found is not None else (None, None)
785
- expertise = ("install", "edit", "evolve", "distill", "tag")
786
785
  rows = [(util.rel_time(e.get("ts", "")), e.get("user", "?"),
787
786
  e.get("action", "?"))
788
- for e in events if e.get("action") in expertise] or \
787
+ for e in events if journal.is_expertise_event(e)] or \
789
788
  [(util.rel_time(e.get("ts", "")), e.get("user", "?"),
790
789
  e.get("action", "?")) for e in events]
791
790
  if args.json:
@@ -809,7 +808,7 @@ def cmd_who(argv) -> int:
809
808
  u = users.setdefault(e.get("user", "?"), {
810
809
  "events": 0, "skills": set(), "installs": 0, "last": e.get("ts", "")})
811
810
  u["events"] += 1
812
- if e.get("subject"):
811
+ if e.get("subject") and journal.is_expertise_event(e):
813
812
  u["skills"].add(e["subject"])
814
813
  if e.get("action") == "install":
815
814
  u["installs"] += 1
@@ -35,6 +35,14 @@ API_URL = "https://api.anthropic.com/v1/messages"
35
35
  # for the one-line reason ("Invalid API key"), never a whole stack dump.
36
36
  STDERR_LOG_CHARS = 200
37
37
 
38
+ # The reason the most recent `ask()` fell through, if it did. `ask()` resets
39
+ # this before every attempt, so it always describes the last call — never a
40
+ # stale failure from an attempt several commands ago. `unavailable_reason()`
41
+ # reads it to tell "no backend" apart from "a backend ran and failed", which
42
+ # `fallback_note()` used to collapse into one PATH/API-key message regardless
43
+ # of which was true.
44
+ _last_failure: str | None = None
45
+
38
46
 
39
47
  def enabled() -> bool:
40
48
  """Return True when `ai.enabled` is on and BOOST_NO_AI is unset."""
@@ -59,23 +67,44 @@ def has_cli() -> bool:
59
67
  return cli_backend() is not None
60
68
 
61
69
 
70
+ def unavailable_reason() -> str:
71
+ """Why the last AI attempt degraded, as a specific, attributable clause.
72
+
73
+ Three causes used to render as one static PATH/API-key message: the user
74
+ disabled AI (`BOOST_NO_AI` or `ai.enabled=false`), no backend exists at
75
+ all, or a backend exists and was tried and failed (an expired login, an
76
+ untrusted workspace, a network error). Only the middle one is a PATH/key
77
+ problem — blaming it for the other two sends a user with a working
78
+ backend chasing an environment issue they do not have.
79
+ """
80
+ if os.environ.get("BOOST_NO_AI"):
81
+ return "disabled (BOOST_NO_AI is set)"
82
+ if not bool(config.get("ai.enabled", True)):
83
+ return "disabled (ai.enabled is off)"
84
+ if not (has_cli() or os.environ.get("ANTHROPIC_API_KEY")):
85
+ clis = " or ".join("`%s`" % aihost.cli(n) for n in aihost.backends())
86
+ return "unavailable — need one of %s on PATH, or ANTHROPIC_API_KEY set" % clis
87
+ if _last_failure:
88
+ return "%s — see ~/.boost/logs/boost.log" % _last_failure
89
+ return "unavailable"
90
+
91
+
62
92
  def fallback_note() -> str:
63
93
  """Return the one-line hint shown when a command degrades to heuristics.
64
94
 
65
- Names every CLI that would work, not just Claude's — telling a Gemini user
66
- to install Claude is a worse answer than telling them boost could not find
67
- either.
95
+ Routed through :func:`unavailable_reason` so the note names the real
96
+ cause instead of always pointing at PATH and API keys.
68
97
  """
69
- clis = " or ".join("`%s`" % aihost.cli(n) for n in aihost.backends())
70
- return ("AI features need one of %s on PATH, or ANTHROPIC_API_KEY set "
71
- "— using the heuristic fallback" % clis)
98
+ return "AI %s — using the heuristic fallback" % unavailable_reason()
72
99
 
73
100
 
74
101
  def ask(prompt: str, system: str | None = None, model: str | None = None,
75
102
  max_tokens: int = 1500, timeout: int = 120) -> str | None:
76
103
  """Ask Claude. Returns the text reply, or None if AI is unavailable/fails."""
104
+ global _last_failure
77
105
  if not enabled():
78
106
  return None
107
+ _last_failure = None
79
108
  model = model or str(config.get("ai.model"))
80
109
  backend = cli_backend()
81
110
  if backend:
@@ -101,8 +130,12 @@ def _log_failure(route: str, reason: str) -> None:
101
130
  degrade quietly, which is the right UX but leaves a user with an expired
102
131
  key or a flaky network no way to tell *why* every AI command went
103
132
  heuristic. DEBUG keeps it out of normal runs: the rotating log file always
104
- records it, and ``--debug`` surfaces it on stderr.
133
+ records it, and ``--debug`` surfaces it on stderr. It also lands in
134
+ ``_last_failure`` so ``unavailable_reason()`` can name it on stderr too,
135
+ where a user who never passes ``--debug`` will actually see it.
105
136
  """
137
+ global _last_failure
138
+ _last_failure = "%s failed (%s)" % (route, reason)
106
139
  logs.get_logger().debug("ai: %s call failed: %s", route, reason)
107
140
 
108
141
 
@@ -88,6 +88,13 @@ class Reply(NamedTuple):
88
88
  ``grounded`` is False only when the AI path was tried and rejected — the
89
89
  caller may want to say so, since a silently downgraded answer looks the same
90
90
  as a confident one.
91
+
92
+ ``ai_failed`` is True only when :func:`ai.available` said yes but
93
+ :func:`ai.ask` came back with nothing — a backend that ran and failed,
94
+ not one that was never tried. Kept separate from ``grounded``: an
95
+ invented name or an unfaithful reply is a *rejection*, with its own
96
+ warning already shown by the caller, while this is a call that produced
97
+ no reply to reject in the first place and would otherwise fail silently.
91
98
  """
92
99
 
93
100
  text: str
@@ -95,6 +102,7 @@ class Reply(NamedTuple):
95
102
  engine: str # which retrieval engine ran, for attribution
96
103
  source: str # "ai" | "extractive"
97
104
  grounded: bool
105
+ ai_failed: bool = False
98
106
 
99
107
 
100
108
  def _history_context(history: Sequence[Turn]) -> str:
@@ -308,7 +316,11 @@ def answer(question: str, history: Sequence[Turn] = (),
308
316
  source, question)
309
317
  reply = ai.ask(prompt, system=_SYSTEM)
310
318
  if not reply:
311
- return Reply(extractive, entries.copy(), engine, "extractive", True)
319
+ # AI was available and was tried — this is a call that failed, not a
320
+ # call that was never made, so the caller gets to say so rather than
321
+ # showing the extractive answer as if AI had never been in the loop.
322
+ return Reply(extractive, entries.copy(), engine, "extractive", True,
323
+ ai_failed=True)
312
324
 
313
325
  reply = reply.strip()
314
326
  invented = ungrounded_names(reply, entries)
@@ -0,0 +1,46 @@
1
+ # Copyright the boost contributors.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ """Pure logic behind `boost index`, kept out of the command layer so it's
4
+ covered by the unit suite and targeted by the mutation gate.
5
+
6
+ Two failure modes an audit found in `commands/discovery.cmd_index`:
7
+ zero GitHub results silently wiping a working ``discovery.json``, and a
8
+ `gh` rate-limit failure surfacing as raw multi-line stderr instead of a
9
+ boost-native hint.
10
+ """
11
+ from __future__ import annotations
12
+
13
+ _RATE_LIMIT_MARKERS = ("rate limit", "gh auth login")
14
+ _RATE_LIMIT_HINT = ("GitHub rate limit hit — wait a minute or authenticate: "
15
+ "`gh auth login` / GH_TOKEN")
16
+
17
+
18
+ def gh_failure_hint(raw: str) -> str:
19
+ """A one-line, boost-native hint for a failed ``gh api`` call.
20
+
21
+ `gh` reports rate limiting and auth failures as multi-line prose plus a
22
+ JSON blob — passed straight through as a :class:`BoostError` hint it
23
+ reads as noise with no boost-native next step. Detected here by the
24
+ markers `gh` itself uses (a rate-limit message, an HTTP 403, or its own
25
+ ``gh auth login`` suggestion) and replaced with one line naming the fix.
26
+ Anything else falls back to the tool's own last few lines, which is at
27
+ least specific to what broke.
28
+ """
29
+ lowered = raw.lower()
30
+ if any(marker in lowered for marker in _RATE_LIMIT_MARKERS) or "403" in raw:
31
+ return _RATE_LIMIT_HINT
32
+ tail = "\n".join(raw.strip().splitlines()[-3:])
33
+ return tail or "check `gh auth status`"
34
+
35
+
36
+ def should_write_index(item_count: int, index_exists: bool) -> bool:
37
+ """Whether a `boost index` run should write its ``discovery.json``.
38
+
39
+ A zero-result run (an over-narrow query, a `gh` hiccup that still
40
+ returns 200 with an empty page) still exits 0, so nothing else signals
41
+ the loss if it overwrites a working index with an empty one. Write only
42
+ when there's something to write, or when nothing was there before —
43
+ a first run still leaves a valid (if empty) file behind rather than
44
+ none at all.
45
+ """
46
+ return item_count > 0 or not index_exists
@@ -13,6 +13,17 @@ from . import paths, util
13
13
  ROTATE_AT = 5000
14
14
  ROTATE_KEEP = 2500
15
15
 
16
+ # Actions that reflect hands-on skill expertise, as opposed to any journal
17
+ # subject at all (tap names, cohort names, reindex summaries, ...). `who`'s
18
+ # per-skill view already filters to this set; the aggregate view must use the
19
+ # same set so a "skill" it counts is actually a skill.
20
+ EXPERTISE_ACTIONS = ("install", "edit", "evolve", "distill", "tag")
21
+
22
+
23
+ def is_expertise_event(event: dict) -> bool:
24
+ """True when `event`'s action reflects hands-on skill expertise."""
25
+ return event.get("action") in EXPERTISE_ACTIONS
26
+
16
27
 
17
28
  def log(action: str, subject: str = "", **fields) -> None:
18
29
  """Append one event line to the pulse feed, rotating when oversized.
@@ -238,10 +238,18 @@ def warn(msg: str, stream=None, wrap: bool = False) -> None:
238
238
 
239
239
 
240
240
  def err(msg: str, hint: str | None = None) -> None:
241
- """Print `Error: msg` to stderr, plus a dim hint line when given."""
241
+ """Print `Error: msg` to stderr, plus a dim hint line when given.
242
+
243
+ A hint that carries its own newlines — gh's own multi-line failure text,
244
+ passed through as-is — used to print continuation lines flush at column
245
+ 0, unindented and visually disconnected from the "hint:" label above
246
+ them. Every line after the first is indented to align under it instead.
247
+ """
242
248
  print(c("Error: ", RED, BOLD) + msg, file=sys.stderr)
243
249
  if hint:
244
- print(c(" hint: " + hint, DIM), file=sys.stderr)
250
+ lead = " hint: "
251
+ body = ("\n" + " " * len(lead)).join(hint.splitlines())
252
+ print(c(lead + body, DIM), file=sys.stderr)
245
253
 
246
254
 
247
255
  def info(msg: str = "", stream=None, wrap: bool = False) -> None: