boost-skill-cli 1.0.72__tar.gz → 1.0.73__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 (228) hide show
  1. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/core/gitutil.py +13 -1
  4. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  5. boost_skill_cli-1.0.73/docs/roadmap/items/end-of-options-guard-on-git-commands.md +26 -0
  6. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap.html +23 -12
  7. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_gitutil.py +27 -1
  8. boost_skill_cli-1.0.72/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -16
  9. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/.gitattributes +0 -0
  10. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/.gitignore +0 -0
  11. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/CLAUDE.md +0 -0
  12. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/CONTRIBUTING.md +0 -0
  13. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/LICENSE +0 -0
  14. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/MANIFEST.in +0 -0
  15. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/Makefile +0 -0
  16. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/README.md +0 -0
  17. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/SECURITY.md +0 -0
  18. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost +0 -0
  19. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/__init__.py +0 -0
  20. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/__main__.py +0 -0
  21. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/cli.py +0 -0
  22. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/cliparse.py +0 -0
  23. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/commands/__init__.py +0 -0
  24. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/commands/bmad.py +0 -0
  25. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/commands/configuration.py +0 -0
  26. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/commands/discovery.py +0 -0
  27. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/commands/hooks.py +0 -0
  28. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/commands/info.py +0 -0
  29. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/commands/intelligence.py +0 -0
  30. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/commands/pkg.py +0 -0
  31. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/commands/quality.py +0 -0
  32. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/commands/taps.py +0 -0
  33. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/commands/team.py +0 -0
  34. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/core/__init__.py +0 -0
  35. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/core/agents.py +0 -0
  36. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/core/ai.py +0 -0
  37. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/core/catalog.py +0 -0
  38. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/core/claude_settings.py +0 -0
  39. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/core/config.py +0 -0
  40. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/core/dense.py +0 -0
  41. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/core/embed.py +0 -0
  42. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/core/frontmatter.py +0 -0
  43. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/core/journal.py +0 -0
  44. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/core/lockfile.py +0 -0
  45. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/core/logs.py +0 -0
  46. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/core/mcp.py +0 -0
  47. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/core/output.py +0 -0
  48. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/core/paths.py +0 -0
  49. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/core/policy.py +0 -0
  50. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/core/rag.py +0 -0
  51. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/core/registry.py +0 -0
  52. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/core/store.py +0 -0
  53. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/core/util.py +0 -0
  54. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/data/registries.json +0 -0
  55. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/errors.py +0 -0
  56. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_cli/spin.py +0 -0
  57. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_skill_cli.egg-info/SOURCES.txt +0 -0
  58. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  59. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  60. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_skill_cli.egg-info/requires.txt +0 -0
  61. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/boost_skill_cli.egg-info/top_level.txt +0 -0
  62. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/.claude/settings.local.json +0 -0
  63. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/DEBUGGING.md +0 -0
  64. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/demo.gif +0 -0
  65. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/demo.tape +0 -0
  66. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/design-roadmap.html +0 -0
  67. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/index.html +0 -0
  68. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/mcp-hub.html +0 -0
  69. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/rag-architecture.md +0 -0
  70. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D01.md +0 -0
  71. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D02.md +0 -0
  72. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D03.md +0 -0
  73. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D04.md +0 -0
  74. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D05.md +0 -0
  75. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D06.md +0 -0
  76. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D07.md +0 -0
  77. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D08.md +0 -0
  78. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D09.md +0 -0
  79. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D10.md +0 -0
  80. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D11.md +0 -0
  81. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D12.md +0 -0
  82. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D13.md +0 -0
  83. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D14.md +0 -0
  84. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D15.md +0 -0
  85. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D16.md +0 -0
  86. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D17.md +0 -0
  87. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D18.md +0 -0
  88. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D19.md +0 -0
  89. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D20.md +0 -0
  90. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D21.md +0 -0
  91. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D22.md +0 -0
  92. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D23.md +0 -0
  93. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D24.md +0 -0
  94. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/BOOST-D25.md +0 -0
  95. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  96. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  97. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  98. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  99. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  100. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  101. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  102. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  103. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  104. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  105. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  106. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  107. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  108. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  109. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  110. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  111. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  112. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  113. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  114. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  115. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  116. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  117. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  118. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  119. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  120. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  121. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  122. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  123. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  124. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  125. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  126. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  127. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  128. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  129. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  130. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  131. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  132. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  133. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  134. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  135. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  136. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  137. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  138. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  139. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  140. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  141. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  142. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  143. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  144. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  145. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  146. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  147. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  148. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  149. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  150. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  151. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  152. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  153. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  154. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  155. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  156. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  157. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  158. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  159. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  160. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  161. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  162. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  163. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  164. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  165. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  166. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  167. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  168. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  169. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  170. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  171. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  172. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  173. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  174. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  175. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  176. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  177. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/index.html +0 -0
  178. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/pyproject.toml +0 -0
  179. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/scripts/build_registries.py +0 -0
  180. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/scripts/build_roadmap.py +0 -0
  181. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/scripts/mutation_gate.py +0 -0
  182. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/setup.cfg +0 -0
  183. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/style/README.md +0 -0
  184. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/style/boost.css +0 -0
  185. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/style/boost.js +0 -0
  186. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/style/demo.html +0 -0
  187. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/conftest.py +0 -0
  188. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/functional/test_cli_bmad.py +0 -0
  189. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/functional/test_cli_configuration.py +0 -0
  190. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/functional/test_cli_discovery.py +0 -0
  191. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/functional/test_cli_hooks.py +0 -0
  192. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/functional/test_cli_info.py +0 -0
  193. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/functional/test_cli_intelligence.py +0 -0
  194. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/functional/test_cli_pkg.py +0 -0
  195. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/functional/test_cli_quality.py +0 -0
  196. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/functional/test_cli_taps.py +0 -0
  197. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/functional/test_cli_team.py +0 -0
  198. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/functional/test_everyday_loop.py +0 -0
  199. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/make_fixture.py +0 -0
  200. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/smoke.sh +0 -0
  201. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_agents.py +0 -0
  202. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_ai.py +0 -0
  203. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_catalog.py +0 -0
  204. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_claude_settings.py +0 -0
  205. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_cliparse.py +0 -0
  206. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_config.py +0 -0
  207. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_dense.py +0 -0
  208. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_dense_fallback.py +0 -0
  209. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_embed.py +0 -0
  210. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_errors_and_cli_table.py +0 -0
  211. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_frontmatter.py +0 -0
  212. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_journal.py +0 -0
  213. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_lockfile.py +0 -0
  214. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_logs.py +0 -0
  215. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_mcp.py +0 -0
  216. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_mutation_hardening.py +0 -0
  217. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_output.py +0 -0
  218. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_paths.py +0 -0
  219. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_policy.py +0 -0
  220. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_rag.py +0 -0
  221. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_registries_fresh.py +0 -0
  222. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_registry.py +0 -0
  223. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_roadmap_fresh.py +0 -0
  224. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_spin.py +0 -0
  225. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_store.py +0 -0
  226. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_token_parity.py +0 -0
  227. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_util.py +0 -0
  228. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.73}/tests/unit/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.72
3
+ Version: 1.0.73
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.72'
22
- __version_tuple__ = version_tuple = (1, 0, 72)
21
+ __version__ = version = '1.0.73'
22
+ __version_tuple__ = version_tuple = (1, 0, 73)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -31,9 +31,21 @@ def run(args: List[str], cwd: Optional[Path] = None, check: bool = True,
31
31
  return proc
32
32
 
33
33
 
34
+ # git's remote-helper transports run arbitrary commands straight from the URL
35
+ # (notably `ext::sh -c …`), so refuse them outright — boost only ever clones
36
+ # real http(s)/ssh/git remotes.
37
+ _UNSAFE_TRANSPORTS = ("ext::", "file::", "fd::")
38
+
39
+
34
40
  def clone_shallow(url: str, dest: Path) -> None:
41
+ if url.lstrip().lower().startswith(_UNSAFE_TRANSPORTS):
42
+ raise BoostError(
43
+ "refusing to clone via unsafe git transport: %s" % url,
44
+ hint="use an https://, ssh://, or git@ remote")
35
45
  dest.parent.mkdir(parents=True, exist_ok=True)
36
- run(["clone", "--depth", "1", "--quiet", url, str(dest)], timeout=600)
46
+ # `--` ends option parsing so a URL beginning with `-` cannot be read as a
47
+ # git flag — argument-injection defense-in-depth beside registry.parse_spec.
48
+ run(["clone", "--depth", "1", "--quiet", "--", url, str(dest)], timeout=600)
37
49
 
38
50
 
39
51
  def pull(repo: Path) -> str:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.72
3
+ Version: 1.0.73
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -0,0 +1,26 @@
1
+ ---
2
+ id: end-of-options-guard-on-git-commands
3
+ board: code
4
+ section: shipped
5
+ status: shipped
6
+ category: Security
7
+ complexity: S
8
+ impact: Med
9
+ wow: 3
10
+ note: transport allow-list + -- guard
11
+ order: 8
12
+ owner: loop/gitutil-transport-guard
13
+ pr:
14
+ title: End-of-options <code>--</code> guard on git commands
15
+ ---
16
+ <code>clone_shallow</code> passed the clone URL as a positional with no
17
+ <code>--</code> separator, so a value beginning with <code>-</code>
18
+ could be read as a git flag, and git's remote-helper transports
19
+ (<code>ext::sh -c …</code>, <code>file::</code>, <code>fd::</code>)
20
+ can execute arbitrary commands straight from a URL. Now it refuses
21
+ those transports outright and passes <code>--</code> before the URL
22
+ so option parsing can't be hijacked — argument-injection
23
+ defense-in-depth beside <code>registry.parse_spec</code>. Kept scoped
24
+ to the one primitive that takes a user-influenced URL (the refs in
25
+ <code>pull</code>/<code>reset</code> are constants, and <code>--</code>
26
+ there would wrongly mean a pathspec). Six tests, mutation-verified.
@@ -115,7 +115,7 @@
115
115
  <section class="block reveal">
116
116
  <div class="stats">
117
117
  <!-- ROADMAP:stats -->
118
- <div class="stat"><b>7</b><span>Shipped</span></div>
118
+ <div class="stat"><b>8</b><span>Shipped</span></div>
119
119
  <div class="stat"><b>3</b><span>Next up</span></div>
120
120
  <div class="stat"><b>4</b><span>Planned</span></div>
121
121
  <div class="stat"><b>83</b><span>Loop finds</span></div>
@@ -248,6 +248,28 @@
248
248
  <span class="m">broken headline command, now works</span>
249
249
  </div>
250
250
  </article>
251
+
252
+ <article class="cap rcard">
253
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Security</span></div>
254
+ <h3>End-of-options <code>--</code> guard on git commands</h3>
255
+ <p><code>clone_shallow</code> passed the clone URL as a positional with no
256
+ <code>--</code> separator, so a value beginning with <code>-</code>
257
+ could be read as a git flag, and git's remote-helper transports
258
+ (<code>ext::sh -c …</code>, <code>file::</code>, <code>fd::</code>)
259
+ can execute arbitrary commands straight from a URL. Now it refuses
260
+ those transports outright and passes <code>--</code> before the URL
261
+ so option parsing can't be hijacked — argument-injection
262
+ defense-in-depth beside <code>registry.parse_spec</code>. Kept scoped
263
+ to the one primitive that takes a user-influenced URL (the refs in
264
+ <code>pull</code>/<code>reset</code> are constants, and <code>--</code>
265
+ there would wrongly mean a pathspec). Six tests, mutation-verified.</p>
266
+ <div class="meta">
267
+ <span class="m">Complexity <b>S</b></span>
268
+ <span class="m">Impact <b>Med</b></span>
269
+ <span class="m">Wow <b class="wow">★★★</b></span>
270
+ <span class="m">transport allow-list + -- guard</span>
271
+ </div>
272
+ </article>
251
273
  <!-- /ROADMAP:cards -->
252
274
 
253
275
  </div>
@@ -431,17 +453,6 @@
431
453
  </div>
432
454
  </article>
433
455
 
434
- <article class="cap rcard">
435
- <div class="head"><span class="pill next">Next</span><span class="cat">Security</span></div>
436
- <h3>End-of-options <code>--</code> guard on git commands</h3>
437
- <p><code>clone_shallow</code>/<code>fetch</code>/<code>reset</code> pass the URL &amp; ref as positionals with no <code>--</code> separator (<code>core/gitutil.py:34–46</code>), so a value starting with <code>-</code> is parsed as a git option. <code>parse_spec</code> constrains most URL shapes, but adding <code>--</code> before positionals and rejecting <code>ext::</code>/<code>file::</code>/<code>fd::</code> transports closes the argument-injection surface as defense-in-depth.</p>
438
- <div class="meta">
439
- <span class="m">Complexity <b>S</b></span>
440
- <span class="m">Impact <b>Med</b></span>
441
- <span class="m">Wow <b class="wow">★★★</b></span>
442
- </div>
443
- </article>
444
-
445
456
  <article class="cap rcard">
446
457
  <div class="head"><span class="pill planned">Planned</span><span class="cat">Robustness</span></div>
447
458
  <h3>Atomic skill install (temp-dir swap)</h3>
@@ -145,10 +145,36 @@ class TestCloneAndInspect:
145
145
  calls = _record_run(monkeypatch)
146
146
  gitutil.clone_shallow("git@example:x.git", tmp_path / "d")
147
147
  (args, kw), = calls
148
- assert args == ["clone", "--depth", "1", "--quiet",
148
+ assert args == ["clone", "--depth", "1", "--quiet", "--",
149
149
  "git@example:x.git", str(tmp_path / "d")]
150
150
  assert kw.get("timeout") == 600 # long clone timeout, not the 300 default
151
151
 
152
+ def test_clone_shallow_puts_end_of_options_before_url(self, tmp_path,
153
+ monkeypatch):
154
+ # a URL beginning with `-` must be a positional, never a git flag
155
+ calls = _record_run(monkeypatch)
156
+ gitutil.clone_shallow("--upload-pack=evil", tmp_path / "d")
157
+ (args, _kw), = calls
158
+ assert "--" in args and args.index("--") < args.index("--upload-pack=evil")
159
+
160
+ @pytest.mark.parametrize("bad", [
161
+ "ext::sh -c evil", "file::/etc/passwd", "fd::7",
162
+ "EXT::sh -c evil", # case-insensitive
163
+ " ext::sh -c evil", # leading whitespace stripped first
164
+ ])
165
+ def test_clone_shallow_rejects_unsafe_transports(self, tmp_path, monkeypatch,
166
+ bad):
167
+ calls = _record_run(monkeypatch)
168
+ with pytest.raises(BoostError) as ei:
169
+ gitutil.clone_shallow(bad, tmp_path / "d")
170
+ assert "unsafe git transport" in ei.value.message
171
+ assert calls == [] # git is never invoked for a rejected URL
172
+
173
+ def test_clone_shallow_allows_ordinary_https(self, tmp_path, monkeypatch):
174
+ calls = _record_run(monkeypatch)
175
+ gitutil.clone_shallow("https://github.com/o/r", tmp_path / "d")
176
+ assert len(calls) == 1 # a normal remote clones, not rejected
177
+
152
178
  def test_head_commit_argv_is_rev_parse_head(self, tmp_path, monkeypatch):
153
179
  calls = _record_run(monkeypatch, stdout="c0ffee\n")
154
180
  assert gitutil.head_commit(tmp_path / "r") == "c0ffee"
@@ -1,16 +0,0 @@
1
- ---
2
- id: end-of-options-guard-on-git-commands
3
- board: code
4
- section: internals
5
- status: next
6
- category: Security
7
- complexity: S
8
- impact: Med
9
- wow: 3
10
- note:
11
- order: 6
12
- owner:
13
- pr:
14
- title: End-of-options <code>--</code> guard on git commands
15
- ---
16
- <code>clone_shallow</code>/<code>fetch</code>/<code>reset</code> pass the URL &amp; ref as positionals with no <code>--</code> separator (<code>core/gitutil.py:34–46</code>), so a value starting with <code>-</code> is parsed as a git option. <code>parse_spec</code> constrains most URL shapes, but adding <code>--</code> before positionals and rejecting <code>ext::</code>/<code>file::</code>/<code>fd::</code> transports closes the argument-injection surface as defense-in-depth.
File without changes