boost-skill-cli 1.1.1__tar.gz → 1.1.2__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 (716) hide show
  1. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/configuration.py +58 -3
  4. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/complete.py +132 -30
  5. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  6. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
  7. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/commands.html +4 -3
  8. boost_skill_cli-1.1.2/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +82 -0
  9. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap.html +79 -1
  10. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_complete.py +10 -1
  11. boost_skill_cli-1.1.2/tests/unit/test_complete_rc_block.py +367 -0
  12. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.gitattributes +0 -0
  13. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.gitignore +0 -0
  14. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.gitleaks.toml +0 -0
  15. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.htmlvalidate.json +0 -0
  16. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.lighthouserc.json +0 -0
  17. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.lycheeignore +0 -0
  18. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.markdownlint-cli2.jsonc +0 -0
  19. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.pre-commit-config.yaml +0 -0
  20. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.stylelintrc.json +0 -0
  21. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.vale/styles/boost/Terminology.yml +0 -0
  22. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  23. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.vale.ini +0 -0
  24. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/CLAUDE.md +0 -0
  25. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/CODE_OF_CONDUCT.md +0 -0
  26. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/CONTRIBUTING.md +0 -0
  27. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/LICENSE +0 -0
  28. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/MANIFEST.in +0 -0
  29. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/Makefile +0 -0
  30. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/README.md +0 -0
  31. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/SECURITY.md +0 -0
  32. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost +0 -0
  33. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/__init__.py +0 -0
  34. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/__main__.py +0 -0
  35. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/cli.py +0 -0
  36. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/cliparse.py +0 -0
  37. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/__init__.py +0 -0
  38. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/_common.py +0 -0
  39. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/bmad.py +0 -0
  40. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/discovery.py +0 -0
  41. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/hooks.py +0 -0
  42. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/info.py +0 -0
  43. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/intelligence.py +0 -0
  44. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/pkg.py +0 -0
  45. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/quality.py +0 -0
  46. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/run.py +0 -0
  47. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/safety.py +0 -0
  48. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/taps.py +0 -0
  49. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/team.py +0 -0
  50. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/__init__.py +0 -0
  51. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/adapters.py +0 -0
  52. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/agents.py +0 -0
  53. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/ai.py +0 -0
  54. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/bmad.py +0 -0
  55. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/bootstrap.py +0 -0
  56. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/builtin.py +0 -0
  57. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/capabilities.py +0 -0
  58. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/catalog.py +0 -0
  59. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/catalogbundle.py +0 -0
  60. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/chat.py +0 -0
  61. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/claude_settings.py +0 -0
  62. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/config.py +0 -0
  63. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/dense.py +0 -0
  64. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/ed25519.py +0 -0
  65. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/embed.py +0 -0
  66. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/faithfulness.py +0 -0
  67. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/frontmatter.py +0 -0
  68. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/gitutil.py +0 -0
  69. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/imperative.py +0 -0
  70. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/injectscan.py +0 -0
  71. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/installscan.py +0 -0
  72. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/integrity.py +0 -0
  73. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/journal.py +0 -0
  74. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/localembed.py +0 -0
  75. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/lockfile.py +0 -0
  76. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/logs.py +0 -0
  77. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/mcp.py +0 -0
  78. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/mcpdecl.py +0 -0
  79. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/mcphost.py +0 -0
  80. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/minisign.py +0 -0
  81. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/nethttp.py +0 -0
  82. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/output.py +0 -0
  83. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/paths.py +0 -0
  84. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/policy.py +0 -0
  85. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/projectlock.py +0 -0
  86. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/provenance.py +0 -0
  87. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/rag.py +0 -0
  88. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/registry.py +0 -0
  89. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/resolve.py +0 -0
  90. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/rules.py +0 -0
  91. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/scopes.py +0 -0
  92. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/secretscan.py +0 -0
  93. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/selfupdate.py +0 -0
  94. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/serve.py +0 -0
  95. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/stackprobe.py +0 -0
  96. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/staleness.py +0 -0
  97. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/store.py +0 -0
  98. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/trustaudit.py +0 -0
  99. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/typosquat.py +0 -0
  100. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/updatediff.py +0 -0
  101. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/util.py +0 -0
  102. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/workflows.py +0 -0
  103. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/data/registries.json +0 -0
  104. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/data/rules/boost-first.mdc +0 -0
  105. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/errors.py +0 -0
  106. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/spin.py +0 -0
  107. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_langchain/__init__.py +0 -0
  108. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_langchain/_compat.py +0 -0
  109. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_langchain/graph.py +0 -0
  110. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_langchain/loader.py +0 -0
  111. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_langchain/py.typed +0 -0
  112. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_langchain/retriever.py +0 -0
  113. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  114. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  115. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_skill_cli.egg-info/requires.txt +0 -0
  116. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_skill_cli.egg-info/top_level.txt +0 -0
  117. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/codecov.yml +0 -0
  118. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/.claude/settings.local.json +0 -0
  119. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/DEBUGGING.md +0 -0
  120. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/adapters.html +0 -0
  121. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/architecture/README.md +0 -0
  122. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/architecture/c4-components-core.md +0 -0
  123. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/architecture/c4-containers.md +0 -0
  124. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/architecture/c4-context.md +0 -0
  125. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/architecture/c4-dynamic-install.md +0 -0
  126. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/gifs/distill.gif +0 -0
  127. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/gifs/doctor.gif +0 -0
  128. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/gifs/explain.gif +0 -0
  129. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/gifs/hooks.gif +0 -0
  130. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/gifs/install.gif +0 -0
  131. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/gifs/pulse.gif +0 -0
  132. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/gifs/search.gif +0 -0
  133. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/gifs/tap.gif +0 -0
  134. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/tapes/distill.tape +0 -0
  135. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/tapes/doctor.tape +0 -0
  136. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/tapes/explain.tape +0 -0
  137. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/tapes/hooks.tape +0 -0
  138. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/tapes/install.tape +0 -0
  139. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/tapes/pulse.tape +0 -0
  140. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/tapes/search.tape +0 -0
  141. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/tapes/tap.tape +0 -0
  142. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel.html +0 -0
  143. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/chat.html +0 -0
  144. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/demo-index.json +0 -0
  145. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/demo.gif +0 -0
  146. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/demo.html +0 -0
  147. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/demo.tape +0 -0
  148. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/design-roadmap.html +0 -0
  149. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/eval-latest.json +0 -0
  150. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/eval.html +0 -0
  151. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/index.html +0 -0
  152. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/langchain.html +0 -0
  153. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/mcp-hub.html +0 -0
  154. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/rag-architecture.md +0 -0
  155. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D01.md +0 -0
  156. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D02.md +0 -0
  157. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D03.md +0 -0
  158. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D04.md +0 -0
  159. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D05.md +0 -0
  160. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D06.md +0 -0
  161. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D07.md +0 -0
  162. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D08.md +0 -0
  163. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D09.md +0 -0
  164. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D10.md +0 -0
  165. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D11.md +0 -0
  166. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D12.md +0 -0
  167. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D13.md +0 -0
  168. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D14.md +0 -0
  169. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D15.md +0 -0
  170. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D16.md +0 -0
  171. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D17.md +0 -0
  172. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D18.md +0 -0
  173. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D19.md +0 -0
  174. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D20.md +0 -0
  175. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D21.md +0 -0
  176. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D22.md +0 -0
  177. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D23.md +0 -0
  178. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D24.md +0 -0
  179. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D25.md +0 -0
  180. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D26.md +0 -0
  181. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
  182. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  183. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
  184. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
  185. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
  186. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
  187. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
  188. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  189. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  190. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  191. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
  192. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
  193. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
  194. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/boost-first-rule.md +0 -0
  195. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
  196. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  197. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  198. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  199. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  200. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  201. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  202. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  203. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
  204. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
  205. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
  206. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
  207. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
  208. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  209. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
  210. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
  211. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/command-carousel-page.md +0 -0
  212. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  213. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
  214. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  215. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  216. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  217. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  218. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
  219. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  220. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
  221. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
  222. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
  223. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
  224. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
  225. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
  226. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
  227. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
  228. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
  229. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  230. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
  231. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
  232. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  233. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  234. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
  235. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
  236. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  237. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
  238. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
  239. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
  240. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
  241. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
  242. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
  243. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
  244. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
  245. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
  246. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  247. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  248. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  249. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  250. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  251. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  252. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  253. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  254. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  255. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
  256. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
  257. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/github-community-health-files.md +0 -0
  258. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  259. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
  260. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  261. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  262. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
  263. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  264. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
  265. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
  266. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
  267. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/install-path-disambiguation.md +0 -0
  268. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
  269. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  270. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
  271. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  272. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
  273. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  274. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
  275. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
  276. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
  277. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
  278. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
  279. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
  280. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
  281. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  282. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/license-compliance-scanning.md +0 -0
  283. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  284. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
  285. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
  286. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  287. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  288. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
  289. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  290. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  291. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  292. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
  293. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
  294. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
  295. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  296. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  297. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
  298. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
  299. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-aware-skills.md +0 -0
  300. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
  301. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  302. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
  303. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  304. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
  305. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  306. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  307. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
  308. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
  309. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
  310. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  311. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
  312. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  313. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
  314. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
  315. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  316. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
  317. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  318. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  319. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  320. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
  321. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
  322. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
  323. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
  324. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
  325. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  326. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
  327. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
  328. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  329. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  330. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  331. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
  332. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
  333. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  334. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  335. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
  336. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  337. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  338. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
  339. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  340. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  341. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  342. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  343. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  344. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  345. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  346. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
  347. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
  348. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
  349. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
  350. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  351. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
  352. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  353. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  354. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  355. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
  356. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
  357. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
  358. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/required-checks-config-drift.md +0 -0
  359. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
  360. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  361. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  362. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
  363. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
  364. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
  365. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  366. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
  367. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  368. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
  369. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  370. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  371. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  372. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
  373. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  374. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
  375. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  376. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
  377. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
  378. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
  379. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
  380. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  381. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  382. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  383. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  384. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
  385. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
  386. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
  387. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
  388. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
  389. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
  390. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
  391. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  392. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  393. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  394. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  395. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  396. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  397. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
  398. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  399. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  400. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
  401. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
  402. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
  403. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
  404. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
  405. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  406. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
  407. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  408. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
  409. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
  410. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  411. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  412. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  413. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
  414. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  415. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
  416. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
  417. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  418. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
  419. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  420. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
  421. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  422. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  423. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  424. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
  425. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  426. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  427. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  428. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/workspace-scope-install.md +0 -0
  429. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/zip-strict-audit.md +0 -0
  430. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
  431. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
  432. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/eslint.config.mjs +0 -0
  433. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/evals/README.md +0 -0
  434. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/evals/__init__.py +0 -0
  435. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/evals/baseline.json +0 -0
  436. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/evals/faithfulness.py +0 -0
  437. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/evals/golden_set.json +0 -0
  438. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/evals/make_corpus.py +0 -0
  439. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/evals/make_golden.py +0 -0
  440. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/evals/metrics.py +0 -0
  441. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/evals/publish_golden_dataset.py +0 -0
  442. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/evals/run_evals.py +0 -0
  443. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/examples/README.md +0 -0
  444. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/examples/adapt-demo.sh +0 -0
  445. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/examples/boost-run-prototype.sh +0 -0
  446. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/index.html +0 -0
  447. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/noxfile.py +0 -0
  448. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/pyproject.toml +0 -0
  449. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/coverage-tools.in +0 -0
  450. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/coverage-tools.txt +0 -0
  451. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/lint-tools.in +0 -0
  452. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/lint-tools.txt +0 -0
  453. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/mutation-tools.in +0 -0
  454. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/mutation-tools.txt +0 -0
  455. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/platform-pins.lock +0 -0
  456. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/release-tools.in +0 -0
  457. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/release-tools.txt +0 -0
  458. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/test-tools.in +0 -0
  459. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/test-tools.txt +0 -0
  460. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/a11y_check.py +0 -0
  461. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/bench_cli.sh +0 -0
  462. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/build_command_reference.py +0 -0
  463. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/build_demo_index.py +0 -0
  464. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/build_registries.py +0 -0
  465. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/build_roadmap.py +0 -0
  466. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/build_scale_corpus.py +0 -0
  467. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/check_anchors.py +0 -0
  468. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/check_licenses.py +0 -0
  469. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/check_required_checks.py +0 -0
  470. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/ensure_eval_corpus.sh +0 -0
  471. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/eval_corpus.py +0 -0
  472. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/eval_explain.py +0 -0
  473. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/eval_gate.py +0 -0
  474. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/eval_recommend.py +0 -0
  475. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/eval_retrieval.py +0 -0
  476. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/eval_stats_summary.py +0 -0
  477. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/import_budget.py +0 -0
  478. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/lock_toolchain.py +0 -0
  479. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/measure_registry.py +0 -0
  480. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/mutation_gate.py +0 -0
  481. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/mutation_shards.py +0 -0
  482. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/mutation_weights.json +0 -0
  483. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/page_budget.py +0 -0
  484. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/perf_gate.py +0 -0
  485. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/post_deploy_smoke.py +0 -0
  486. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/publish_eval_json.py +0 -0
  487. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/release_guard.py +0 -0
  488. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/release_preflight.py +0 -0
  489. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/serve_docs.py +0 -0
  490. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/setup.cfg +0 -0
  491. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/sonar-project.properties +0 -0
  492. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/style/README.md +0 -0
  493. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/style/boost.css +0 -0
  494. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/style/boost.js +0 -0
  495. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/style/demo.html +0 -0
  496. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/adapt.feature +0 -0
  497. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/browse.feature +0 -0
  498. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/count.feature +0 -0
  499. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/discover.feature +0 -0
  500. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/doctor.feature +0 -0
  501. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/environment.py +0 -0
  502. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/explain.feature +0 -0
  503. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/index.feature +0 -0
  504. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/install.feature +0 -0
  505. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/list.feature +0 -0
  506. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/mcp.feature +0 -0
  507. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/search.feature +0 -0
  508. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/steps/cli_steps.py +0 -0
  509. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/steps/discovery_steps.py +0 -0
  510. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/steps/mcp_steps.py +0 -0
  511. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/steps/quality_steps.py +0 -0
  512. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/conftest.py +0 -0
  513. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/eval/baseline.json +0 -0
  514. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/eval/explain.jsonl +0 -0
  515. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/eval/golden-natural.jsonl +0 -0
  516. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/eval/golden.jsonl +0 -0
  517. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/eval/recommend.jsonl +0 -0
  518. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/eval/taps-scale.txt +0 -0
  519. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/eval/taps.txt +0 -0
  520. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_capabilities_policy.py +0 -0
  521. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_adapt.py +0 -0
  522. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_bmad.py +0 -0
  523. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_catalog.py +0 -0
  524. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_chat.py +0 -0
  525. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_configuration.py +0 -0
  526. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_discovery.py +0 -0
  527. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_hooks.py +0 -0
  528. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_info.py +0 -0
  529. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_intelligence.py +0 -0
  530. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_pkg.py +0 -0
  531. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_quality.py +0 -0
  532. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_taps.py +0 -0
  533. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_team.py +0 -0
  534. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_everyday_loop.py +0 -0
  535. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_integrity_enforce.py +0 -0
  536. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_kind_conformance.py +0 -0
  537. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_property_parsers.py +0 -0
  538. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_run.py +0 -0
  539. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_tap_signing.py +0 -0
  540. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_workspace_scope.py +0 -0
  541. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/README.md +0 -0
  542. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
  543. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
  544. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
  545. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
  546. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
  547. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
  548. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
  549. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
  550. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
  551. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
  552. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
  553. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
  554. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
  555. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/registry/02-https.txt +0 -0
  556. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
  557. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
  558. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
  559. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/registry/06-space.txt +0 -0
  560. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
  561. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
  562. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/fuzz_frontmatter.py +0 -0
  563. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/fuzz_registry.py +0 -0
  564. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/langchain/conftest.py +0 -0
  565. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/langchain/test_graph.py +0 -0
  566. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/langchain/test_loader.py +0 -0
  567. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/langchain/test_retriever.py +0 -0
  568. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/make_fixture.py +0 -0
  569. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/perf/test_benchmarks.py +0 -0
  570. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/smoke.sh +0 -0
  571. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_a11y_check.py +0 -0
  572. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_action_pin_lockstep.py +0 -0
  573. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_adapters.py +0 -0
  574. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_adapters_multi.py +0 -0
  575. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_adapters_runner.py +0 -0
  576. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_agents.py +0 -0
  577. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_ai.py +0 -0
  578. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_bmad_core.py +0 -0
  579. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_boost_first_offer.py +0 -0
  580. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_bootstrap.py +0 -0
  581. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_builtin.py +0 -0
  582. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_capabilities.py +0 -0
  583. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_catalog.py +0 -0
  584. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_catalogbundle.py +0 -0
  585. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_chat.py +0 -0
  586. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_check_anchors.py +0 -0
  587. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_check_licenses.py +0 -0
  588. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_claude_settings.py +0 -0
  589. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_clean_internal_cache.py +0 -0
  590. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_cliparse.py +0 -0
  591. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_codeql_analysis_key.py +0 -0
  592. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_command_reference_fresh.py +0 -0
  593. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_community_health_files.py +0 -0
  594. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_compact.py +0 -0
  595. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_config.py +0 -0
  596. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_content_dedupe.py +0 -0
  597. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_crash_redaction.py +0 -0
  598. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_dedup_trust.py +0 -0
  599. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_demo_index.py +0 -0
  600. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_dense.py +0 -0
  601. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_dense_fallback.py +0 -0
  602. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_dense_fix_hint.py +0 -0
  603. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_dense_shard_real_schema.py +0 -0
  604. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
  605. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_dense_shards.py +0 -0
  606. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_dense_status.py +0 -0
  607. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_dependabot_config.py +0 -0
  608. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_docs_pages_linked.py +0 -0
  609. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_docsite_chrome.py +0 -0
  610. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_ed25519.py +0 -0
  611. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_embed.py +0 -0
  612. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_embed_local.py +0 -0
  613. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_embed_truncated_response.py +0 -0
  614. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_entry_key.py +0 -0
  615. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_errors_and_cli_table.py +0 -0
  616. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_eval_baseline.py +0 -0
  617. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_eval_corpus.py +0 -0
  618. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_eval_faithfulness.py +0 -0
  619. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_eval_gate.py +0 -0
  620. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_eval_grading.py +0 -0
  621. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_eval_metrics.py +0 -0
  622. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_eval_stats_summary.py +0 -0
  623. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
  624. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_faithfulness.py +0 -0
  625. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_frontmatter.py +0 -0
  626. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_fuzz_targets.py +0 -0
  627. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_gemini_agent_sanitize.py +0 -0
  628. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_gitleaks_config.py +0 -0
  629. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_gitutil.py +0 -0
  630. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_gitutil_lfs.py +0 -0
  631. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_gitutil_sparse.py +0 -0
  632. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_imperative.py +0 -0
  633. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_import_budget.py +0 -0
  634. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_injectscan.py +0 -0
  635. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_install_permission_error.py +0 -0
  636. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_installscan.py +0 -0
  637. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_integrity.py +0 -0
  638. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_journal.py +0 -0
  639. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_langchain_packaging.py +0 -0
  640. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_link_ownership.py +0 -0
  641. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_localembed.py +0 -0
  642. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_localembed_e2e.py +0 -0
  643. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_lockfile.py +0 -0
  644. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_logs.py +0 -0
  645. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_marketing_counts.py +0 -0
  646. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_mcp.py +0 -0
  647. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_mcp_install_scan.py +0 -0
  648. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_mcpdecl.py +0 -0
  649. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_mcphost.py +0 -0
  650. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_measure_registry.py +0 -0
  651. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_minisign.py +0 -0
  652. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_mutation_hardening.py +0 -0
  653. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_mutation_shards.py +0 -0
  654. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_mutation_subfile_shards.py +0 -0
  655. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_mutmut_source_paths.py +0 -0
  656. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_nethttp.py +0 -0
  657. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_output.py +0 -0
  658. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_page_budget.py +0 -0
  659. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_paths.py +0 -0
  660. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_perf_gate.py +0 -0
  661. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_pkg_confusions.py +0 -0
  662. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_pkg_injection.py +0 -0
  663. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_pkg_secrets.py +0 -0
  664. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_platform_pins.py +0 -0
  665. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_policy.py +0 -0
  666. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_post_deploy_smoke.py +0 -0
  667. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_project_mcp_sidecar.py +0 -0
  668. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_projectlock.py +0 -0
  669. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_provenance.py +0 -0
  670. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_publish_golden_dataset.py +0 -0
  671. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_rag.py +0 -0
  672. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_rag_fusion.py +0 -0
  673. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_registries_fresh.py +0 -0
  674. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_registry.py +0 -0
  675. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_registry_categories.py +0 -0
  676. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_registry_control_chars.py +0 -0
  677. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_release_guard.py +0 -0
  678. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_release_preflight.py +0 -0
  679. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_required_checks.py +0 -0
  680. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_resolve.py +0 -0
  681. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_roadmap_fresh.py +0 -0
  682. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_rules.py +0 -0
  683. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_scale_corpus.py +0 -0
  684. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_scopes.py +0 -0
  685. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_secretscan.py +0 -0
  686. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_selfupdate.py +0 -0
  687. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_serve.py +0 -0
  688. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_serve_docs.py +0 -0
  689. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_shards_matrix.py +0 -0
  690. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_smoke_covers_every_command.py +0 -0
  691. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_spin.py +0 -0
  692. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_stackprobe.py +0 -0
  693. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_staleness.py +0 -0
  694. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_store.py +0 -0
  695. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_store_materialize.py +0 -0
  696. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_sync_blocked_links.py +0 -0
  697. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
  698. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_token_parity.py +0 -0
  699. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_toolchain_lock.py +0 -0
  700. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_trustaudit.py +0 -0
  701. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_typosquat.py +0 -0
  702. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_updatediff.py +0 -0
  703. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_util.py +0 -0
  704. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_version.py +0 -0
  705. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_visual_harness_flags.py +0 -0
  706. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_workflow_concurrency.py +0 -0
  707. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_workflow_concurrency_groups.py +0 -0
  708. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_workflow_push_has_credentials.py +0 -0
  709. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_workflow_timeouts.py +0 -0
  710. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_workflows.py +0 -0
  711. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
  712. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/visual/a11y_check.mjs +0 -0
  713. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/visual/console_check.mjs +0 -0
  714. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/visual/package-lock.json +0 -0
  715. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/visual/package.json +0 -0
  716. {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/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.1.1
3
+ Version: 1.1.2
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.1.1'
22
- __version_tuple__ = version_tuple = (1, 1, 1)
21
+ __version__ = version = '1.1.2'
22
+ __version_tuple__ = version_tuple = (1, 1, 2)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -3,6 +3,7 @@ completions, schedule, serve, mcp, self-update."""
3
3
  from __future__ import annotations
4
4
 
5
5
  import argparse
6
+ import difflib
6
7
  import json
7
8
  import os
8
9
  import re
@@ -659,8 +660,42 @@ def _sq(s: str) -> str:
659
660
  return s.replace("'", "'\\''")
660
661
 
661
662
 
663
+ def _report_rc_plan(plan, install: bool, shell: str) -> None:
664
+ """Print what `--dry-run` would do to an rc file, and nothing else."""
665
+ if not plan.changes:
666
+ out.ok("%s already %s — no change"
667
+ % (_tilde(plan.path),
668
+ "wired for boost completions" if install
669
+ else "free of boost completions"))
670
+ return
671
+ verb = {
672
+ "create": "would create %s and wire boost completions into it",
673
+ "add": "would wire boost completions into %s",
674
+ # `replace` also covers collapsing a duplicated block back to one.
675
+ "replace": "would rewrite the boost completions block in %s",
676
+ "remove": "would remove boost completions from %s",
677
+ }[plan.action]
678
+ out.info(verb % _tilde(plan.path))
679
+ for line in _rc_plan_diff(plan):
680
+ out.dim(" " + line)
681
+ out.dim(" re-run without --dry-run to apply")
682
+
683
+
684
+ def _rc_plan_diff(plan) -> list[str]:
685
+ """The +/- lines between a plan's before and after, for the dry run.
686
+
687
+ The ``---``/``+++``/``@@`` scaffolding is dropped: the file is named on the
688
+ line above, and line numbers earn nothing on a five-line rc edit.
689
+ """
690
+ return [ln.rstrip("\n")
691
+ for ln in difflib.unified_diff(plan.before.splitlines(),
692
+ plan.after.splitlines(), n=1)
693
+ if not ln.startswith(("---", "+++", "@@"))]
694
+
695
+
662
696
  def cmd_completions(argv) -> int:
663
- """boost completions [bash|zsh|fish] [--install|--uninstall] [--eval]"""
697
+ """boost completions [bash|zsh|fish] [--install|--uninstall] [--eval]
698
+ [--dry-run]"""
664
699
  p = cliparse.parser(
665
700
  prog="boost completions",
666
701
  description="Generate shell tab-completion scripts")
@@ -669,6 +704,9 @@ def cmd_completions(argv) -> int:
669
704
  p.add_argument("--eval", action="store_true",
670
705
  help="print the variant safe to `eval` directly "
671
706
  "(what --install wires up)")
707
+ p.add_argument("--dry-run", action="store_true",
708
+ help="with --install/--uninstall: report what would change "
709
+ "in the rc file without writing it")
672
710
  group = p.add_mutually_exclusive_group()
673
711
  group.add_argument("--install", action="store_true",
674
712
  help="wire completions into the shell's rc file "
@@ -679,11 +717,28 @@ def cmd_completions(argv) -> int:
679
717
 
680
718
  detected = args.shell or Path(os.environ.get("SHELL", "")).name
681
719
 
720
+ if args.dry_run and not (args.install or args.uninstall):
721
+ p.error("--dry-run qualifies --install or --uninstall; "
722
+ "pass one of them")
723
+
682
724
  if args.install or args.uninstall:
683
- rc = (complete.install if args.install else complete.uninstall)(detected)
725
+ # Plan first either way, so a malformed rc file is reported before
726
+ # anything is written rather than after.
727
+ plan = (complete.plan_install if args.install
728
+ else complete.plan_uninstall)(detected)
729
+ if args.dry_run:
730
+ _report_rc_plan(plan, install=args.install, shell=detected)
731
+ return 0
732
+ complete.apply(plan)
733
+ if not plan.changes:
734
+ out.ok("%s already %s — no change"
735
+ % (_tilde(plan.path),
736
+ "wired for boost completions" if args.install
737
+ else "free of boost completions"))
738
+ return 0
684
739
  out.ok("%s boost completions %s %s"
685
740
  % ("wired" if args.install else "removed",
686
- "into" if args.install else "from", _tilde(rc)))
741
+ "into" if args.install else "from", _tilde(plan.path)))
687
742
  if args.install:
688
743
  out.dim(" restart your shell (or run `exec %s`) to pick it up"
689
744
  % detected)
@@ -29,6 +29,7 @@ from __future__ import annotations
29
29
  import os
30
30
  import re
31
31
  from collections.abc import Callable, Sequence
32
+ from dataclasses import dataclass
32
33
  from pathlib import Path
33
34
 
34
35
  from ..errors import BoostError
@@ -257,31 +258,78 @@ def _rc_block(shell: str) -> str:
257
258
  % (_RC_START, shell, _RC_END))
258
259
 
259
260
 
260
- def _merge_rc(text: str, block: str) -> str:
261
+ def _spans(text: str, rc: Path | None = None) -> list[tuple[int, int]]:
262
+ """Half-open (start, end) index pairs of every managed block in ``text``.
263
+
264
+ Raises :class:`BoostError` for a start marker with no matching end, because
265
+ an rc file in that state cannot be edited safely by index. Both writers used
266
+ to pair the *first* start with the *next* end found anywhere after it, so an
267
+ orphan start marker sitting above real config made the next edit delete
268
+ every line in between — reported as ``✓ wired boost completions``. Refusing
269
+ costs the user one hand-edit; guessing cost them their shell config.
270
+
271
+ An orphan *end* is not an error: nothing pairs to it, it is skipped, and the
272
+ file keeps working. Only an unclosed block is ambiguous.
273
+ """
274
+ spans: list[tuple[int, int]] = []
275
+ i = 0
276
+ while (s := text.find(_RC_START, i)) != -1:
277
+ after = s + len(_RC_START)
278
+ e = text.find(_RC_END, after)
279
+ nxt = text.find(_RC_START, after)
280
+ # A block must close before the next one opens. Testing only `e == -1`
281
+ # is the original bug in a new place: an orphan start sitting above a
282
+ # real block finds *that* block's end and swallows every line between.
283
+ if e == -1 or (nxt != -1 and nxt < e):
284
+ where = " in %s" % paths.tilde(rc) if rc is not None else ""
285
+ raise BoostError(
286
+ "boost completions block%s starts but never ends" % where,
287
+ hint="%s has no matching %s — delete the stray start line (or "
288
+ "close the block), then re-run"
289
+ % (_RC_START, _RC_END))
290
+ e += len(_RC_END)
291
+ spans.append((s, e))
292
+ i = e
293
+ return spans
294
+
295
+
296
+ def _outside(text: str, spans: list[tuple[int, int]]) -> list[str]:
297
+ """The stretches of ``text`` that sit outside every managed block."""
298
+ parts, prev = [], 0
299
+ for s, e in spans:
300
+ parts.append(text[prev:s])
301
+ prev = e
302
+ parts.append(text[prev:])
303
+ return parts
304
+
305
+
306
+ def _merge_rc(text: str, block: str, rc: Path | None = None) -> str:
261
307
  """Idempotently set ``block`` in ``text``: replace a prior boost block in
262
308
  place, or append one after a single blank line. Mirrors
263
- :func:`core.rules.merge_block`'s shape with rc-file-safe markers."""
264
- i = text.find(_RC_START)
265
- if i != -1:
266
- j = text.find(_RC_END, i)
267
- if j != -1:
268
- j += len(_RC_END)
269
- return (text[:i] + block + text[j:]).rstrip("\n") + "\n"
270
- base = text.rstrip("\n")
271
- return (base + "\n\n" + block + "\n") if base else block + "\n"
272
-
273
-
274
- def _strip_rc(text: str) -> str:
275
- """Inverse of :func:`_merge_rc`: remove the managed block, if present."""
276
- i = text.find(_RC_START)
277
- if i == -1:
309
+ :func:`core.rules.merge_block`'s shape with rc-file-safe markers.
310
+
311
+ Collapses to exactly one block. Replacing only the first left a second one
312
+ live, so `--install` was idempotent in content but not in count.
313
+ """
314
+ spans = _spans(text, rc)
315
+ if not spans:
316
+ base = text.rstrip("\n")
317
+ return (base + "\n\n" + block + "\n") if base else block + "\n"
318
+ parts = _outside(text, spans)
319
+ return (parts[0] + block + "".join(parts[1:])).rstrip("\n") + "\n"
320
+
321
+
322
+ def _strip_rc(text: str, rc: Path | None = None) -> str:
323
+ """Inverse of :func:`_merge_rc`: remove every managed block, if present.
324
+
325
+ Every, not the first: `--uninstall` on a doubled block used to report
326
+ "removed" while the shell went on sourcing the survivor.
327
+ """
328
+ spans = _spans(text, rc)
329
+ if not spans:
278
330
  return text
279
- j = text.find(_RC_END, i)
280
- if j == -1:
281
- return text # no end marker: malformed, leave the file untouched
282
- j += len(_RC_END)
283
- before, after = text[:i].rstrip("\n"), text[j:].strip("\n")
284
- parts = [p for p in (before, after) if p]
331
+ parts = [p.strip("\n") for p in _outside(text, spans)]
332
+ parts = [p for p in parts if p]
285
333
  return "\n\n".join(parts) + "\n" if parts else ""
286
334
 
287
335
 
@@ -295,22 +343,76 @@ def _rc_path(shell: str) -> Path:
295
343
  return paths.expand("~/" + RC_FILE[shell])
296
344
 
297
345
 
346
+ @dataclass(frozen=True)
347
+ class RcPlan:
348
+ """What an install/uninstall would do to one rc file, before it does it.
349
+
350
+ ``--dry-run`` prints this; ``install``/``uninstall`` apply it. One code path
351
+ computes both, so the preview cannot disagree with the write.
352
+ """
353
+ path: Path
354
+ action: str # create | add | replace | remove | none
355
+ before: str
356
+ after: str
357
+
358
+ @property
359
+ def changes(self) -> bool:
360
+ """True when applying this would alter the file."""
361
+ return self.before != self.after
362
+
363
+
364
+ def _read_rc(shell: str) -> tuple[Path, str, bool]:
365
+ rc = _rc_path(shell)
366
+ exists = rc.exists()
367
+ return rc, (rc.read_text(encoding="utf-8") if exists else ""), exists
368
+
369
+
370
+ def plan_install(shell: str) -> RcPlan:
371
+ """Describe wiring ``shell``'s rc file, writing nothing.
372
+
373
+ Raises :class:`BoostError` for a shell with no rc-file install path, and for
374
+ an rc file holding an unclosed block — so a dry run answers the dangerous
375
+ question too, rather than only the safe one.
376
+ """
377
+ rc, text, exists = _read_rc(shell)
378
+ after = _merge_rc(text, _rc_block(shell), rc)
379
+ if not exists:
380
+ action = "create"
381
+ elif after == text:
382
+ action = "none"
383
+ elif _spans(text, rc):
384
+ action = "replace"
385
+ else:
386
+ action = "add"
387
+ return RcPlan(path=rc, action=action, before=text, after=after)
388
+
389
+
390
+ def plan_uninstall(shell: str) -> RcPlan:
391
+ """Describe removing what :func:`install` wired up, writing nothing."""
392
+ rc, text, _ = _read_rc(shell)
393
+ after = _strip_rc(text, rc)
394
+ return RcPlan(path=rc, action=("remove" if after != text else "none"),
395
+ before=text, after=after)
396
+
397
+
398
+ def apply(plan: RcPlan) -> Path:
399
+ """Write ``plan``'s result. A no-op when it changes nothing, so an rc file
400
+ keeps its mtime (and its place in the user's backups) on a repeat run."""
401
+ if plan.changes:
402
+ plan.path.write_text(plan.after, encoding="utf-8")
403
+ return plan.path
404
+
405
+
298
406
  def install(shell: str) -> Path:
299
407
  """Idempotently wire ``shell``'s rc file to eval boost's completions on
300
408
  every startup. Returns the rc file path. Raises :class:`BoostError` for
301
409
  a shell with no rc-file install path (currently anything but bash/zsh)."""
302
- rc = _rc_path(shell)
303
- text = rc.read_text(encoding="utf-8") if rc.exists() else ""
304
- rc.write_text(_merge_rc(text, _rc_block(shell)), encoding="utf-8")
305
- return rc
410
+ return apply(plan_install(shell))
306
411
 
307
412
 
308
413
  def uninstall(shell: str) -> Path:
309
414
  """Remove what :func:`install` wired up. A no-op if never installed."""
310
- rc = _rc_path(shell)
311
- if rc.exists():
312
- rc.write_text(_strip_rc(rc.read_text(encoding="utf-8")), encoding="utf-8")
313
- return rc
415
+ return apply(plan_uninstall(shell))
314
416
 
315
417
 
316
418
  def detect_shell() -> str:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.1.1
3
+ Version: 1.1.2
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -213,6 +213,7 @@ docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md
213
213
  docs/roadmap/items/command-carousel-page.md
214
214
  docs/roadmap/items/command-reference-docs-site.md
215
215
  docs/roadmap/items/completions-complete-only-command-names.md
216
+ docs/roadmap/items/completions-install-could-eat-your-rc-file.md
216
217
  docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md
217
218
  docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md
218
219
  docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md
@@ -589,6 +590,7 @@ tests/unit/test_command_reference_fresh.py
589
590
  tests/unit/test_community_health_files.py
590
591
  tests/unit/test_compact.py
591
592
  tests/unit/test_complete.py
593
+ tests/unit/test_complete_rc_block.py
592
594
  tests/unit/test_config.py
593
595
  tests/unit/test_content_dedupe.py
594
596
  tests/unit/test_crash_redaction.py
@@ -186,7 +186,7 @@
186
186
  <a class="cmd-link" href="#cmd-create" data-search="create scaffold a new skill from a template --description description --dir dir --install name">create</a>
187
187
  <a class="cmd-link" href="#cmd-policy" data-search="policy manage &amp; enforce skill governance policies --json {list,set,unset,check} key value">policy</a>
188
188
  <a class="cmd-link" href="#cmd-onboard" data-search="onboard add skill-tracker telemetry to a repo &amp; open a pr --repo repo --pr --dry-run -f, --force">onboard</a>
189
- <a class="cmd-link" href="#cmd-completions" data-search="completions generate shell tab-completion scripts --eval --install --uninstall {bash,zsh,fish}">completions</a>
189
+ <a class="cmd-link" href="#cmd-completions" data-search="completions generate shell tab-completion scripts --eval --dry-run --install --uninstall {bash,zsh,fish}">completions</a>
190
190
  <a class="cmd-link" href="#cmd-schedule" data-search="schedule manage automatic skill-sync scheduling --interval {6h,12h,daily} --json {status,enable,disable}">schedule</a>
191
191
  <a class="cmd-link" href="#cmd-serve" data-search="serve browse the catalogue in a browser: search, facets and a tap graph --port port --host host">serve</a>
192
192
  <a class="cmd-link" href="#cmd-mcp" data-search="mcp register boost as an mcp server (claude code, gemini cli) register boost as an mcp server for your agent clis --host h --stdio --seed --no-seed {register,unregister}">mcp</a>
@@ -1049,10 +1049,10 @@
1049
1049
  <div class="arg"><code>-f, --force</code><span>overwrite existing files without confirming</span></div>
1050
1050
  </div>
1051
1051
  </section>
1052
- <section class="cmd" id="cmd-completions" data-search="completions generate shell tab-completion scripts --eval --install --uninstall {bash,zsh,fish}">
1052
+ <section class="cmd" id="cmd-completions" data-search="completions generate shell tab-completion scripts --eval --dry-run --install --uninstall {bash,zsh,fish}">
1053
1053
  <h3><span class="cname">completions</span><span class="gtag">cfg</span></h3>
1054
1054
  <p class="summary">Generate shell tab-completion scripts</p>
1055
- <pre class="syn">boost completions [--eval] [--install] [--uninstall] [{bash,zsh,fish}]</pre>
1055
+ <pre class="syn">boost completions [--eval] [--dry-run] [--install] [--uninstall] [{bash,zsh,fish}]</pre>
1056
1056
  <div class="args-h">Arguments</div>
1057
1057
  <div class="args">
1058
1058
  <div class="arg"><code>{bash,zsh,fish}</code><span>target shell (default: from $SHELL)</span></div>
@@ -1060,6 +1060,7 @@
1060
1060
  <div class="args-h">Options</div>
1061
1061
  <div class="args">
1062
1062
  <div class="arg"><code>--eval</code><span>print the variant safe to `eval` directly (what --install wires up)</span></div>
1063
+ <div class="arg"><code>--dry-run</code><span>with --install/--uninstall: report what would change in the rc file without writing it</span></div>
1063
1064
  <div class="arg"><code>--install</code><span>wire completions into the shell&#x27;s rc file (bash/zsh — one-shot, no manual editing)</span></div>
1064
1065
  <div class="arg"><code>--uninstall</code><span>remove what --install wired up</span></div>
1065
1066
  </div>
@@ -0,0 +1,82 @@
1
+ ---
2
+ id: completions-install-could-eat-your-rc-file
3
+ board: code
4
+ section: dx
5
+ status: inflight
6
+ category: Bug
7
+ complexity: S
8
+ impact: High
9
+ wow: 4
10
+ note: two runs of a "no-op" command deleted the lines between two markers
11
+ order: 113
12
+ owner: fix/completions-malformed-block
13
+ pr:
14
+ title: <code>completions --install</code> could delete the config between its own markers
15
+ ---
16
+ Found by asking a plain question — <em>is <code>boost completions</code>
17
+ idempotent?</em> — and testing the answer rather than reading the docstring. For
18
+ every ordinary input it is: seven paths reach a fixed point on the second run,
19
+ and the managed block is replaced in place rather than appended. Three states
20
+ were not ordinary, and each is reachable from one hand-edit of a shell rc file.
21
+
22
+ <b>A start marker with no end deleted user config.</b> <code>_merge_rc</code>
23
+ paired the first start marker with the next end marker found <em>anywhere</em>
24
+ after it. With an orphan start above real config, run one appended a second
25
+ block, and run two matched the orphan start against that new block's end and
26
+ removed everything in between — the user's own lines — while printing
27
+ <code>✓ wired boost completions into ~/.zshrc</code>. It converged, to a file
28
+ with the user's aliases gone.
29
+
30
+ <b>The inverse function already refused this exact input</b>, ten lines below:
31
+ <code>_strip_rc</code> carried the comment <em>"no end marker: malformed, leave
32
+ the file untouched."</em> So the state was recognised and only the writer failed
33
+ to handle it. That asymmetry is the whole bug, and it is why this was worth
34
+ fixing rather than filing: the reasoning was already in the file.
35
+
36
+ <b>Uninstall had the same hole from the mirror precondition.</b>
37
+ <code>_strip_rc</code> was safe only while the orphan start was the sole marker.
38
+ Put a well-formed block below it and uninstall paired the orphan with that
39
+ block's end: an rc file of <code>export A=1</code> plus four user lines came
40
+ back as <code>export A=1</code> alone.
41
+
42
+ <b>Two blocks made uninstall lie.</b> It removed the first and left the second,
43
+ so boost reported <em>removed</em> while the shell went on sourcing
44
+ completions — the same shape as the <code>sync</code> defect in
45
+ <code>#515</code>, a command reporting success for work it declined to do.
46
+
47
+ <b>The fix is one scan with the right invariant:</b> a block must close before
48
+ the next one opens. Testing only for a missing end marker is the original bug in
49
+ a new place, which the first draft of this fix reproduced and a test caught.
50
+ Install now collapses to exactly one block, uninstall removes every block, and
51
+ both refuse an unclosed one by name instead of guessing. An orphan
52
+ <em>end</em> marker stays harmless and is pinned as such, so a later
53
+ "tighten the parser" change cannot start rejecting a file that works.
54
+
55
+ <b><code>--dry-run</code> makes it answerable before it is written.</b>
56
+ <code>boost completions --install --dry-run</code> prints the exact +/- lines
57
+ and touches nothing, and it raises on the malformed file too — a validation that
58
+ only reports the safe cases is not a validation. Plan and apply are one code
59
+ path (<code>plan_install</code> → <code>apply</code>), so the preview cannot
60
+ disagree with the write, and a test pins that equality. Applying a no-op change
61
+ now also leaves the file's mtime alone rather than rewriting identical bytes.
62
+
63
+ <b>Verified exhaustively, not just by example.</b> A property test enumerates
64
+ every arrangement of up to four fragments — user line, stray start, stray end,
65
+ real block — and asserts three invariants over all 672 orderings: a user line
66
+ boost does not own is never lost, a successful uninstall never leaves a block,
67
+ and a refusal never modifies the file. Against the pre-fix code the same test
68
+ reports <b>220 violations</b> (198 of the second, 22 of the first); against the
69
+ fix, zero. It runs in 0.38s.
70
+
71
+ That sweep also corrected its own first draft. Its initial invariant counted
72
+ every user line, and flagged 16 "failures" that were the managed block behaving
73
+ exactly as conda, nvm and rbenv do — content between the markers is boost's to
74
+ replace. The real invariant is about lines boost does <em>not</em> own, and the
75
+ reference parser has to resolve the orphan-start ambiguity the way the fix does
76
+ rather than the way the bug did, or it under-reports the data loss it exists to
77
+ catch.
78
+
79
+ An rc file is the user's own hand-written config and the worst file boost owns
80
+ an edit to, which is what moves this from tidy-up to High impact. The old tests
81
+ covered only the well-formed path — a double install leaving one marker — so
82
+ none of the three states had a failing test to find them.
@@ -133,7 +133,7 @@
133
133
  <div class="stat"><b>16</b><span>Shipped</span></div>
134
134
  <div class="stat"><b>1</b><span>Next up</span></div>
135
135
  <div class="stat"><b>7</b><span>Planned</span></div>
136
- <div class="stat"><b>251</b><span>Loop finds</span></div>
136
+ <div class="stat"><b>252</b><span>Loop finds</span></div>
137
137
  <!-- /ROADMAP:stats -->
138
138
  </div>
139
139
  </section>
@@ -8225,6 +8225,84 @@ now pinned on the two facts that enforce it — the row says which kind it is, a
8225
8225
  <span class="m">the old page listed only what was installed — 147 rows out of 71,695 — with no search, no tags and no way to see what a tap actually is</span>
8226
8226
  </div>
8227
8227
  </article>
8228
+
8229
+ <article class="cap rcard" id="completions-install-could-eat-your-rc-file">
8230
+ <div class="head"><span class="pill inflight">In flight</span><span class="cat">Bug</span></div>
8231
+ <h3><code>completions --install</code> could delete the config between its own markers</h3>
8232
+ <p>Found by asking a plain question — <em>is <code>boost completions</code>
8233
+ idempotent?</em> — and testing the answer rather than reading the docstring. For
8234
+ every ordinary input it is: seven paths reach a fixed point on the second run,
8235
+ and the managed block is replaced in place rather than appended. Three states
8236
+ were not ordinary, and each is reachable from one hand-edit of a shell rc file.
8237
+
8238
+ <b>A start marker with no end deleted user config.</b> <code>_merge_rc</code>
8239
+ paired the first start marker with the next end marker found <em>anywhere</em>
8240
+ after it. With an orphan start above real config, run one appended a second
8241
+ block, and run two matched the orphan start against that new block's end and
8242
+ removed everything in between — the user's own lines — while printing
8243
+ <code>✓ wired boost completions into ~/.zshrc</code>. It converged, to a file
8244
+ with the user's aliases gone.
8245
+
8246
+ <b>The inverse function already refused this exact input</b>, ten lines below:
8247
+ <code>_strip_rc</code> carried the comment <em>"no end marker: malformed, leave
8248
+ the file untouched."</em> So the state was recognised and only the writer failed
8249
+ to handle it. That asymmetry is the whole bug, and it is why this was worth
8250
+ fixing rather than filing: the reasoning was already in the file.
8251
+
8252
+ <b>Uninstall had the same hole from the mirror precondition.</b>
8253
+ <code>_strip_rc</code> was safe only while the orphan start was the sole marker.
8254
+ Put a well-formed block below it and uninstall paired the orphan with that
8255
+ block's end: an rc file of <code>export A=1</code> plus four user lines came
8256
+ back as <code>export A=1</code> alone.
8257
+
8258
+ <b>Two blocks made uninstall lie.</b> It removed the first and left the second,
8259
+ so boost reported <em>removed</em> while the shell went on sourcing
8260
+ completions — the same shape as the <code>sync</code> defect in
8261
+ <code>#515</code>, a command reporting success for work it declined to do.
8262
+
8263
+ <b>The fix is one scan with the right invariant:</b> a block must close before
8264
+ the next one opens. Testing only for a missing end marker is the original bug in
8265
+ a new place, which the first draft of this fix reproduced and a test caught.
8266
+ Install now collapses to exactly one block, uninstall removes every block, and
8267
+ both refuse an unclosed one by name instead of guessing. An orphan
8268
+ <em>end</em> marker stays harmless and is pinned as such, so a later
8269
+ "tighten the parser" change cannot start rejecting a file that works.
8270
+
8271
+ <b><code>--dry-run</code> makes it answerable before it is written.</b>
8272
+ <code>boost completions --install --dry-run</code> prints the exact +/- lines
8273
+ and touches nothing, and it raises on the malformed file too — a validation that
8274
+ only reports the safe cases is not a validation. Plan and apply are one code
8275
+ path (<code>plan_install</code> → <code>apply</code>), so the preview cannot
8276
+ disagree with the write, and a test pins that equality. Applying a no-op change
8277
+ now also leaves the file's mtime alone rather than rewriting identical bytes.
8278
+
8279
+ <b>Verified exhaustively, not just by example.</b> A property test enumerates
8280
+ every arrangement of up to four fragments — user line, stray start, stray end,
8281
+ real block — and asserts three invariants over all 672 orderings: a user line
8282
+ boost does not own is never lost, a successful uninstall never leaves a block,
8283
+ and a refusal never modifies the file. Against the pre-fix code the same test
8284
+ reports <b>220 violations</b> (198 of the second, 22 of the first); against the
8285
+ fix, zero. It runs in 0.38s.
8286
+
8287
+ That sweep also corrected its own first draft. Its initial invariant counted
8288
+ every user line, and flagged 16 "failures" that were the managed block behaving
8289
+ exactly as conda, nvm and rbenv do — content between the markers is boost's to
8290
+ replace. The real invariant is about lines boost does <em>not</em> own, and the
8291
+ reference parser has to resolve the orphan-start ambiguity the way the fix does
8292
+ rather than the way the bug did, or it under-reports the data loss it exists to
8293
+ catch.
8294
+
8295
+ An rc file is the user's own hand-written config and the worst file boost owns
8296
+ an edit to, which is what moves this from tidy-up to High impact. The old tests
8297
+ covered only the well-formed path — a double install leaving one marker — so
8298
+ none of the three states had a failing test to find them.</p>
8299
+ <div class="meta">
8300
+ <span class="m">Complexity <b>S</b></span>
8301
+ <span class="m hi">Impact <b>High</b></span>
8302
+ <span class="m">Wow <b class="wow">★★★★</b></span>
8303
+ <span class="m">two runs of a "no-op" command deleted the lines between two markers</span>
8304
+ </div>
8305
+ </article>
8228
8306
  <!-- /ROADMAP:cards -->
8229
8307
 
8230
8308
  </div>
@@ -337,10 +337,19 @@ class TestInstallUninstall:
337
337
  # A start marker with no matching end marker means someone hand-edited
338
338
  # the file after boost wrote it — guessing at intent here would risk
339
339
  # eating content that was never boost's to remove.
340
+ #
341
+ # The file is still untouched; what changed is that boost now *says so*
342
+ # instead of exiting 0 as though it had done the job. Silently doing
343
+ # nothing was only safe while the orphan start was the sole marker: with
344
+ # a well-formed block below it, the old scan paired the orphan with that
345
+ # block's end and deleted everything between. See
346
+ # tests/unit/test_complete_rc_block.py for both preconditions.
347
+ from boost_cli.errors import BoostError
340
348
  rc = sandbox / ".bashrc"
341
349
  broken = "before\n# >>> boost completions >>>\nno end marker here\n"
342
350
  rc.write_text(broken, encoding="utf-8")
343
- complete.uninstall("bash")
351
+ with pytest.raises(BoostError):
352
+ complete.uninstall("bash")
344
353
  assert rc.read_text(encoding="utf-8") == broken
345
354
 
346
355