boost-skill-cli 1.0.172__tar.gz → 1.0.174__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 (324) hide show
  1. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/CONTRIBUTING.md +1 -0
  2. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/Makefile +2 -1
  3. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/PKG-INFO +1 -1
  4. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/_version.py +2 -2
  5. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/dense.py +3 -1
  6. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/mcp.py +5 -2
  7. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/output.py +5 -2
  8. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/registry.py +9 -1
  9. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/serve.py +6 -2
  10. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  11. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +3 -3
  12. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/second-type-checker-pyright.md +3 -3
  13. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap.html +2 -2
  14. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/pyproject.toml +15 -0
  15. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/style/boost.css +67 -0
  16. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_registry.py +26 -0
  17. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/.gitattributes +0 -0
  18. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/.gitignore +0 -0
  19. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/.gitleaks.toml +0 -0
  20. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/.pre-commit-config.yaml +0 -0
  21. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/CLAUDE.md +0 -0
  22. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/LICENSE +0 -0
  23. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/MANIFEST.in +0 -0
  24. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/README.md +0 -0
  25. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/SECURITY.md +0 -0
  26. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost +0 -0
  27. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/__init__.py +0 -0
  28. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/__main__.py +0 -0
  29. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/cli.py +0 -0
  30. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/cliparse.py +0 -0
  31. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/commands/__init__.py +0 -0
  32. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/commands/bmad.py +0 -0
  33. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/commands/configuration.py +0 -0
  34. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/commands/discovery.py +0 -0
  35. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/commands/hooks.py +0 -0
  36. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/commands/info.py +0 -0
  37. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/commands/intelligence.py +0 -0
  38. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/commands/pkg.py +0 -0
  39. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/commands/quality.py +0 -0
  40. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/commands/taps.py +0 -0
  41. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/commands/team.py +0 -0
  42. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/__init__.py +0 -0
  43. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/adapters.py +0 -0
  44. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/agents.py +0 -0
  45. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/ai.py +0 -0
  46. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/catalog.py +0 -0
  47. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/claude_settings.py +0 -0
  48. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/config.py +0 -0
  49. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/embed.py +0 -0
  50. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/frontmatter.py +0 -0
  51. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/gitutil.py +0 -0
  52. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/imperative.py +0 -0
  53. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/injectscan.py +0 -0
  54. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/journal.py +0 -0
  55. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/lockfile.py +0 -0
  56. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/logs.py +0 -0
  57. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/nethttp.py +0 -0
  58. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/paths.py +0 -0
  59. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/policy.py +0 -0
  60. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/rag.py +0 -0
  61. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/rules.py +0 -0
  62. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/secretscan.py +0 -0
  63. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/stackprobe.py +0 -0
  64. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/staleness.py +0 -0
  65. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/store.py +0 -0
  66. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/typosquat.py +0 -0
  67. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/updatediff.py +0 -0
  68. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/util.py +0 -0
  69. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/core/workflows.py +0 -0
  70. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/data/registries.json +0 -0
  71. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/errors.py +0 -0
  72. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_cli/spin.py +0 -0
  73. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_skill_cli.egg-info/SOURCES.txt +0 -0
  74. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  75. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  76. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_skill_cli.egg-info/requires.txt +0 -0
  77. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/boost_skill_cli.egg-info/top_level.txt +0 -0
  78. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/.claude/settings.local.json +0 -0
  79. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/DEBUGGING.md +0 -0
  80. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/adapters.html +0 -0
  81. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/commands.html +0 -0
  82. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/demo.gif +0 -0
  83. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/demo.tape +0 -0
  84. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/design-roadmap.html +0 -0
  85. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/eval.html +0 -0
  86. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/index.html +0 -0
  87. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/mcp-hub.html +0 -0
  88. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/rag-architecture.md +0 -0
  89. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D01.md +0 -0
  90. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D02.md +0 -0
  91. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D03.md +0 -0
  92. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D04.md +0 -0
  93. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D05.md +0 -0
  94. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D06.md +0 -0
  95. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D07.md +0 -0
  96. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D08.md +0 -0
  97. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D09.md +0 -0
  98. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D10.md +0 -0
  99. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D11.md +0 -0
  100. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D12.md +0 -0
  101. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D13.md +0 -0
  102. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D14.md +0 -0
  103. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D15.md +0 -0
  104. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D16.md +0 -0
  105. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D17.md +0 -0
  106. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D18.md +0 -0
  107. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D19.md +0 -0
  108. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D20.md +0 -0
  109. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D21.md +0 -0
  110. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D22.md +0 -0
  111. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D23.md +0 -0
  112. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D24.md +0 -0
  113. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D25.md +0 -0
  114. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/BOOST-D26.md +0 -0
  115. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  116. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  117. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  118. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  119. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/boost-run-live-agents.md +0 -0
  120. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  121. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  122. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  123. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  124. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  125. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  126. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  127. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  128. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  129. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  130. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  131. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  132. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  133. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  134. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  135. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  136. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  137. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  138. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  139. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  140. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  141. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  142. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
  143. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
  144. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
  145. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  146. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  147. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  148. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  149. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  150. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  151. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  152. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  153. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  154. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  155. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  156. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  157. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  158. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  159. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  160. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  161. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  162. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  163. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  164. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  165. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
  166. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  167. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  168. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  169. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  170. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  171. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  172. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  173. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  174. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  175. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  176. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  177. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  178. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  179. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  180. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  181. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  182. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  183. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  184. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  185. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  186. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  187. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  188. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  189. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  190. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  191. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  192. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  193. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  194. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  195. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  196. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  197. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  198. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  199. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  200. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  201. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  202. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  203. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  204. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  205. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  206. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  207. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  208. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  209. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  210. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  211. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  212. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  213. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  214. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  215. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  216. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  217. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  218. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  219. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  220. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/docs/roadmap/items/workspace-scope-install.md +0 -0
  221. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/examples/README.md +0 -0
  222. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/examples/adapt-demo.sh +0 -0
  223. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/examples/boost-run-prototype.sh +0 -0
  224. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/index.html +0 -0
  225. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/noxfile.py +0 -0
  226. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/scripts/bench_cli.sh +0 -0
  227. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/scripts/build_command_reference.py +0 -0
  228. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/scripts/build_registries.py +0 -0
  229. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/scripts/build_roadmap.py +0 -0
  230. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/scripts/ensure_eval_corpus.sh +0 -0
  231. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/scripts/eval_explain.py +0 -0
  232. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/scripts/eval_recommend.py +0 -0
  233. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/scripts/eval_retrieval.py +0 -0
  234. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/scripts/import_budget.py +0 -0
  235. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/scripts/mutation_gate.py +0 -0
  236. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/setup.cfg +0 -0
  237. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/style/README.md +0 -0
  238. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/style/boost.js +0 -0
  239. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/style/demo.html +0 -0
  240. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/bdd/features/adapt.feature +0 -0
  241. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/bdd/features/browse.feature +0 -0
  242. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/bdd/features/count.feature +0 -0
  243. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/bdd/features/discover.feature +0 -0
  244. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/bdd/features/doctor.feature +0 -0
  245. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/bdd/features/environment.py +0 -0
  246. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/bdd/features/explain.feature +0 -0
  247. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/bdd/features/index.feature +0 -0
  248. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/bdd/features/install.feature +0 -0
  249. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/bdd/features/list.feature +0 -0
  250. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/bdd/features/mcp.feature +0 -0
  251. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/bdd/features/search.feature +0 -0
  252. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/bdd/features/steps/cli_steps.py +0 -0
  253. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/bdd/features/steps/discovery_steps.py +0 -0
  254. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/bdd/features/steps/mcp_steps.py +0 -0
  255. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/bdd/features/steps/quality_steps.py +0 -0
  256. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/conftest.py +0 -0
  257. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/eval/baseline.json +0 -0
  258. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/eval/explain.jsonl +0 -0
  259. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/eval/golden.jsonl +0 -0
  260. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/eval/recommend.jsonl +0 -0
  261. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/eval/taps.txt +0 -0
  262. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/functional/test_cli_adapt.py +0 -0
  263. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/functional/test_cli_bmad.py +0 -0
  264. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/functional/test_cli_configuration.py +0 -0
  265. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/functional/test_cli_discovery.py +0 -0
  266. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/functional/test_cli_hooks.py +0 -0
  267. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/functional/test_cli_info.py +0 -0
  268. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/functional/test_cli_intelligence.py +0 -0
  269. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/functional/test_cli_pkg.py +0 -0
  270. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/functional/test_cli_quality.py +0 -0
  271. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/functional/test_cli_taps.py +0 -0
  272. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/functional/test_cli_team.py +0 -0
  273. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/functional/test_everyday_loop.py +0 -0
  274. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/functional/test_property_parsers.py +0 -0
  275. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/make_fixture.py +0 -0
  276. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/perf/test_benchmarks.py +0 -0
  277. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/smoke.sh +0 -0
  278. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_adapters.py +0 -0
  279. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_agents.py +0 -0
  280. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_ai.py +0 -0
  281. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_catalog.py +0 -0
  282. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_claude_settings.py +0 -0
  283. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_cliparse.py +0 -0
  284. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_command_reference_fresh.py +0 -0
  285. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_config.py +0 -0
  286. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_dense.py +0 -0
  287. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_dense_fallback.py +0 -0
  288. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_docs_pages_linked.py +0 -0
  289. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_embed.py +0 -0
  290. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_errors_and_cli_table.py +0 -0
  291. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_frontmatter.py +0 -0
  292. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_gitleaks_config.py +0 -0
  293. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_gitutil.py +0 -0
  294. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_imperative.py +0 -0
  295. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_import_budget.py +0 -0
  296. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_injectscan.py +0 -0
  297. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_journal.py +0 -0
  298. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_lockfile.py +0 -0
  299. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_logs.py +0 -0
  300. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_mcp.py +0 -0
  301. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_mutation_hardening.py +0 -0
  302. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_nethttp.py +0 -0
  303. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_output.py +0 -0
  304. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_paths.py +0 -0
  305. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_pkg_confusions.py +0 -0
  306. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_pkg_injection.py +0 -0
  307. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_pkg_secrets.py +0 -0
  308. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_policy.py +0 -0
  309. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_rag.py +0 -0
  310. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_registries_fresh.py +0 -0
  311. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_roadmap_fresh.py +0 -0
  312. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_rules.py +0 -0
  313. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_secretscan.py +0 -0
  314. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_serve.py +0 -0
  315. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_spin.py +0 -0
  316. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_stackprobe.py +0 -0
  317. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_staleness.py +0 -0
  318. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_store.py +0 -0
  319. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_token_parity.py +0 -0
  320. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_typosquat.py +0 -0
  321. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_updatediff.py +0 -0
  322. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_util.py +0 -0
  323. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_version.py +0 -0
  324. {boost_skill_cli-1.0.172 → boost_skill_cli-1.0.174}/tests/unit/test_workflows.py +0 -0
@@ -54,6 +54,7 @@ auto-fixes straight back onto the branch.
54
54
  | `make mutation` | mutmut over `boost_cli/core`, **≥80% mutants killed** |
55
55
  | `ruff check boost_cli tests` | lint, zero findings |
56
56
  | `mypy` | type check, zero errors |
57
+ | `pyright` | second type checker over `core/` — None-flow & narrowing, zero errors |
57
58
  | `lint-imports` | layering: `core/` imports no `commands/`/`cli`; CLI depends inward |
58
59
  | `vulture` | dead-code radar: no unused imports / unreachable code (confidence ≥80) |
59
60
  | `xenon` | complexity ratchet: aggregate cyclomatic complexity can't regress (avg ≤B) |
@@ -14,7 +14,7 @@ EVAL_HOME := $(CURDIR)/.eval-home
14
14
 
15
15
  venv:
16
16
  python3 -m venv $(VENV)
17
- $(VENV)/bin/pip -q install pytest pytest-cov coverage mutmut ruff mypy codespell hypothesis import-linter diff-cover vulture xenon
17
+ $(VENV)/bin/pip -q install pytest pytest-cov coverage mutmut ruff mypy codespell hypothesis import-linter diff-cover vulture xenon pyright
18
18
 
19
19
  unit:
20
20
  $(PYTEST) tests/unit -q
@@ -45,6 +45,7 @@ mutation:
45
45
  lint:
46
46
  $(VENV)/bin/ruff check boost_cli tests
47
47
  $(VENV)/bin/mypy
48
+ $(VENV)/bin/pyright
48
49
  $(VENV)/bin/lint-imports
49
50
  $(VENV)/bin/vulture boost_cli --min-confidence 80
50
51
  $(VENV)/bin/xenon --max-absolute F --max-modules E --max-average B boost_cli
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.172
3
+ Version: 1.0.174
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.172'
22
- __version_tuple__ = version_tuple = (1, 0, 172)
21
+ __version__ = version = '1.0.174'
22
+ __version_tuple__ = version_tuple = (1, 0, 174)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -194,6 +194,8 @@ def _delete_taps(con: sqlite3.Connection, taps: List[str]) -> None:
194
194
  def _embed_and_store(con: sqlite3.Connection, entries: List[dict],
195
195
  tap_paths: Optional[Dict[str, Path]]) -> int:
196
196
  mod = _load()
197
+ if mod is None: # [rag] extra absent — nothing to serialize into
198
+ return 0 # (callers fall back to BM25; see module docstring)
197
199
  rows: List[Tuple[dict, int, str]] = [] # (entry, chunk_ix, text)
198
200
  for e in entries:
199
201
  for ci, text in enumerate(_chunk_texts(e, tap_paths)):
@@ -226,7 +228,7 @@ def retrieve(query: str, k: int = 60, kind: Optional[str] = None,
226
228
  return None
227
229
  mod = _load()
228
230
  con = _connect()
229
- if con is None:
231
+ if con is None or mod is None:
230
232
  return None
231
233
  try:
232
234
  pool = max(k * _POOL, 200)
@@ -115,9 +115,12 @@ def handle_request(req: dict, *, version: str,
115
115
  if text is None:
116
116
  resp["error"] = {"code": -32602, "message": "unknown tool %r" % tool}
117
117
  else:
118
- resp["result"] = {"content": [{"type": "text", "text": text}]}
118
+ # Annotated: the literal alone infers a list-only value type, so
119
+ # adding the `isError` bool below would be a type error.
120
+ result: dict = {"content": [{"type": "text", "text": text}]}
119
121
  if is_err:
120
- resp["result"]["isError"] = True
122
+ result["isError"] = True
123
+ resp["result"] = result
121
124
  else:
122
125
  resp["error"] = {"code": -32601, "message": "method not found: %s" % method}
123
126
  return resp
@@ -36,9 +36,12 @@ def harden_console_encoding() -> None:
36
36
  so skip a stream that doesn't have it rather than fail startup over it.
37
37
  """
38
38
  for stream in (sys.stdout, sys.stderr):
39
- if hasattr(stream, "reconfigure"):
39
+ # getattr, not hasattr+call: same guard, but it also gives the type
40
+ # checkers a concrete optional to narrow (TextIO has no `reconfigure`).
41
+ reconfigure = getattr(stream, "reconfigure", None)
42
+ if callable(reconfigure):
40
43
  with contextlib.suppress(OSError, ValueError):
41
- stream.reconfigure(encoding="utf-8", errors="replace")
44
+ reconfigure(encoding="utf-8", errors="replace")
42
45
 
43
46
 
44
47
  def use_color(stream=None) -> bool:
@@ -56,8 +56,16 @@ def parse_spec(spec: str):
56
56
 
57
57
 
58
58
  def list_taps() -> List[Tap]:
59
+ # `or []`, not just the get() default: config.get returns the default only
60
+ # when the key is ABSENT, so a config.json carrying `"taps": null` (or any
61
+ # non-list scalar) would otherwise reach the comprehension and raise
62
+ # TypeError. A malformed config should read as "no taps", never crash every
63
+ # command that lists them.
64
+ taps = config.get("taps", []) or []
65
+ if not isinstance(taps, list):
66
+ return []
59
67
  return [Tap(name=t["name"], url=t.get("url", ""), curated=bool(t.get("curated")))
60
- for t in config.get("taps", [])]
68
+ for t in taps if isinstance(t, dict) and t.get("name")]
61
69
 
62
70
 
63
71
  def get(name: str) -> Tap:
@@ -151,8 +151,12 @@ def route(path: str) -> Tuple[int, str, bytes]:
151
151
  class _CatalogHandler(BaseHTTPRequestHandler):
152
152
  server_version = "boost/" + __version__
153
153
 
154
- def log_message(self, fmt, *args): # logged in _send instead
155
- pass
154
+ # `fmt`, not the base class's `format`: the stdlib only ever calls this
155
+ # positionally, and `format` would shadow the builtin (and read as an
156
+ # unused variable to vulture). The name-mismatch override warning is
157
+ # cosmetic here, so it's suppressed at the line rather than repo-wide.
158
+ def log_message(self, fmt, *args): # pyright: ignore[reportIncompatibleMethodOverride]
159
+ pass # request logging happens in _send instead
156
160
 
157
161
  def _send(self, status: int, ctype: str, body: bytes) -> None:
158
162
  self.send_response(status)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.172
3
+ Version: 1.0.174
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -2,15 +2,15 @@
2
2
  id: promote-nav-footer-into-the-shared-style-system
3
3
  board: code
4
4
  section: dx
5
- status: planned
5
+ status: shipped
6
6
  category: DX · Design system
7
7
  complexity: S
8
8
  impact: Med
9
9
  wow: 3
10
10
  note: <code>style/boost.css</code>
11
11
  order: 1
12
- owner:
13
- pr:
12
+ owner: loop/theme
13
+ pr: 197
14
14
  title: Promote nav / footer into the shared style system
15
15
  ---
16
16
  Canonical <code>style/boost.css</code> ships tokens + primitives but
@@ -2,15 +2,15 @@
2
2
  id: second-type-checker-pyright
3
3
  board: code
4
4
  section: pipeline
5
- status: planned
5
+ status: shipped
6
6
  category: Testing · Type
7
7
  complexity: M
8
8
  impact: Med
9
9
  wow: 3
10
10
  note: editor-parity
11
11
  order: 6
12
- owner:
13
- pr:
12
+ owner: loop/pyright
13
+ pr: 196
14
14
  title: Second type checker — <code>pyright</code>
15
15
  ---
16
16
  Run Microsoft's <code>pyright</code> alongside mypy. Its independent
@@ -1246,7 +1246,7 @@ improvement is real (or isn't)."</p>
1246
1246
  </article>
1247
1247
 
1248
1248
  <article class="cap rcard">
1249
- <div class="head"><span class="pill planned">Planned</span><span class="cat">Testing · Type</span></div>
1249
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Testing · Type</span></div>
1250
1250
  <h3>Second type checker — <code>pyright</code></h3>
1251
1251
  <p>Run Microsoft's <code>pyright</code> alongside mypy. Its independent
1252
1252
  inference catches <code>None</code>-flow and narrowing bugs the current
@@ -1308,7 +1308,7 @@ improvement is real (or isn't)."</p>
1308
1308
 
1309
1309
  <!-- ROADMAP:cards section=dx -->
1310
1310
  <article class="cap rcard">
1311
- <div class="head"><span class="pill planned">Planned</span><span class="cat">DX · Design system</span></div>
1311
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">DX · Design system</span></div>
1312
1312
  <h3>Promote nav / footer into the shared style system</h3>
1313
1313
  <p>Canonical <code>style/boost.css</code> ships tokens + primitives but
1314
1314
  <strong>no nav, logo, or footer</strong>, so every page (the guide and
@@ -156,6 +156,21 @@ exclude_lines = [
156
156
  "raise NotImplementedError",
157
157
  ]
158
158
 
159
+ # pyright: a SECOND type checker alongside mypy. Its independent inference
160
+ # catches None-flow and narrowing bugs mypy's config lets slide — it found the
161
+ # `"taps": null` crash in registry.list_taps() that mypy passed clean.
162
+ # Scoped to boost_cli/core (the mutation-tested engine) so the gate is green and
163
+ # meaningful today; widening to commands/ is tracked on the roadmap.
164
+ # Dev/CI-only — never imported at runtime.
165
+ [tool.pyright]
166
+ include = ["boost_cli/core"]
167
+ pythonVersion = "3.9"
168
+ typeCheckingMode = "standard"
169
+ # _version.py is generated by setuptools-scm at build time and absent from a
170
+ # plain checkout (same carve-out as [tool.mypy]).
171
+ ignore = ["boost_cli/_version.py"]
172
+ reportMissingImports = false # optional extras ([rag] sqlite_vec) resolve at runtime
173
+
159
174
  # import-linter: turn boost's assumed layering into an enforced contract, so a
160
175
  # cross-layer import can't silently erode the engine. Run by `make lint`
161
176
  # (lint-imports) and the CI lint job. Dev/CI-only — never imported at runtime.
@@ -326,6 +326,73 @@ a.cap, a.glass { text-decoration: none; }
326
326
  .stat { padding: 18px 10px; }
327
327
  }
328
328
 
329
+ /* ============================================================================
330
+ Site chrome — nav · logo · footer
331
+
332
+ The page frame, defined once. Every page used to re-declare this inline and
333
+ the Design Roadmap declared none at all, so its nav rendered unstyled.
334
+
335
+ These are a shared *floor*, not an override: every page links this sheet
336
+ BEFORE its own <style>, so a page still carrying inline chrome keeps
337
+ winning at equal specificity. Markup this expects:
338
+
339
+ <header>
340
+ <div class="wrap site-nav"> <!-- or: class="wrap nav" -->
341
+ <a class="logo" href="."><b>boost</b><span>Section</span></a>
342
+ <ul><li><a href="#x">X</a></li><li><a class="cta" href=".">Go</a></li></ul>
343
+ </div>
344
+ </header>
345
+ ========================================================================== */
346
+ header {
347
+ position: sticky; top: 0; z-index: 50;
348
+ background: var(--panel-solid);
349
+ border-bottom: 1px solid var(--line);
350
+ }
351
+
352
+ .site-nav, header .nav {
353
+ display: flex; align-items: center; justify-content: space-between;
354
+ gap: 18px; padding: 12px 0;
355
+ }
356
+
357
+ .logo { display: flex; align-items: baseline; gap: 9px; text-decoration: none; }
358
+ .logo b {
359
+ font-family: var(--mono); font-size: 18px; font-weight: 700;
360
+ color: var(--cyan); letter-spacing: -.02em;
361
+ }
362
+ .logo span {
363
+ font-size: 10.5px; letter-spacing: .22em; text-transform: uppercase;
364
+ color: var(--text-2);
365
+ }
366
+
367
+ .site-nav ul, header .nav ul {
368
+ display: flex; align-items: center; flex-wrap: wrap; gap: 18px;
369
+ list-style: none; margin: 0; padding: 0;
370
+ }
371
+ .site-nav a, header .nav a {
372
+ color: var(--text-2); text-decoration: none; font-size: 13.5px;
373
+ }
374
+ .site-nav a:hover, header .nav a:hover { color: var(--text); }
375
+
376
+ /* the one emphasized link in the bar */
377
+ .site-nav a.cta, header .nav a.cta {
378
+ color: var(--bg); background: var(--grad); font-weight: 700;
379
+ padding: 7px 14px; border-radius: 999px;
380
+ }
381
+ .site-nav a.cta:hover, header .nav a.cta:hover { color: var(--bg); opacity: .88; }
382
+
383
+ footer {
384
+ margin-top: 64px; padding: 28px 0 40px;
385
+ border-top: 1px solid var(--line);
386
+ color: var(--text-3); font-size: 13px;
387
+ }
388
+ footer a { color: var(--text-2); text-decoration: none; }
389
+ footer a:hover { color: var(--text); }
390
+
391
+ @media (max-width: 720px) {
392
+ .site-nav, header .nav { flex-direction: column; align-items: flex-start; gap: 10px; }
393
+ .site-nav ul, header .nav ul { gap: 12px; }
394
+ }
395
+
329
396
  /* ============================================================================
330
397
  Accessibility — honor reduced-motion, and print cleanly
331
398
  ========================================================================== */
@@ -115,6 +115,32 @@ class TestListAndGet:
115
115
  def test_list_taps_empty_by_default(self, sandbox):
116
116
  assert registry.list_taps() == []
117
117
 
118
+ def test_list_taps_survives_null_taps_key(self, sandbox):
119
+ """`"taps": null` must read as "no taps", not crash every command.
120
+
121
+ config.get returns its default only when the key is ABSENT, so an
122
+ explicit null reached the comprehension and raised TypeError
123
+ ('NoneType' object is not iterable) — found by pyright, not mypy.
124
+ """
125
+ cfg = config.load()
126
+ cfg["taps"] = None
127
+ config.save(cfg)
128
+ assert registry.list_taps() == []
129
+
130
+ @pytest.mark.parametrize("bogus", ["not-a-list", 42, {"name": "x"}])
131
+ def test_list_taps_ignores_non_list_taps(self, sandbox, bogus):
132
+ cfg = config.load()
133
+ cfg["taps"] = bogus
134
+ config.save(cfg)
135
+ assert registry.list_taps() == []
136
+
137
+ def test_list_taps_skips_malformed_entries(self, sandbox):
138
+ """A junk element must not take down the whole listing."""
139
+ cfg = config.load()
140
+ cfg["taps"] = [{"name": "good", "url": "https://x"}, "junk", {}, None]
141
+ config.save(cfg)
142
+ assert [t.name for t in registry.list_taps()] == ["good"]
143
+
118
144
  def test_get_exact_name(self, sandbox):
119
145
  self._seed()
120
146
  assert registry.get("owner/repo").name == "owner/repo"