boost-skill-cli 1.0.148__tar.gz → 1.0.149__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 (315) hide show
  1. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/Makefile +19 -1
  2. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/PKG-INFO +5 -1
  3. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/_version.py +2 -2
  4. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_skill_cli.egg-info/PKG-INFO +5 -1
  5. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_skill_cli.egg-info/SOURCES.txt +18 -0
  6. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_skill_cli.egg-info/requires.txt +6 -0
  7. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/pyproject.toml +10 -0
  8. boost_skill_cli-1.0.149/scripts/bench_cli.sh +27 -0
  9. boost_skill_cli-1.0.149/tests/bdd/features/adapt.feature +46 -0
  10. boost_skill_cli-1.0.149/tests/bdd/features/browse.feature +26 -0
  11. boost_skill_cli-1.0.149/tests/bdd/features/count.feature +24 -0
  12. boost_skill_cli-1.0.149/tests/bdd/features/discover.feature +39 -0
  13. boost_skill_cli-1.0.149/tests/bdd/features/doctor.feature +30 -0
  14. boost_skill_cli-1.0.149/tests/bdd/features/environment.py +66 -0
  15. boost_skill_cli-1.0.149/tests/bdd/features/explain.feature +25 -0
  16. boost_skill_cli-1.0.149/tests/bdd/features/index.feature +25 -0
  17. boost_skill_cli-1.0.149/tests/bdd/features/install.feature +43 -0
  18. boost_skill_cli-1.0.149/tests/bdd/features/list.feature +42 -0
  19. boost_skill_cli-1.0.149/tests/bdd/features/mcp.feature +31 -0
  20. boost_skill_cli-1.0.149/tests/bdd/features/search.feature +37 -0
  21. boost_skill_cli-1.0.149/tests/bdd/features/steps/cli_steps.py +104 -0
  22. boost_skill_cli-1.0.149/tests/bdd/features/steps/discovery_steps.py +77 -0
  23. boost_skill_cli-1.0.149/tests/bdd/features/steps/mcp_steps.py +48 -0
  24. boost_skill_cli-1.0.149/tests/bdd/features/steps/quality_steps.py +12 -0
  25. boost_skill_cli-1.0.149/tests/perf/test_benchmarks.py +59 -0
  26. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/.gitattributes +0 -0
  27. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/.gitignore +0 -0
  28. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/CLAUDE.md +0 -0
  29. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/CONTRIBUTING.md +0 -0
  30. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/LICENSE +0 -0
  31. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/MANIFEST.in +0 -0
  32. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/README.md +0 -0
  33. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/SECURITY.md +0 -0
  34. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost +0 -0
  35. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/__init__.py +0 -0
  36. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/__main__.py +0 -0
  37. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/cli.py +0 -0
  38. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/cliparse.py +0 -0
  39. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/__init__.py +0 -0
  40. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/bmad.py +0 -0
  41. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/configuration.py +0 -0
  42. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/discovery.py +0 -0
  43. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/hooks.py +0 -0
  44. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/info.py +0 -0
  45. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/intelligence.py +0 -0
  46. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/pkg.py +0 -0
  47. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/quality.py +0 -0
  48. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/taps.py +0 -0
  49. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/team.py +0 -0
  50. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/__init__.py +0 -0
  51. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/adapters.py +0 -0
  52. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/agents.py +0 -0
  53. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/ai.py +0 -0
  54. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/catalog.py +0 -0
  55. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/claude_settings.py +0 -0
  56. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/config.py +0 -0
  57. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/dense.py +0 -0
  58. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/embed.py +0 -0
  59. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/frontmatter.py +0 -0
  60. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/gitutil.py +0 -0
  61. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/imperative.py +0 -0
  62. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/injectscan.py +0 -0
  63. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/journal.py +0 -0
  64. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/lockfile.py +0 -0
  65. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/logs.py +0 -0
  66. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/mcp.py +0 -0
  67. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/nethttp.py +0 -0
  68. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/output.py +0 -0
  69. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/paths.py +0 -0
  70. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/policy.py +0 -0
  71. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/rag.py +0 -0
  72. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/registry.py +0 -0
  73. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/rules.py +0 -0
  74. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/secretscan.py +0 -0
  75. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/serve.py +0 -0
  76. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/stackprobe.py +0 -0
  77. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/staleness.py +0 -0
  78. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/store.py +0 -0
  79. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/typosquat.py +0 -0
  80. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/updatediff.py +0 -0
  81. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/util.py +0 -0
  82. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/workflows.py +0 -0
  83. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/data/registries.json +0 -0
  84. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/errors.py +0 -0
  85. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/spin.py +0 -0
  86. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  87. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  88. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_skill_cli.egg-info/top_level.txt +0 -0
  89. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/.claude/settings.local.json +0 -0
  90. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/DEBUGGING.md +0 -0
  91. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/adapters.html +0 -0
  92. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/demo.gif +0 -0
  93. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/demo.tape +0 -0
  94. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/design-roadmap.html +0 -0
  95. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/eval.html +0 -0
  96. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/index.html +0 -0
  97. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/mcp-hub.html +0 -0
  98. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/rag-architecture.md +0 -0
  99. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D01.md +0 -0
  100. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D02.md +0 -0
  101. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D03.md +0 -0
  102. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D04.md +0 -0
  103. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D05.md +0 -0
  104. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D06.md +0 -0
  105. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D07.md +0 -0
  106. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D08.md +0 -0
  107. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D09.md +0 -0
  108. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D10.md +0 -0
  109. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D11.md +0 -0
  110. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D12.md +0 -0
  111. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D13.md +0 -0
  112. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D14.md +0 -0
  113. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D15.md +0 -0
  114. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D16.md +0 -0
  115. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D17.md +0 -0
  116. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D18.md +0 -0
  117. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D19.md +0 -0
  118. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D20.md +0 -0
  119. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D21.md +0 -0
  120. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D22.md +0 -0
  121. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D23.md +0 -0
  122. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D24.md +0 -0
  123. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D25.md +0 -0
  124. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D26.md +0 -0
  125. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  126. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  127. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  128. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  129. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  130. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  131. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  132. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  133. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  134. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  135. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  136. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  137. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  138. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  139. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  140. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  141. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  142. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  143. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  144. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  145. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  146. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  147. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  148. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  149. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  150. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  151. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  152. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  153. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  154. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  155. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  156. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  157. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  158. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  159. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  160. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  161. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  162. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  163. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  164. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  165. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  166. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  167. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  168. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  169. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  170. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  171. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  172. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  173. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  174. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  175. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  176. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  177. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  178. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  179. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  180. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  181. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  182. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  183. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  184. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  185. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  186. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  187. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  188. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  189. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  190. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  191. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  192. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  193. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  194. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  195. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  196. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  197. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  198. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  199. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  200. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  201. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  202. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  203. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  204. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  205. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  206. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  207. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  208. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  209. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  210. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  211. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  212. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  213. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  214. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  215. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  216. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  217. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  218. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  219. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  220. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  221. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  222. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  223. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  224. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  225. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  226. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  227. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  228. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  229. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  230. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  231. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  232. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/workspace-scope-install.md +0 -0
  233. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap.html +0 -0
  234. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/examples/README.md +0 -0
  235. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/examples/adapt-demo.sh +0 -0
  236. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/examples/boost-run-prototype.sh +0 -0
  237. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/index.html +0 -0
  238. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/scripts/build_registries.py +0 -0
  239. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/scripts/build_roadmap.py +0 -0
  240. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/scripts/ensure_eval_corpus.sh +0 -0
  241. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/scripts/eval_explain.py +0 -0
  242. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/scripts/eval_recommend.py +0 -0
  243. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/scripts/eval_retrieval.py +0 -0
  244. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/scripts/mutation_gate.py +0 -0
  245. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/setup.cfg +0 -0
  246. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/style/README.md +0 -0
  247. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/style/boost.css +0 -0
  248. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/style/boost.js +0 -0
  249. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/style/demo.html +0 -0
  250. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/conftest.py +0 -0
  251. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/eval/baseline.json +0 -0
  252. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/eval/explain.jsonl +0 -0
  253. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/eval/golden.jsonl +0 -0
  254. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/eval/recommend.jsonl +0 -0
  255. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/eval/taps.txt +0 -0
  256. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_adapt.py +0 -0
  257. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_bmad.py +0 -0
  258. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_configuration.py +0 -0
  259. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_discovery.py +0 -0
  260. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_hooks.py +0 -0
  261. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_info.py +0 -0
  262. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_intelligence.py +0 -0
  263. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_pkg.py +0 -0
  264. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_quality.py +0 -0
  265. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_taps.py +0 -0
  266. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_team.py +0 -0
  267. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_everyday_loop.py +0 -0
  268. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_property_parsers.py +0 -0
  269. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/make_fixture.py +0 -0
  270. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/smoke.sh +0 -0
  271. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_adapters.py +0 -0
  272. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_agents.py +0 -0
  273. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_ai.py +0 -0
  274. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_catalog.py +0 -0
  275. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_claude_settings.py +0 -0
  276. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_cliparse.py +0 -0
  277. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_config.py +0 -0
  278. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_dense.py +0 -0
  279. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_dense_fallback.py +0 -0
  280. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_docs_pages_linked.py +0 -0
  281. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_embed.py +0 -0
  282. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_errors_and_cli_table.py +0 -0
  283. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_frontmatter.py +0 -0
  284. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_gitutil.py +0 -0
  285. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_imperative.py +0 -0
  286. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_injectscan.py +0 -0
  287. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_journal.py +0 -0
  288. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_lockfile.py +0 -0
  289. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_logs.py +0 -0
  290. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_mcp.py +0 -0
  291. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_mutation_hardening.py +0 -0
  292. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_nethttp.py +0 -0
  293. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_output.py +0 -0
  294. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_paths.py +0 -0
  295. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_pkg_confusions.py +0 -0
  296. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_pkg_injection.py +0 -0
  297. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_pkg_secrets.py +0 -0
  298. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_policy.py +0 -0
  299. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_rag.py +0 -0
  300. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_registries_fresh.py +0 -0
  301. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_registry.py +0 -0
  302. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_roadmap_fresh.py +0 -0
  303. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_rules.py +0 -0
  304. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_secretscan.py +0 -0
  305. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_serve.py +0 -0
  306. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_spin.py +0 -0
  307. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_stackprobe.py +0 -0
  308. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_staleness.py +0 -0
  309. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_store.py +0 -0
  310. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_token_parity.py +0 -0
  311. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_typosquat.py +0 -0
  312. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_updatediff.py +0 -0
  313. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_util.py +0 -0
  314. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_version.py +0 -0
  315. {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_workflows.py +0 -0
@@ -10,7 +10,7 @@ PYTEST := $(VENV)/bin/pytest
10
10
  # pinned taps out of the developer's real ~/.boost.
11
11
  EVAL_HOME := $(CURDIR)/.eval-home
12
12
 
13
- .PHONY: venv test unit functional smoke coverage mutation lint check demo clean-test eval eval-ai eval-rec eval-stats eval-explain audit dist-check
13
+ .PHONY: venv test unit functional smoke coverage mutation lint check demo clean-test eval eval-ai eval-rec eval-stats eval-explain audit dist-check bdd bench bench-cli
14
14
 
15
15
  venv:
16
16
  python3 -m venv $(VENV)
@@ -96,6 +96,24 @@ eval-explain:
96
96
  PYTHON=$(PY) BOOST_HOME=$(EVAL_HOME) bash scripts/ensure_eval_corpus.sh
97
97
  BOOST_HOME=$(EVAL_HOME) $(PY) scripts/eval_explain.py --fail-under 0.80
98
98
 
99
+ # Opt-in Gherkin/BDD suite (tests/bdd) — additive to tests/functional, not a
100
+ # replacement. Needs the [bdd] extra (`pip install -e '.[bdd]'`); not part of
101
+ # `make check`.
102
+ bdd:
103
+ $(VENV)/bin/behave tests/bdd/features
104
+
105
+ # Opt-in micro-benchmarks (tests/perf) for perf-sensitive core paths. Needs
106
+ # the [perf] extra (`pip install -e '.[perf]'`); not part of `make check` — a
107
+ # timing regression is informational, not a merge gate.
108
+ bench:
109
+ $(PYTEST) tests/perf --benchmark-only -q
110
+
111
+ # Opt-in wall-clock benchmark of the real `boost` binary via hyperfine. Not
112
+ # part of `make check`; degrades cleanly (prints a skip message, exits 0) when
113
+ # hyperfine isn't installed (`brew install hyperfine`).
114
+ bench-cli:
115
+ @command -v hyperfine >/dev/null 2>&1 && bash scripts/bench_cli.sh || echo "hyperfine not on PATH — install via 'brew install hyperfine', skipping"
116
+
99
117
  # regenerate generated artifacts from their source (registries + roadmap boards)
100
118
  generate:
101
119
  $(PY) scripts/build_registries.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.148
3
+ Version: 1.0.149
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -708,6 +708,10 @@ Requires-Dist: ragas<0.3,>=0.2; extra == "eval"
708
708
  Requires-Dist: langchain-core<0.4; extra == "eval"
709
709
  Requires-Dist: langchain-community<0.4; extra == "eval"
710
710
  Requires-Dist: langchain-openai<1; extra == "eval"
711
+ Provides-Extra: bdd
712
+ Requires-Dist: behave>=1.2.6; extra == "bdd"
713
+ Provides-Extra: perf
714
+ Requires-Dist: pytest-benchmark>=4.0; extra == "perf"
711
715
  Dynamic: license-file
712
716
 
713
717
  # boost — a package manager for AI coding skills
@@ -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.148'
22
- __version_tuple__ = version_tuple = (1, 0, 148)
21
+ __version__ = version = '1.0.149'
22
+ __version_tuple__ = version_tuple = (1, 0, 149)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.148
3
+ Version: 1.0.149
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -708,6 +708,10 @@ Requires-Dist: ragas<0.3,>=0.2; extra == "eval"
708
708
  Requires-Dist: langchain-core<0.4; extra == "eval"
709
709
  Requires-Dist: langchain-community<0.4; extra == "eval"
710
710
  Requires-Dist: langchain-openai<1; extra == "eval"
711
+ Provides-Extra: bdd
712
+ Requires-Dist: behave>=1.2.6; extra == "bdd"
713
+ Provides-Extra: perf
714
+ Requires-Dist: pytest-benchmark>=4.0; extra == "perf"
711
715
  Dynamic: license-file
712
716
 
713
717
  # boost — a package manager for AI coding skills
@@ -217,6 +217,7 @@ docs/roadmap/items/workspace-scope-install.md
217
217
  examples/README.md
218
218
  examples/adapt-demo.sh
219
219
  examples/boost-run-prototype.sh
220
+ scripts/bench_cli.sh
220
221
  scripts/build_registries.py
221
222
  scripts/build_roadmap.py
222
223
  scripts/ensure_eval_corpus.sh
@@ -231,6 +232,22 @@ style/demo.html
231
232
  tests/conftest.py
232
233
  tests/make_fixture.py
233
234
  tests/smoke.sh
235
+ tests/bdd/features/adapt.feature
236
+ tests/bdd/features/browse.feature
237
+ tests/bdd/features/count.feature
238
+ tests/bdd/features/discover.feature
239
+ tests/bdd/features/doctor.feature
240
+ tests/bdd/features/environment.py
241
+ tests/bdd/features/explain.feature
242
+ tests/bdd/features/index.feature
243
+ tests/bdd/features/install.feature
244
+ tests/bdd/features/list.feature
245
+ tests/bdd/features/mcp.feature
246
+ tests/bdd/features/search.feature
247
+ tests/bdd/features/steps/cli_steps.py
248
+ tests/bdd/features/steps/discovery_steps.py
249
+ tests/bdd/features/steps/mcp_steps.py
250
+ tests/bdd/features/steps/quality_steps.py
234
251
  tests/eval/baseline.json
235
252
  tests/eval/explain.jsonl
236
253
  tests/eval/golden.jsonl
@@ -249,6 +266,7 @@ tests/functional/test_cli_taps.py
249
266
  tests/functional/test_cli_team.py
250
267
  tests/functional/test_everyday_loop.py
251
268
  tests/functional/test_property_parsers.py
269
+ tests/perf/test_benchmarks.py
252
270
  tests/unit/test_adapters.py
253
271
  tests/unit/test_agents.py
254
272
  tests/unit/test_ai.py
@@ -1,4 +1,7 @@
1
1
 
2
+ [bdd]
3
+ behave>=1.2.6
4
+
2
5
  [eval]
3
6
  ranx>=0.3.20
4
7
  ragas<0.3,>=0.2
@@ -6,5 +9,8 @@ langchain-core<0.4
6
9
  langchain-community<0.4
7
10
  langchain-openai<1
8
11
 
12
+ [perf]
13
+ pytest-benchmark>=4.0
14
+
9
15
  [rag]
10
16
  sqlite-vec>=0.1.6
@@ -55,6 +55,16 @@ eval = [
55
55
  "langchain-community<0.4",
56
56
  "langchain-openai<1",
57
57
  ]
58
+ # Opt-in Gherkin/BDD functional suite (tests/bdd) — reusable Given/When/Then
59
+ # scenarios over the same in-process CLI entrypoint tests/functional drives.
60
+ # Additive to, not a replacement for, the pytest functional suite; not part of
61
+ # `make check`. `pip install -e '.[bdd]'`.
62
+ bdd = ["behave>=1.2.6"]
63
+ # Opt-in micro-benchmarks (tests/perf, `make bench`) for perf-sensitive core
64
+ # paths (BM25 indexing/search, catalog scan). Not part of `make check` — a
65
+ # timing regression shouldn't block a merge the way a correctness gate does.
66
+ # `pip install -e '.[perf]'`.
67
+ perf = ["pytest-benchmark>=4.0"]
58
68
 
59
69
  [project.scripts]
60
70
  boost = "boost_cli.cli:main"
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env bash
2
+ # Wall-clock benchmark of the real `boost` binary via hyperfine — the actual
3
+ # fork+exec CLI, not the in-process pytest-benchmark suite (tests/perf).
4
+ # Opt-in (`make bench-cli`); not part of `make check`. Degrades cleanly if
5
+ # hyperfine isn't installed.
6
+ set -uo pipefail
7
+
8
+ if ! command -v hyperfine >/dev/null 2>&1; then
9
+ echo "hyperfine not installed — install via 'brew install hyperfine', skipping"
10
+ exit 0
11
+ fi
12
+
13
+ ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
14
+ SB="$(mktemp -d "${TMPDIR:-/tmp}/boost-bench-XXXXXX")"
15
+ trap 'rm -rf "$SB"' EXIT
16
+ export HOME="$SB" BOOST_NO_AI=1 BOOST_ASSUME_YES=1 NO_COLOR=1
17
+
18
+ FIX="$(python3 "$ROOT/tests/make_fixture.py" "$SB/fixture-tap")"
19
+ "$ROOT/boost" tap "$FIX" >/dev/null
20
+ "$ROOT/boost" install brainstorming >/dev/null
21
+
22
+ echo "== hyperfine: $(command -v hyperfine) over $ROOT/boost (sandbox: $SB)"
23
+ hyperfine --warmup 3 \
24
+ "$ROOT/boost --help" \
25
+ "$ROOT/boost list" \
26
+ "$ROOT/boost search brainstorming" \
27
+ "$ROOT/boost count"
@@ -0,0 +1,46 @@
1
+ Feature: boost adapt
2
+ Render a skill as another agent framework's native source (CrewAI, Agents SDK).
3
+
4
+ Background:
5
+ Given a fresh boost environment
6
+ And the fixture tap is added
7
+
8
+ Scenario: adapting an installed skill to CrewAI
9
+ Given the "brainstorming" skill is installed
10
+ When I run "boost adapt brainstorming --to crewai"
11
+ Then the exit code should be 0
12
+ And the output should contain "from crewai import Agent"
13
+ And the output should contain "brainstorming = Agent("
14
+
15
+ Scenario: adapting an installed skill to the Agents SDK
16
+ Given the "brainstorming" skill is installed
17
+ When I run "boost adapt brainstorming --to agents-sdk"
18
+ Then the exit code should be 0
19
+ And the output should contain "from agents import Agent"
20
+ And the output should match "name=\"brainstorming\""
21
+
22
+ Scenario: adapting a tapped-but-not-installed skill still resolves
23
+ When I run "boost adapt brainstorming --to crewai"
24
+ Then the exit code should be 0
25
+ And the output should contain "brainstorming = Agent("
26
+
27
+ Scenario: --model none opts out of pinning an LLM
28
+ Given the "brainstorming" skill is installed
29
+ When I run "boost adapt brainstorming --to crewai --model none"
30
+ Then the exit code should be 0
31
+ And the output should not contain "llm="
32
+
33
+ Scenario: an unknown framework is rejected
34
+ Given the "brainstorming" skill is installed
35
+ When I run "boost adapt brainstorming --to langchain"
36
+ Then the exit code should be 1
37
+ And the output should contain "unknown framework"
38
+
39
+ Scenario: --to is required
40
+ Given the "brainstorming" skill is installed
41
+ When I run "boost adapt brainstorming"
42
+ Then the exit code should be 2
43
+
44
+ Scenario: adapting an unknown skill fails
45
+ When I run "boost adapt does-not-exist --to crewai"
46
+ Then the exit code should be 1
@@ -0,0 +1,26 @@
1
+ Feature: boost browse
2
+ Interactive full-screen TUI with fuzzy search. There is no TTY in these
3
+ scenarios, so `browse` takes its documented non-interactive escape hatch
4
+ and prints the full catalog instead of launching curses.
5
+
6
+ Background:
7
+ Given a fresh boost environment
8
+
9
+ Scenario: no skills available to browse
10
+ When I run "boost browse"
11
+ Then the exit code should be 1
12
+ And the output should contain "no skills available to browse"
13
+
14
+ Scenario: without a TTY, prints the full catalog instead of the TUI
15
+ Given the fixture tap is added
16
+ When I run "boost browse"
17
+ Then the exit code should be 0
18
+ And the output should contain "interactive mode needs a TTY — showing the full catalog"
19
+ And the output should contain "brainstorming"
20
+ And the output should contain "commit-messages"
21
+ And the output should contain "5 skills · install with `boost install <name>`"
22
+
23
+ Scenario: --help documents the command without touching the catalog
24
+ When I run "boost browse --help"
25
+ Then the exit code should be 0
26
+ And the output should contain "Interactive full-screen TUI with fuzzy search"
@@ -0,0 +1,24 @@
1
+ Feature: boost count
2
+ A one-line inventory summary: installed / available / taps / discovery index.
3
+
4
+ Background:
5
+ Given a fresh boost environment
6
+
7
+ Scenario: an empty environment
8
+ When I run "boost count"
9
+ Then the exit code should be 0
10
+ And the output should contain "installed 0 · available 0 (across 0 taps) · discovery index not built"
11
+
12
+ Scenario: one tap with one installed skill
13
+ Given the "brainstorming" skill is installed
14
+ When I run "boost count"
15
+ Then the exit code should be 0
16
+ And the output should contain "installed 1 · available 5 (across 1 tap) · discovery index not built"
17
+ And the output should contain "╭─ inventory"
18
+
19
+ Scenario: --json is machine readable
20
+ Given the "brainstorming" skill is installed
21
+ When I run "boost count --json"
22
+ Then the exit code should be 0
23
+ And the output should match "\"installed\": 1"
24
+ And the output should match "\"taps\": 1"
@@ -0,0 +1,39 @@
1
+ Feature: boost discover
2
+ Browse and filter the GitHub-wide discovery index built by `boost index`.
3
+
4
+ Background:
5
+ Given a fresh boost environment
6
+
7
+ Scenario: without an index and without gh, hints to install gh
8
+ Given the GitHub CLI is not installed
9
+ When I run "boost discover"
10
+ Then the exit code should be 0
11
+ And the output should contain "the discovery index has not been built yet"
12
+ And the output should contain "install the GitHub CLI first"
13
+
14
+ Scenario: without an index but with gh, hints to run boost index
15
+ Given the GitHub CLI is installed and code search returns 2 sample skill files
16
+ When I run "boost discover"
17
+ Then the exit code should be 0
18
+ And the output should contain "build it with `boost index` (GitHub Code Search)"
19
+
20
+ Scenario: a query filters indexed entries
21
+ Given the discovery index is seeded with sample items
22
+ When I run "boost discover acme"
23
+ Then the exit code should be 0
24
+ And the output should contain "skills/web/SKILL.md"
25
+ And the output should not contain "octo/skills"
26
+ And the output should contain "2 of 3 indexed skills · GitHub reports ~42 total"
27
+
28
+ Scenario: a query with no matches reports the index size
29
+ Given the discovery index is seeded with sample items
30
+ When I run "boost discover zzz"
31
+ Then the exit code should be 0
32
+ And the output should contain "no indexed skills match 'zzz'"
33
+ And the output should contain "the index holds 3 entries — rebuild with `boost index`"
34
+
35
+ Scenario: a corrupt index fails cleanly
36
+ Given the discovery index is corrupt
37
+ When I run "boost discover"
38
+ Then the exit code should be 1
39
+ And the output should contain "the discovery index is corrupt"
@@ -0,0 +1,30 @@
1
+ Feature: boost doctor
2
+ Check installation health and report issues.
3
+
4
+ Background:
5
+ Given a fresh boost environment
6
+
7
+ Scenario: an empty environment is healthy
8
+ When I run "boost doctor"
9
+ Then the exit code should be 0
10
+ And the output should contain "boost doctor"
11
+ And the output should contain "no taps configured — add one with `boost tap owner/repo`"
12
+ And the output should contain "0 skills installed · 0 taps synced · 0 broken links"
13
+
14
+ Scenario: a healthy environment with installed skills
15
+ Given the "brainstorming" skill is installed
16
+ When I run "boost doctor"
17
+ Then the exit code should be 0
18
+ And the output should contain "git on PATH"
19
+ And the output should contain "1 tap cloned & cached"
20
+ And the output should contain "1 skill installed · 1 tap synced · 0 broken links"
21
+ And the output should contain "● healthy"
22
+
23
+ Scenario: a broken symlink is reported and flips the verdict
24
+ Given the "brainstorming" skill is installed
25
+ And a broken skill symlink exists
26
+ When I run "boost doctor"
27
+ Then the exit code should be 1
28
+ And the output should contain "1 broken symlink in agent dirs — run `boost heal`"
29
+ And the output should contain "need attention"
30
+
@@ -0,0 +1,66 @@
1
+ """behave hooks — mirrors tests/conftest.py's sandboxing for BDD scenarios.
2
+
3
+ Every scenario runs against a throwaway $HOME (never the real one) and shares
4
+ one fixture tap built once per run via tests/make_fixture.py.
5
+ """
6
+ from __future__ import annotations
7
+
8
+ import os
9
+ import shutil
10
+ import subprocess
11
+ import sys
12
+ import tempfile
13
+ from pathlib import Path
14
+
15
+ ROOT = Path(__file__).resolve().parents[3]
16
+ if str(ROOT) not in sys.path:
17
+ sys.path.insert(0, str(ROOT))
18
+
19
+ _SANDBOX_ENV = ("BOOST_HOME", "BOOST_AGENTS_STORE", "BOOST_DEBUG",
20
+ "BOOST_LOG_LEVEL", "BOOST_NO_LOG", "VOYAGE_API_KEY",
21
+ "OPENAI_API_KEY", "BOOST_NO_EMBED")
22
+
23
+
24
+ def before_all(context):
25
+ context._run_dir = Path(tempfile.mkdtemp(prefix="boost-bdd-"))
26
+ dest = context._run_dir / "fixture-tap"
27
+ subprocess.run(
28
+ [sys.executable, str(ROOT / "tests" / "make_fixture.py"), str(dest)],
29
+ check=True, capture_output=True)
30
+ context.fixture_tap_src = dest
31
+
32
+
33
+ _scenario_counter = [0]
34
+
35
+
36
+ def before_scenario(context, scenario):
37
+ context._saved_env = dict(os.environ)
38
+ _scenario_counter[0] += 1
39
+ home = context._run_dir / ("home-%d" % _scenario_counter[0])
40
+ home.mkdir(parents=True, exist_ok=True)
41
+ os.environ["HOME"] = str(home)
42
+ for var in _SANDBOX_ENV:
43
+ os.environ.pop(var, None)
44
+ os.environ["BOOST_NO_AI"] = "1" # deterministic: no AI calls
45
+ os.environ["NO_COLOR"] = "1" # plain output for assertions
46
+ os.environ["BOOST_ASSUME_YES"] = "1" # never block on confirm()
47
+ context._home = home
48
+ context._tapped = False
49
+ context._patchers = []
50
+
51
+ from boost_cli.core import logs
52
+ logs.reset()
53
+
54
+
55
+ def after_scenario(context, scenario):
56
+ for patcher in reversed(context._patchers):
57
+ patcher.stop()
58
+ context._patchers = []
59
+ from boost_cli.core import logs
60
+ logs.reset()
61
+ os.environ.clear()
62
+ os.environ.update(context._saved_env)
63
+
64
+
65
+ def after_all(context):
66
+ shutil.rmtree(context._run_dir, ignore_errors=True)
@@ -0,0 +1,25 @@
1
+ Feature: boost explain
2
+ Explain what a skill does in plain English (falls back to a heuristic
3
+ summary when AI is unavailable — the sandbox always sets BOOST_NO_AI=1).
4
+
5
+ Background:
6
+ Given a fresh boost environment
7
+ And the fixture tap is added
8
+
9
+ Scenario: explaining an installed skill without AI uses the heuristic fallback
10
+ Given the "brainstorming" skill is installed
11
+ When I run "boost explain brainstorming"
12
+ Then the exit code should be 0
13
+ And the output should contain "using the heuristic fallback"
14
+ And the output should contain "Outline:"
15
+ And the output should contain "Key rules:"
16
+
17
+ Scenario: explaining a skill that is only in a tap (not installed)
18
+ When I run "boost explain jira-integration"
19
+ Then the exit code should be 0
20
+ And the output should contain "using the heuristic fallback"
21
+
22
+ Scenario: explaining an unknown skill fails
23
+ When I run "boost explain does-not-exist"
24
+ Then the exit code should be 1
25
+ And the output should contain "no skill named 'does-not-exist' in any tap"
@@ -0,0 +1,25 @@
1
+ Feature: boost index
2
+ Build the discovery registry via GitHub Code Search. `gh` is always
3
+ mocked in these scenarios — no real network call.
4
+
5
+ Background:
6
+ Given a fresh boost environment
7
+
8
+ Scenario: requires the GitHub CLI
9
+ Given the GitHub CLI is not installed
10
+ When I run "boost index"
11
+ Then the exit code should be 1
12
+ And the output should contain "the GitHub CLI (gh) is required to build the index"
13
+ And the output should contain "brew install gh"
14
+
15
+ Scenario: builds the cache from gh's JSON output
16
+ Given the GitHub CLI is installed and code search returns 2 sample skill files
17
+ When I run "boost index --limit 100"
18
+ Then the exit code should be 0
19
+ And the output should contain "indexed 2 skill files across 2 repos (GitHub reports 7 total)"
20
+
21
+ Scenario: a gh failure on the first page aborts with an error
22
+ Given the GitHub CLI is installed but code search fails
23
+ When I run "boost index --limit 50"
24
+ Then the exit code should be 1
25
+ And the output should contain "GitHub code search failed"
@@ -0,0 +1,43 @@
1
+ Feature: boost install
2
+ Install a skill from a tap registry into the local store and link it into
3
+ every enabled agent.
4
+
5
+ Background:
6
+ Given a fresh boost environment
7
+ And the fixture tap is added
8
+
9
+ Scenario: installing a known skill links it into every agent
10
+ When I run "boost install brainstorming"
11
+ Then the exit code should be 0
12
+ And the output should contain "copied to ~/.agents/skills/brainstorming"
13
+ And the output should contain "linked → claude-code · windsurf · cursor"
14
+ And the output should contain "Installed 1 new skill; quality score 95/100"
15
+ And the output should contain "next: boost info brainstorming"
16
+
17
+ Scenario: --dry-run changes nothing on disk
18
+ When I run "boost install brainstorming --dry-run"
19
+ Then the exit code should be 0
20
+ And the output should contain "would install brainstorming v1.4.0 from fixture-tap"
21
+ And the output should contain "dry run — nothing was changed"
22
+
23
+ Scenario: --agent restricts linking to a single agent
24
+ When I run "boost install brainstorming --agent claude-code"
25
+ Then the exit code should be 0
26
+ And the output should contain "linked → claude-code"
27
+ And the output should not contain "windsurf"
28
+
29
+ Scenario: an unknown agent is rejected
30
+ When I run "boost install brainstorming --agent emacs"
31
+ Then the exit code should be 1
32
+ And the output should contain "unknown agent: emacs"
33
+
34
+ Scenario: installing an unknown skill fails with a hint
35
+ When I run "boost install does-not-exist"
36
+ Then the exit code should be 1
37
+ And the output should contain "no skill named 'does-not-exist' in any tap"
38
+
39
+ Scenario: a mix of known and unknown skills installs the known ones
40
+ When I run "boost install brainstorming nope"
41
+ Then the exit code should be 1
42
+ And the output should contain "nope: no skill named 'nope' in any tap"
43
+ And the output should contain "Installed 1 new skill; quality score 95/100"
@@ -0,0 +1,42 @@
1
+ Feature: boost list
2
+ List installed skills, rules, and workflows.
3
+
4
+ Background:
5
+ Given a fresh boost environment
6
+
7
+ Scenario: no skills installed shows an empty state
8
+ When I run "boost list"
9
+ Then the exit code should be 0
10
+ And the output should contain "no skills installed"
11
+ And the output should contain "boost tap --defaults"
12
+
13
+ Scenario: an installed skill is listed with its version and tap
14
+ Given the "brainstorming" skill is installed
15
+ When I run "boost list"
16
+ Then the exit code should be 0
17
+ And the output should contain "installed skills"
18
+ And the output should contain "brainstorming"
19
+ And the output should contain "1.4.0"
20
+ And the output should contain "fixture-tap"
21
+ And the output should contain "1 skill installed"
22
+
23
+ Scenario: --json is machine readable
24
+ Given the "brainstorming" skill is installed
25
+ When I run "boost list --json"
26
+ Then the exit code should be 0
27
+ And the output should match "\"brainstorming\""
28
+ And the output should match "\"skills\""
29
+
30
+ Scenario: --tag narrows the listing to custom-tagged skills
31
+ Given the "brainstorming" skill is installed
32
+ When I run "boost tag brainstorming +fav"
33
+ And I run "boost list --tag fav"
34
+ Then the exit code should be 0
35
+ And the output should contain "brainstorming"
36
+ And the output should contain "#fav"
37
+
38
+ Scenario: --tag with no matching skills shows the tagged empty state
39
+ Given the "brainstorming" skill is installed
40
+ When I run "boost list --tag nope-tag"
41
+ Then the exit code should be 0
42
+ And the output should contain "no skills installed with tag #nope-tag"
@@ -0,0 +1,31 @@
1
+ Feature: boost mcp
2
+ Register boost as an MCP server for Claude Code. Never shells out to a real
3
+ `claude` CLI in these scenarios — shutil.which/subprocess.run are mocked.
4
+
5
+ Background:
6
+ Given a fresh boost environment
7
+
8
+ Scenario: registering without the claude CLI prints the manual command
9
+ Given the "claude" CLI is not on PATH
10
+ When I run "boost mcp register"
11
+ Then the exit code should be 0
12
+ And the output should contain "`claude` CLI not found — run this yourself:"
13
+ And the output should contain "claude mcp add boost --scope user"
14
+
15
+ Scenario: registering with the claude CLI present succeeds
16
+ Given the "claude" CLI is on PATH and succeeds
17
+ When I run "boost mcp register"
18
+ Then the exit code should be 0
19
+ And the output should contain "registered boost as an MCP server (scope: user)"
20
+
21
+ Scenario: a claude mcp add failure surfaces the error
22
+ Given the "claude" CLI is on PATH but fails with "no auth"
23
+ When I run "boost mcp register"
24
+ Then the exit code should be 1
25
+ And the output should contain "claude mcp register failed: no auth"
26
+
27
+ Scenario: unregistering without the claude CLI prints the manual command
28
+ Given the "claude" CLI is not on PATH
29
+ When I run "boost mcp unregister"
30
+ Then the exit code should be 0
31
+ And the output should contain "claude mcp remove boost"
@@ -0,0 +1,37 @@
1
+ Feature: boost search
2
+ Search skills across tap registries, ranked by full-content BM25.
3
+
4
+ Background:
5
+ Given a fresh boost environment
6
+
7
+ Scenario: no taps configured fails with a hint
8
+ When I run "boost search anything"
9
+ Then the exit code should be 1
10
+ And the output should contain "no taps configured — nothing to search"
11
+ And the output should contain "boost tap --defaults"
12
+
13
+ Scenario: multi-word query ranks the exact match first
14
+ Given the fixture tap is added
15
+ When I run "boost search commit messages"
16
+ Then the exit code should be 0
17
+ And the output should contain "commit-messages"
18
+ And the output should contain "ranked by full-content BM25"
19
+
20
+ Scenario: no matches hints at discover
21
+ Given the fixture tap is added
22
+ When I run "boost search zzzznothing"
23
+ Then the exit code should be 0
24
+ And the output should contain "no matches for 'zzzznothing'"
25
+ And the output should contain "try `boost discover zzzznothing`"
26
+
27
+ Scenario: --json emits a single-line JSON document
28
+ Given the fixture tap is added
29
+ When I run "boost search brainstorming --json"
30
+ Then the exit code should be 0
31
+ And the output should match "\"name\": \"brainstorming\""
32
+
33
+ Scenario: --limit rejects a non-positive value
34
+ Given the fixture tap is added
35
+ When I run "boost search x --limit 0"
36
+ Then the exit code should be 2
37
+ And the output should contain "must be >= 1"