boost-skill-cli 1.0.201__tar.gz → 1.0.203__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 (377) hide show
  1. {boost_skill_cli-1.0.201/boost_skill_cli.egg-info → boost_skill_cli-1.0.203}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/pkg.py +73 -2
  4. boost_skill_cli-1.0.203/boost_cli/core/resolve.py +136 -0
  5. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/serve.py +9 -2
  6. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203/boost_skill_cli.egg-info}/PKG-INFO +1 -1
  7. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_skill_cli.egg-info/SOURCES.txt +5 -0
  8. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/commands.html +4 -3
  9. boost_skill_cli-1.0.203/docs/roadmap/items/install-resolves-skill-dependencies.md +30 -0
  10. boost_skill_cli-1.0.203/docs/roadmap/items/installed-skill-trust-audit.md +25 -0
  11. boost_skill_cli-1.0.203/docs/roadmap/items/mcp-aware-skills.md +25 -0
  12. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap.html +69 -1
  13. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_intelligence.py +3 -1
  14. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_pkg.py +23 -0
  15. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_everyday_loop.py +3 -1
  16. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/smoke.sh +4 -1
  17. boost_skill_cli-1.0.203/tests/unit/test_resolve.py +162 -0
  18. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_serve.py +59 -0
  19. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.gitattributes +0 -0
  20. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.gitignore +0 -0
  21. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.gitleaks.toml +0 -0
  22. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.htmlvalidate.json +0 -0
  23. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.lighthouserc.json +0 -0
  24. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.lycheeignore +0 -0
  25. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.markdownlint-cli2.jsonc +0 -0
  26. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.pre-commit-config.yaml +0 -0
  27. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.stylelintrc.json +0 -0
  28. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.vale/styles/boost/Terminology.yml +0 -0
  29. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  30. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.vale.ini +0 -0
  31. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/CLAUDE.md +0 -0
  32. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/CONTRIBUTING.md +0 -0
  33. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/LICENSE +0 -0
  34. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/MANIFEST.in +0 -0
  35. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/Makefile +0 -0
  36. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/README.md +0 -0
  37. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/SECURITY.md +0 -0
  38. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost +0 -0
  39. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/__init__.py +0 -0
  40. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/__main__.py +0 -0
  41. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/cli.py +0 -0
  42. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/cliparse.py +0 -0
  43. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/__init__.py +0 -0
  44. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/_common.py +0 -0
  45. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/bmad.py +0 -0
  46. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/configuration.py +0 -0
  47. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/discovery.py +0 -0
  48. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/hooks.py +0 -0
  49. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/info.py +0 -0
  50. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/intelligence.py +0 -0
  51. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/quality.py +0 -0
  52. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/run.py +0 -0
  53. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/safety.py +0 -0
  54. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/taps.py +0 -0
  55. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/team.py +0 -0
  56. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/__init__.py +0 -0
  57. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/adapters.py +0 -0
  58. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/agents.py +0 -0
  59. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/ai.py +0 -0
  60. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/capabilities.py +0 -0
  61. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/catalog.py +0 -0
  62. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/claude_settings.py +0 -0
  63. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/config.py +0 -0
  64. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/dense.py +0 -0
  65. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/ed25519.py +0 -0
  66. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/embed.py +0 -0
  67. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/faithfulness.py +0 -0
  68. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/frontmatter.py +0 -0
  69. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/gitutil.py +0 -0
  70. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/imperative.py +0 -0
  71. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/injectscan.py +0 -0
  72. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/integrity.py +0 -0
  73. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/journal.py +0 -0
  74. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/lockfile.py +0 -0
  75. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/logs.py +0 -0
  76. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/mcp.py +0 -0
  77. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/minisign.py +0 -0
  78. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/nethttp.py +0 -0
  79. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/output.py +0 -0
  80. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/paths.py +0 -0
  81. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/policy.py +0 -0
  82. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/projectlock.py +0 -0
  83. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/provenance.py +0 -0
  84. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/rag.py +0 -0
  85. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/registry.py +0 -0
  86. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/rules.py +0 -0
  87. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/scopes.py +0 -0
  88. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/secretscan.py +0 -0
  89. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/stackprobe.py +0 -0
  90. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/staleness.py +0 -0
  91. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/store.py +0 -0
  92. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/typosquat.py +0 -0
  93. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/updatediff.py +0 -0
  94. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/util.py +0 -0
  95. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/workflows.py +0 -0
  96. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/data/registries.json +0 -0
  97. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/errors.py +0 -0
  98. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/spin.py +0 -0
  99. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  100. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  101. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_skill_cli.egg-info/requires.txt +0 -0
  102. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_skill_cli.egg-info/top_level.txt +0 -0
  103. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/.claude/settings.local.json +0 -0
  104. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/DEBUGGING.md +0 -0
  105. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/adapters.html +0 -0
  106. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/demo.gif +0 -0
  107. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/demo.tape +0 -0
  108. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/design-roadmap.html +0 -0
  109. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/eval.html +0 -0
  110. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/index.html +0 -0
  111. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/mcp-hub.html +0 -0
  112. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/rag-architecture.md +0 -0
  113. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D01.md +0 -0
  114. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D02.md +0 -0
  115. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D03.md +0 -0
  116. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D04.md +0 -0
  117. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D05.md +0 -0
  118. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D06.md +0 -0
  119. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D07.md +0 -0
  120. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D08.md +0 -0
  121. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D09.md +0 -0
  122. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D10.md +0 -0
  123. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D11.md +0 -0
  124. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D12.md +0 -0
  125. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D13.md +0 -0
  126. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D14.md +0 -0
  127. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D15.md +0 -0
  128. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D16.md +0 -0
  129. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D17.md +0 -0
  130. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D18.md +0 -0
  131. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D19.md +0 -0
  132. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D20.md +0 -0
  133. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D21.md +0 -0
  134. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D22.md +0 -0
  135. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D23.md +0 -0
  136. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D24.md +0 -0
  137. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D25.md +0 -0
  138. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D26.md +0 -0
  139. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  140. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  141. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  142. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  143. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  144. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  145. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  146. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  147. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  148. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  149. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  150. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  151. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  152. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  153. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  154. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  155. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  156. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  157. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  158. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  159. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  160. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  161. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  162. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  163. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  164. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  165. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  166. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  167. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  168. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  169. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  170. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  171. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  172. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  173. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  174. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  175. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  176. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  177. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  178. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  179. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  180. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  181. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  182. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  183. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  184. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  185. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  186. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  187. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  188. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  189. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
  190. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  191. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  192. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  193. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  194. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  195. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  196. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  197. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  198. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  199. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  200. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  201. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
  202. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  203. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  204. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
  205. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
  206. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  207. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  208. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  209. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  210. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  211. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  212. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  213. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  214. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  215. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  216. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  217. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  218. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  219. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  220. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  221. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  222. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  223. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  224. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  225. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  226. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  227. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  228. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  229. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  230. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  231. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  232. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  233. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  234. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  235. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  236. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  237. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  238. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  239. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  240. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  241. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  242. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  243. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  244. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  245. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  246. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  247. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  248. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  249. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  250. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/workspace-scope-install.md +0 -0
  251. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/eslint.config.mjs +0 -0
  252. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/examples/README.md +0 -0
  253. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/examples/adapt-demo.sh +0 -0
  254. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/examples/boost-run-prototype.sh +0 -0
  255. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/index.html +0 -0
  256. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/noxfile.py +0 -0
  257. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/pyproject.toml +0 -0
  258. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/requirements/lint-tools.txt +0 -0
  259. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/bench_cli.sh +0 -0
  260. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/build_command_reference.py +0 -0
  261. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/build_registries.py +0 -0
  262. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/build_roadmap.py +0 -0
  263. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/check_anchors.py +0 -0
  264. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/ensure_eval_corpus.sh +0 -0
  265. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/eval_explain.py +0 -0
  266. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/eval_recommend.py +0 -0
  267. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/eval_retrieval.py +0 -0
  268. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/eval_stats_summary.py +0 -0
  269. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/import_budget.py +0 -0
  270. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/mutation_gate.py +0 -0
  271. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/perf_gate.py +0 -0
  272. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/setup.cfg +0 -0
  273. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/style/README.md +0 -0
  274. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/style/boost.css +0 -0
  275. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/style/boost.js +0 -0
  276. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/style/demo.html +0 -0
  277. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/adapt.feature +0 -0
  278. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/browse.feature +0 -0
  279. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/count.feature +0 -0
  280. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/discover.feature +0 -0
  281. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/doctor.feature +0 -0
  282. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/environment.py +0 -0
  283. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/explain.feature +0 -0
  284. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/index.feature +0 -0
  285. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/install.feature +0 -0
  286. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/list.feature +0 -0
  287. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/mcp.feature +0 -0
  288. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/search.feature +0 -0
  289. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/steps/cli_steps.py +0 -0
  290. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/steps/discovery_steps.py +0 -0
  291. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/steps/mcp_steps.py +0 -0
  292. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/steps/quality_steps.py +0 -0
  293. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/conftest.py +0 -0
  294. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/eval/baseline.json +0 -0
  295. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/eval/explain.jsonl +0 -0
  296. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/eval/golden.jsonl +0 -0
  297. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/eval/recommend.jsonl +0 -0
  298. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/eval/taps.txt +0 -0
  299. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_capabilities_policy.py +0 -0
  300. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_adapt.py +0 -0
  301. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_bmad.py +0 -0
  302. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_configuration.py +0 -0
  303. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_discovery.py +0 -0
  304. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_hooks.py +0 -0
  305. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_info.py +0 -0
  306. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_quality.py +0 -0
  307. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_taps.py +0 -0
  308. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_team.py +0 -0
  309. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_integrity_enforce.py +0 -0
  310. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_property_parsers.py +0 -0
  311. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_run.py +0 -0
  312. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_tap_signing.py +0 -0
  313. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_workspace_scope.py +0 -0
  314. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/make_fixture.py +0 -0
  315. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/perf/test_benchmarks.py +0 -0
  316. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_adapters.py +0 -0
  317. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_adapters_multi.py +0 -0
  318. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_adapters_runner.py +0 -0
  319. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_agents.py +0 -0
  320. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_ai.py +0 -0
  321. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_capabilities.py +0 -0
  322. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_catalog.py +0 -0
  323. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_check_anchors.py +0 -0
  324. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_claude_settings.py +0 -0
  325. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_cliparse.py +0 -0
  326. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_command_reference_fresh.py +0 -0
  327. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_config.py +0 -0
  328. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_dense.py +0 -0
  329. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_dense_fallback.py +0 -0
  330. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_docs_pages_linked.py +0 -0
  331. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_ed25519.py +0 -0
  332. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_embed.py +0 -0
  333. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_errors_and_cli_table.py +0 -0
  334. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_eval_stats_summary.py +0 -0
  335. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_faithfulness.py +0 -0
  336. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_frontmatter.py +0 -0
  337. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_gitleaks_config.py +0 -0
  338. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_gitutil.py +0 -0
  339. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_imperative.py +0 -0
  340. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_import_budget.py +0 -0
  341. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_injectscan.py +0 -0
  342. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_integrity.py +0 -0
  343. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_journal.py +0 -0
  344. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_lockfile.py +0 -0
  345. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_logs.py +0 -0
  346. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_mcp.py +0 -0
  347. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_minisign.py +0 -0
  348. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_mutation_hardening.py +0 -0
  349. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_nethttp.py +0 -0
  350. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_output.py +0 -0
  351. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_paths.py +0 -0
  352. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_perf_gate.py +0 -0
  353. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_pkg_confusions.py +0 -0
  354. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_pkg_injection.py +0 -0
  355. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_pkg_secrets.py +0 -0
  356. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_policy.py +0 -0
  357. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_projectlock.py +0 -0
  358. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_provenance.py +0 -0
  359. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_rag.py +0 -0
  360. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_registries_fresh.py +0 -0
  361. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_registry.py +0 -0
  362. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_roadmap_fresh.py +0 -0
  363. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_rules.py +0 -0
  364. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_scopes.py +0 -0
  365. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_secretscan.py +0 -0
  366. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_spin.py +0 -0
  367. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_stackprobe.py +0 -0
  368. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_staleness.py +0 -0
  369. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_store.py +0 -0
  370. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_token_parity.py +0 -0
  371. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_typosquat.py +0 -0
  372. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_updatediff.py +0 -0
  373. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_util.py +0 -0
  374. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_version.py +0 -0
  375. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_workflows.py +0 -0
  376. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/visual/package.json +0 -0
  377. {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/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.0.201
3
+ Version: 1.0.203
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.0.201'
22
- __version_tuple__ = version_tuple = (1, 0, 201)
21
+ __version__ = version = '1.0.203'
22
+ __version_tuple__ = version_tuple = (1, 0, 203)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -17,8 +17,8 @@ from typing import Dict, List, Optional
17
17
  from .. import cliparse
18
18
  from ..core import (adapters, agents, catalog, config, frontmatter, gitutil,
19
19
  injectscan, integrity, journal, lockfile, paths, projectlock,
20
- registry, scopes, secretscan, staleness, store, typosquat,
21
- updatediff, util)
20
+ registry, resolve, scopes, secretscan, staleness, store,
21
+ typosquat, updatediff, util)
22
22
  from ..core import output as out
23
23
  from ..errors import BoostError
24
24
 
@@ -163,6 +163,56 @@ def _boostfile_text(skills: Dict[str, dict], via: str = "boost bundle dump") ->
163
163
  return "\n".join(lines) + "\n"
164
164
 
165
165
 
166
+ def _rel_list(meta: dict, key: str) -> List[str]:
167
+ """A skill's `requires:`/`conflicts:` frontmatter as a clean name list."""
168
+ val = (meta or {}).get(key)
169
+ if val in (None, "", False):
170
+ return []
171
+ if isinstance(val, list):
172
+ return [str(x).strip() for x in val if str(x).strip()]
173
+ return [s.strip() for s in str(val).split(",") if s.strip()]
174
+
175
+
176
+ def _skill_relations(name: str, key: str) -> List[str]:
177
+ """`requires:`/`conflicts:` for a skill by name, from its catalog entry."""
178
+ matches = catalog.find(name)
179
+ if not matches:
180
+ return []
181
+ return _rel_list(matches[0].get("meta") or {}, key)
182
+
183
+
184
+ def _expand_dependencies(entries: List[dict]) -> "tuple[List[dict], resolve.Resolution]":
185
+ """Grow the requested entries into their full `requires:` closure.
186
+
187
+ Returns ``(ordered_entries, resolution)`` — the entries to install in
188
+ dependency-first order (roots plus any pulled-in dependencies that are not
189
+ already installed), and the :class:`resolve.Resolution` carrying what was
190
+ added, any advisory conflicts, and unresolved (dangling) requirements.
191
+ """
192
+ installed = frozenset(lockfile.installed())
193
+ res = resolve.resolve(
194
+ [e["name"] for e in entries],
195
+ lambda n: _skill_relations(n, "requires"),
196
+ lambda n: _skill_relations(n, "conflicts"),
197
+ installed=installed,
198
+ known=lambda n: bool(catalog.find(n)),
199
+ )
200
+ by_name = {e["name"]: e for e in entries}
201
+ ordered: List[dict] = []
202
+ for name in res.order:
203
+ if name in by_name:
204
+ ordered.append(by_name[name])
205
+ continue
206
+ try:
207
+ ordered.append(catalog.resolve_one(name))
208
+ except BoostError:
209
+ # A dep that resolves nowhere unambiguously is reported via
210
+ # res.unresolved; skip it here rather than abort the whole install.
211
+ if name not in res.unresolved:
212
+ res.unresolved.append(name)
213
+ return ordered, res
214
+
215
+
166
216
  # ── install ──────────────────────────────────────────────────────────────
167
217
 
168
218
  def cmd_install(argv: List[str]) -> int:
@@ -186,6 +236,8 @@ def cmd_install(argv: List[str]) -> int:
186
236
  help="into your user config (= --scope user, default)")
187
237
  ap.add_argument("--dry-run", action="store_true",
188
238
  help="show what would happen without changing anything")
239
+ ap.add_argument("--no-deps", action="store_true",
240
+ help="install only the named skills, not their `requires:`")
189
241
  args = ap.parse_args(argv)
190
242
  args.scope = args.scope or scopes.SCOPE_USER
191
243
  only = _check_agents(args.agent)
@@ -202,6 +254,25 @@ def cmd_install(argv: List[str]) -> int:
202
254
 
203
255
  _warn_confusions(entries)
204
256
 
257
+ # Grow the request into its `requires:` closure (deps installed first),
258
+ # unless the caller opted out. Only skills carry dependency frontmatter;
259
+ # rules/workflows pass through unchanged.
260
+ if not args.no_deps and entries:
261
+ entries, dep_res = _expand_dependencies(entries)
262
+ if dep_res.added:
263
+ out.info("pulling in %s required by your selection: %s"
264
+ % (_plural(len(dep_res.added), "dependency"),
265
+ ", ".join(dep_res.added)))
266
+ for name in dep_res.unresolved:
267
+ out.warn("required skill %r is in no tap — skipped "
268
+ "(install it manually or `boost tap` its source)" % name)
269
+ for skill, clash in dep_res.conflicts:
270
+ out.warn("%s declares a conflict with %s (also present)" % (skill, clash))
271
+ # Pulling in dependencies can turn a single-name request into a multi-item
272
+ # install (per-item headings); it must never *lower* multi (e.g. when an
273
+ # unknown co-requested name was dropped), so OR rather than reassign.
274
+ multi = multi or len(entries) > 1
275
+
205
276
  if args.dry_run:
206
277
  targets = [a for a in agents.enabled_agents() if not only or a in only]
207
278
  pbase = scopes.resolve_base(args.scope)
@@ -0,0 +1,136 @@
1
+ """Skill dependency resolution — turn a set of requested skills into the full,
2
+ correctly-ordered install list by following each skill's ``requires:`` closure.
3
+
4
+ boost skills declare relationships in frontmatter (``requires:`` /
5
+ ``conflicts:``); until now those were only *displayed* (``boost info`` /
6
+ ``boost deps``). This module is the resolver that makes ``boost install`` act on
7
+ them — the "Homebrew installs dependencies" behavior — as a pure, dependency-
8
+ injected function so it is unit- and mutation-testable with no catalog or
9
+ filesystem access.
10
+
11
+ The caller supplies two lookups so the core stays I/O-free:
12
+
13
+ * ``requires_of(name) -> list[str]`` — the skills ``name`` declares it needs.
14
+ * ``conflicts_of(name) -> list[str]`` — the skills ``name`` declares it clashes
15
+ with (optional; defaults to none).
16
+
17
+ and, optionally, ``known(name) -> bool`` to tell a resolvable dependency from a
18
+ dangling one (a ``requires:`` naming a skill in no tap). Everything else is
19
+ plain graph work.
20
+ """
21
+ from __future__ import annotations
22
+
23
+ from dataclasses import dataclass, field
24
+ from typing import Callable, FrozenSet, List, Optional, Sequence, Tuple
25
+
26
+ __all__ = ["Resolution", "resolve"]
27
+
28
+
29
+ @dataclass
30
+ class Resolution:
31
+ """The outcome of resolving a set of requested skills.
32
+
33
+ * ``order`` — the install order, dependencies before dependents, with
34
+ already-installed skills that were only pulled in as dependencies dropped.
35
+ A *requested* skill stays in ``order`` even when already installed (so an
36
+ explicit ``boost install x`` still reinstalls/upgrades it, matching the
37
+ pre-resolver behavior).
38
+ * ``added`` — the transitive dependencies that were pulled in (``order``
39
+ minus the requested roots), in install order — what to tell the user got
40
+ added on their behalf.
41
+ * ``conflicts`` — ``(skill, clashes_with)`` pairs where a skill in the plan
42
+ declares a ``conflicts:`` against something already installed or also
43
+ being installed. Advisory (a warning), never a hard failure.
44
+ * ``unresolved`` — required skill names with no known source (a dangling
45
+ ``requires:``); surfaced so the caller can warn rather than crash.
46
+ """
47
+
48
+ order: List[str] = field(default_factory=list)
49
+ added: List[str] = field(default_factory=list)
50
+ conflicts: List[Tuple[str, str]] = field(default_factory=list)
51
+ unresolved: List[str] = field(default_factory=list)
52
+
53
+
54
+ def _norm(names: Sequence[str]) -> List[str]:
55
+ """De-dupe a name sequence preserving first-seen order."""
56
+ seen: List[str] = []
57
+ for n in names:
58
+ if n and n not in seen:
59
+ seen.append(n)
60
+ return seen
61
+
62
+
63
+ def resolve(
64
+ roots: Sequence[str],
65
+ requires_of: Callable[[str], Sequence[str]],
66
+ conflicts_of: Optional[Callable[[str], Sequence[str]]] = None,
67
+ *,
68
+ installed: FrozenSet[str] = frozenset(),
69
+ known: Optional[Callable[[str], bool]] = None,
70
+ ) -> Resolution:
71
+ """Resolve ``roots`` plus their ``requires:`` closure into an install plan.
72
+
73
+ Post-order depth-first traversal yields dependencies before the skills that
74
+ need them. The traversal is cycle-safe (a skill on the current DFS stack is
75
+ not re-entered) and each skill is visited once. A dependency that is already
76
+ ``installed`` is not re-added; a *requested* root is always kept so an
77
+ explicit reinstall/upgrade still happens. Unknown dependencies (per
78
+ ``known``) are recorded in ``unresolved`` and not traversed further.
79
+ """
80
+ conflicts_of = conflicts_of or (lambda _n: [])
81
+ known = known or (lambda _n: True)
82
+ roots = _norm(roots)
83
+ root_set = set(roots)
84
+
85
+ order: List[str] = []
86
+ done: set = set() # fully-processed (post-order emitted)
87
+ on_stack: set = set() # currently being visited — cycle guard
88
+ unresolved: List[str] = []
89
+
90
+ def visit(name: str, is_root: bool) -> None:
91
+ if name in done or name in on_stack:
92
+ return # already emitted, or a cycle — stop
93
+ # An already-installed skill pulled in only as a dependency is assumed
94
+ # satisfied — don't re-traverse or re-emit its subtree. (A requested root
95
+ # is still walked so an explicit reinstall re-checks its deps; gap-filling
96
+ # of a broken installed skill is `boost heal`'s job, not install's.)
97
+ if name in installed and not is_root:
98
+ done.add(name)
99
+ return
100
+ on_stack.add(name)
101
+ for dep in _norm(list(requires_of(name) or [])):
102
+ if dep == name:
103
+ continue # a self-require is a no-op, never a cycle error
104
+ if not known(dep):
105
+ if dep not in unresolved:
106
+ unresolved.append(dep)
107
+ continue
108
+ visit(dep, is_root=False)
109
+ on_stack.discard(name)
110
+ done.add(name)
111
+ # Emit unless it is an already-installed skill pulled in only as a dep;
112
+ # a requested root is always emitted (reinstall/upgrade semantics).
113
+ if is_root or name not in installed:
114
+ order.append(name)
115
+
116
+ for r in roots:
117
+ visit(r, is_root=True)
118
+
119
+ added = [n for n in order if n not in root_set]
120
+
121
+ # Conflict scan: anything in the plan (being installed) OR already installed
122
+ # is a live presence; flag a declared conflict against any live presence.
123
+ live = set(order) | set(installed)
124
+ conflicts: List[Tuple[str, str]] = []
125
+ seen_pairs: set = set()
126
+ for skill in order:
127
+ for clash in _norm(list(conflicts_of(skill) or [])):
128
+ if clash == skill or clash not in live:
129
+ continue
130
+ key = (skill, clash)
131
+ if key not in seen_pairs:
132
+ seen_pairs.add(key)
133
+ conflicts.append(key)
134
+
135
+ return Resolution(order=order, added=added,
136
+ conflicts=conflicts, unresolved=unresolved)
@@ -20,7 +20,7 @@ from typing import Optional, Tuple
20
20
 
21
21
  from .. import __version__
22
22
  from ..errors import BoostError
23
- from . import catalog, lockfile, registry, store
23
+ from . import catalog, lockfile, logs, registry, store
24
24
  from . import output as out
25
25
  import contextlib
26
26
 
@@ -173,9 +173,16 @@ class _CatalogHandler(BaseHTTPRequestHandler):
173
173
  except BrokenPipeError:
174
174
  pass
175
175
  except Exception as e:
176
+ # Never leak internal exception detail (filesystem paths, state) to
177
+ # the HTTP client — it reaches remote callers when the server is
178
+ # exposed with `--host 0.0.0.0`. Log the specifics server-side and
179
+ # return a generic body.
180
+ logs.get_logger().warning("serve: %s %s failed: %s: %s",
181
+ self.command, self.path,
182
+ type(e).__name__, e)
176
183
  with contextlib.suppress(Exception):
177
184
  self._send(500, "application/json",
178
- json.dumps({"error": str(e)}).encode())
185
+ json.dumps({"error": "internal server error"}).encode())
179
186
 
180
187
 
181
188
  def serve_http(host: str, port: int) -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.201
3
+ Version: 1.0.203
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -74,6 +74,7 @@ boost_cli/core/projectlock.py
74
74
  boost_cli/core/provenance.py
75
75
  boost_cli/core/rag.py
76
76
  boost_cli/core/registry.py
77
+ boost_cli/core/resolve.py
77
78
  boost_cli/core/rules.py
78
79
  boost_cli/core/scopes.py
79
80
  boost_cli/core/secretscan.py
@@ -165,7 +166,9 @@ docs/roadmap/items/github-pages-deploy-is-broken-every-push.md
165
166
  docs/roadmap/items/golden-set-statistical-power.md
166
167
  docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md
167
168
  docs/roadmap/items/html-validation-html-validate.md
169
+ docs/roadmap/items/install-resolves-skill-dependencies.md
168
170
  docs/roadmap/items/install-scope-user-or-project.md
171
+ docs/roadmap/items/installed-skill-trust-audit.md
169
172
  docs/roadmap/items/integrity-verification-boost-verify.md
170
173
  docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md
171
174
  docs/roadmap/items/layering-guard-import-linter.md
@@ -177,6 +180,7 @@ docs/roadmap/items/log-timestamps-mislabeled-utc.md
177
180
  docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md
178
181
  docs/roadmap/items/make-the-roadmaps-discoverable.md
179
182
  docs/roadmap/items/markdown-consistency-markdownlint-cli2.md
183
+ docs/roadmap/items/mcp-aware-skills.md
180
184
  docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md
181
185
  docs/roadmap/items/mcp-launch-objc-fork-safety.md
182
186
  docs/roadmap/items/mcp-register-names-server-before-env.md
@@ -352,6 +356,7 @@ tests/unit/test_provenance.py
352
356
  tests/unit/test_rag.py
353
357
  tests/unit/test_registries_fresh.py
354
358
  tests/unit/test_registry.py
359
+ tests/unit/test_resolve.py
355
360
  tests/unit/test_roadmap_fresh.py
356
361
  tests/unit/test_rules.py
357
362
  tests/unit/test_scopes.py
@@ -80,7 +80,7 @@
80
80
  <input id="q" type="search" placeholder="Filter 78 commands…" autocomplete="off" aria-label="Filter commands">
81
81
  <div class="group" data-group="pkg">
82
82
  <div class="group-h">Install &amp; lifecycle</div>
83
- <a class="cmd-link" href="#cmd-install" data-search="install install a skill from a tap registry --force --agent a --scope {user,project} --local --global --dry-run name">install</a>
83
+ <a class="cmd-link" href="#cmd-install" data-search="install install a skill from a tap registry --force --agent a --scope {user,project} --local --global --dry-run --no-deps name">install</a>
84
84
  <a class="cmd-link" href="#cmd-uninstall" data-search="uninstall remove an installed skill, rule, workflow, or config --local name">uninstall</a>
85
85
  <a class="cmd-link" href="#cmd-sync" data-search="sync reconcile installed skills &amp; symlinks against the lock file --diff --prune --json">sync</a>
86
86
  <a class="cmd-link" href="#cmd-update" data-search="update sync taps or update installed skills --taps-only tap">update</a>
@@ -187,10 +187,10 @@
187
187
  <p class="lead">All <b>78</b> commands, generated from the CLI itself —
188
188
  run <code>boost &lt;command&gt; --help</code> for the same in your terminal.</p>
189
189
  <h2 class="group-h" id="grp-pkg">Install &amp; lifecycle</h2>
190
- <section class="cmd" id="cmd-install" data-search="install install a skill from a tap registry --force --agent a --scope {user,project} --local --global --dry-run name">
190
+ <section class="cmd" id="cmd-install" data-search="install install a skill from a tap registry --force --agent a --scope {user,project} --local --global --dry-run --no-deps name">
191
191
  <h3><span class="cname">install</span><span class="gtag">pkg</span></h3>
192
192
  <p class="summary">Install a skill from a tap registry</p>
193
- <pre class="syn">boost install [--force] [--agent A] [--scope {user,project}] [--local] [--global] [--dry-run] NAME [NAME ...]</pre>
193
+ <pre class="syn">boost install [--force] [--agent A] [--scope {user,project}] [--local] [--global] [--dry-run] [--no-deps] NAME [NAME ...]</pre>
194
194
  <div class="args-h">Arguments</div>
195
195
  <div class="args">
196
196
  <div class="arg"><code>NAME</code><span>skill name, optionally qualified as tap:skill</span></div>
@@ -203,6 +203,7 @@
203
203
  <div class="arg"><code>--local</code><span>into this repo, committable (= --scope project)</span></div>
204
204
  <div class="arg"><code>--global</code><span>into your user config (= --scope user, default)</span></div>
205
205
  <div class="arg"><code>--dry-run</code><span>show what would happen without changing anything</span></div>
206
+ <div class="arg"><code>--no-deps</code><span>install only the named skills, not their `requires:`</span></div>
206
207
  </div>
207
208
  </section>
208
209
  <section class="cmd" id="cmd-uninstall" data-search="uninstall remove an installed skill, rule, workflow, or config --local name">
@@ -0,0 +1,30 @@
1
+ ---
2
+ id: install-resolves-skill-dependencies
3
+ board: code
4
+ section: dx
5
+ status: inflight
6
+ category: Core · Package manager
7
+ complexity: M
8
+ impact: High
9
+ wow: 4
10
+ note: the Homebrew move
11
+ order: 45
12
+ owner: loop/install-deps
13
+ pr: 227
14
+ title: <code>boost install</code> resolves a skill's <code>requires:</code> closure
15
+ ---
16
+ Skills already declare relationships in frontmatter (<code>requires:</code> /
17
+ <code>conflicts:</code>), and <code>boost info</code> / <code>boost deps</code>
18
+ <em>show</em> them — but <code>boost install X</code> only ever installed
19
+ exactly what you named, never what X depends on. That is the one headline
20
+ package-manager behavior boost was missing: installing a skill should pull
21
+ in the skills it needs, in the right order. Add a pure, mutation-tested
22
+ resolver in <code>core/resolve.py</code> — post-order DFS over the
23
+ <code>requires:</code> graph, cycle-safe, deduped, already-installed nodes
24
+ pruned — and wire it into <code>cmd_install</code> so a named skill installs
25
+ its transitive <code>requires:</code> closure (dependencies first), with a
26
+ <code>--no-deps</code> escape hatch. Declared <code>conflicts:</code> against
27
+ an installed or co-installed skill surface as an advisory warning, and a
28
+ <code>requires:</code> naming a skill in no tap is flagged, not fatal.
29
+ Surfaced by mining boost's own catalog: the densest skill cluster is
30
+ dependency management, which every package manager treats as table stakes.
@@ -0,0 +1,25 @@
1
+ ---
2
+ id: installed-skill-trust-audit
3
+ board: code
4
+ section: trust
5
+ status: planned
6
+ category: Trust · Health
7
+ complexity: M
8
+ impact: Med
9
+ wow: 3
10
+ note: audit what you run
11
+ order: 47
12
+ owner:
13
+ pr:
14
+ title: <code>boost audit --skills</code> — a trust/staleness report for installed skills
15
+ ---
16
+ <code>boost audit</code> today gates CVEs in boost's <em>own</em> Python dependencies,
17
+ and <code>boost outdated</code> compares an installed skill's version against
18
+ its tap — but nothing gives a single trust-health report for the set of skills
19
+ you actually run. The catalog's large supply-chain / dependency-audit cluster
20
+ is the tell: users want to know what they're trusting. Add
21
+ <code>boost audit --skills</code> — flag each installed skill that is unsigned,
22
+ came from an untrusted or now-stale tap, is behind its tap, or newly conflicts
23
+ with another installed skill. Composes with the provenance work already shipped
24
+ (signing, trusted keys, <code>verify</code>) and the <code>requires:</code>/<code>conflicts:</code>
25
+ graph, turning scattered signals into one "is my installed set healthy?" answer.
@@ -0,0 +1,25 @@
1
+ ---
2
+ id: mcp-aware-skills
3
+ board: code
4
+ section: dx
5
+ status: planned
6
+ category: Interop · MCP
7
+ complexity: L
8
+ impact: Med
9
+ wow: 4
10
+ note: skills that need a server
11
+ order: 46
12
+ owner:
13
+ pr:
14
+ title: MCP-aware skills — declare and wire an <code>.mcp.json</code> on install
15
+ ---
16
+ Mining boost's catalog surfaces a recurring shape: skills that only work paired
17
+ with a Model Context Protocol server (<code>manage-mcp-servers</code>,
18
+ <code>mcp-integration</code>, <code>mcp-builder</code> and dozens more). boost
19
+ already <em>is</em> an MCP server and registers itself, but a skill can't say
20
+ "I need MCP server Y," and boost can't help install or wire other servers.
21
+ Let a skill declare an <code>mcp:</code> block (or bundle an <code>.mcp.json</code>)
22
+ in its frontmatter; on install, boost offers to register that server into the
23
+ agent the same way <code>boost mcp register</code> wires boost itself. Extends
24
+ the "search boost before reinventing" reflex from skills to the MCP tools a
25
+ skill depends on, and pairs naturally with the <code>requires:</code> resolver.
@@ -118,7 +118,7 @@
118
118
  <div class="stat"><b>16</b><span>Shipped</span></div>
119
119
  <div class="stat"><b>1</b><span>Next up</span></div>
120
120
  <div class="stat"><b>4</b><span>Planned</span></div>
121
- <div class="stat"><b>112</b><span>Loop finds</span></div>
121
+ <div class="stat"><b>115</b><span>Loop finds</span></div>
122
122
  <!-- /ROADMAP:stats -->
123
123
  </div>
124
124
  </section>
@@ -1577,6 +1577,53 @@ improvement is real (or isn't)."</p>
1577
1577
  <span class="m">agent reflex</span>
1578
1578
  </div>
1579
1579
  </article>
1580
+
1581
+ <article class="cap rcard">
1582
+ <div class="head"><span class="pill inflight">In flight</span><span class="cat">Core · Package manager</span></div>
1583
+ <h3><code>boost install</code> resolves a skill's <code>requires:</code> closure</h3>
1584
+ <p>Skills already declare relationships in frontmatter (<code>requires:</code> /
1585
+ <code>conflicts:</code>), and <code>boost info</code> / <code>boost deps</code>
1586
+ <em>show</em> them — but <code>boost install X</code> only ever installed
1587
+ exactly what you named, never what X depends on. That is the one headline
1588
+ package-manager behavior boost was missing: installing a skill should pull
1589
+ in the skills it needs, in the right order. Add a pure, mutation-tested
1590
+ resolver in <code>core/resolve.py</code> — post-order DFS over the
1591
+ <code>requires:</code> graph, cycle-safe, deduped, already-installed nodes
1592
+ pruned — and wire it into <code>cmd_install</code> so a named skill installs
1593
+ its transitive <code>requires:</code> closure (dependencies first), with a
1594
+ <code>--no-deps</code> escape hatch. Declared <code>conflicts:</code> against
1595
+ an installed or co-installed skill surface as an advisory warning, and a
1596
+ <code>requires:</code> naming a skill in no tap is flagged, not fatal.
1597
+ Surfaced by mining boost's own catalog: the densest skill cluster is
1598
+ dependency management, which every package manager treats as table stakes.</p>
1599
+ <div class="meta">
1600
+ <span class="m">Complexity <b>M</b></span>
1601
+ <span class="m hi">Impact <b>High</b></span>
1602
+ <span class="m">Wow <b class="wow">★★★★</b></span>
1603
+ <span class="m">the Homebrew move</span>
1604
+ </div>
1605
+ </article>
1606
+
1607
+ <article class="cap rcard">
1608
+ <div class="head"><span class="pill planned">Planned</span><span class="cat">Interop · MCP</span></div>
1609
+ <h3>MCP-aware skills — declare and wire an <code>.mcp.json</code> on install</h3>
1610
+ <p>Mining boost's catalog surfaces a recurring shape: skills that only work paired
1611
+ with a Model Context Protocol server (<code>manage-mcp-servers</code>,
1612
+ <code>mcp-integration</code>, <code>mcp-builder</code> and dozens more). boost
1613
+ already <em>is</em> an MCP server and registers itself, but a skill can't say
1614
+ "I need MCP server Y," and boost can't help install or wire other servers.
1615
+ Let a skill declare an <code>mcp:</code> block (or bundle an <code>.mcp.json</code>)
1616
+ in its frontmatter; on install, boost offers to register that server into the
1617
+ agent the same way <code>boost mcp register</code> wires boost itself. Extends
1618
+ the "search boost before reinventing" reflex from skills to the MCP tools a
1619
+ skill depends on, and pairs naturally with the <code>requires:</code> resolver.</p>
1620
+ <div class="meta">
1621
+ <span class="m">Complexity <b>L</b></span>
1622
+ <span class="m">Impact <b>Med</b></span>
1623
+ <span class="m">Wow <b class="wow">★★★★</b></span>
1624
+ <span class="m">skills that need a server</span>
1625
+ </div>
1626
+ </article>
1580
1627
  <!-- /ROADMAP:cards -->
1581
1628
 
1582
1629
  </div>
@@ -2224,6 +2271,27 @@ paths.</p>
2224
2271
  <span class="m">builds on policy.py</span>
2225
2272
  </div>
2226
2273
  </article>
2274
+
2275
+ <article class="cap rcard">
2276
+ <div class="head"><span class="pill planned">Planned</span><span class="cat">Trust · Health</span></div>
2277
+ <h3><code>boost audit --skills</code> — a trust/staleness report for installed skills</h3>
2278
+ <p><code>boost audit</code> today gates CVEs in boost's <em>own</em> Python dependencies,
2279
+ and <code>boost outdated</code> compares an installed skill's version against
2280
+ its tap — but nothing gives a single trust-health report for the set of skills
2281
+ you actually run. The catalog's large supply-chain / dependency-audit cluster
2282
+ is the tell: users want to know what they're trusting. Add
2283
+ <code>boost audit --skills</code> — flag each installed skill that is unsigned,
2284
+ came from an untrusted or now-stale tap, is behind its tap, or newly conflicts
2285
+ with another installed skill. Composes with the provenance work already shipped
2286
+ (signing, trusted keys, <code>verify</code>) and the <code>requires:</code>/<code>conflicts:</code>
2287
+ graph, turning scattered signals into one "is my installed set healthy?" answer.</p>
2288
+ <div class="meta">
2289
+ <span class="m">Complexity <b>M</b></span>
2290
+ <span class="m">Impact <b>Med</b></span>
2291
+ <span class="m">Wow <b class="wow">★★★</b></span>
2292
+ <span class="m">audit what you run</span>
2293
+ </div>
2294
+ </article>
2227
2295
  <!-- /ROADMAP:cards -->
2228
2296
 
2229
2297
  </div>
@@ -427,7 +427,9 @@ class TestContext:
427
427
  class TestFocus:
428
428
  def test_focus_sidelines_others(self, boost, tapped):
429
429
  boost("install", "brainstorming")
430
- boost("install", "jira-integration")
430
+ # --no-deps: this test wants exactly two installed skills; without it,
431
+ # jira-integration would also pull in its `requires: commit-messages`.
432
+ boost("install", "jira-integration", "--no-deps")
431
433
  r = boost("focus", "brainstorming")
432
434
  assert "focus: brainstorming" in r.out
433
435
  assert "(other 1 skills sidelined)" in r.out
@@ -116,6 +116,29 @@ class TestInstall:
116
116
  assert not (paths.store_dir() / "brainstorming").exists()
117
117
  assert not paths.lockfile_path().exists()
118
118
 
119
+ def test_installs_declared_requires_closure(self, boost, tapped):
120
+ # jira-integration declares `requires: [commit-messages]` in the fixture;
121
+ # installing it must pull in the dependency, dependency-first.
122
+ r = boost("install", "jira-integration")
123
+ assert "pulling in 1 dependency" in r.out
124
+ assert "commit-messages" in r.out
125
+ assert "Installed 2 new skills" in r.out
126
+ assert "commit-messages" in _lock() and "jira-integration" in _lock()
127
+ assert (paths.store_dir() / "commit-messages" / "SKILL.md").is_file()
128
+
129
+ def test_no_deps_installs_only_named(self, boost, tapped):
130
+ r = boost("install", "jira-integration", "--no-deps")
131
+ assert "pulling in" not in r.out
132
+ assert "Installed 1 new skill" in r.out
133
+ assert "jira-integration" in _lock()
134
+ assert "commit-messages" not in _lock() # dep NOT pulled in
135
+
136
+ def test_already_installed_dependency_not_repulled(self, boost, tapped):
137
+ boost("install", "commit-messages") # dep present first
138
+ r = boost("install", "jira-integration")
139
+ assert "pulling in" not in r.out # nothing to add
140
+ assert "Installed 1 new skill" in r.out # only jira is new
141
+
119
142
  def test_agent_flag_links_only_claude(self, boost, tapped):
120
143
  r = boost("install", "brainstorming", "--agent", "claude-code")
121
144
  assert "linked → claude-code" in r.out
@@ -19,7 +19,9 @@ def test_tap_search_install_doctor_uninstall(boost, fixture_tap_src):
19
19
  assert "jira-integration" in r.out
20
20
  assert "ranked by full-content BM25" in r.out
21
21
 
22
- r = boost("install", "jira-integration")
22
+ # --no-deps keeps this a single-skill lifecycle (doctor asserts "1 skill");
23
+ # jira-integration otherwise pulls in its `requires: commit-messages`.
24
+ r = boost("install", "jira-integration", "--no-deps")
23
25
  assert "copied to" in r.out
24
26
  assert "linked → claude-code · windsurf · cursor" in r.out
25
27
  assert "lock updated (.skill-lock.json)" in r.out
@@ -42,7 +42,10 @@ run "outdated (clean)" 0 ./boost outdated
42
42
  echo "== everyday loop"
43
43
  run "search jira" 0 ./boost search jira
44
44
  run "install brainstorming" 0 ./boost install brainstorming
45
- run "install jira-integration" 0 ./boost install jira-integration
45
+ # --no-deps: install each fixture skill independently. jira-integration declares
46
+ # `requires: commit-messages`, which install now resolves — without this the
47
+ # separate `install commit-messages` below would hit the already-installed path.
48
+ run "install jira-integration" 0 ./boost install jira-integration --no-deps
46
49
  run "install commit-messages" 0 ./boost install commit-messages
47
50
  run "install tdd-workflow" 0 ./boost install tdd-workflow
48
51
  run "install cowboy-coding" 0 ./boost install cowboy-coding