boost-skill-cli 1.0.72__tar.gz → 1.0.74__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 (229) hide show
  1. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/gitutil.py +13 -1
  4. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  5. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_skill_cli.egg-info/SOURCES.txt +1 -0
  6. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/design-roadmap.html +10 -11
  7. boost_skill_cli-1.0.74/docs/roadmap/items/BOOST-D26.md +16 -0
  8. boost_skill_cli-1.0.74/docs/roadmap/items/end-of-options-guard-on-git-commands.md +26 -0
  9. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap.html +23 -12
  10. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_gitutil.py +27 -1
  11. boost_skill_cli-1.0.72/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -16
  12. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/.gitattributes +0 -0
  13. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/.gitignore +0 -0
  14. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/CLAUDE.md +0 -0
  15. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/CONTRIBUTING.md +0 -0
  16. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/LICENSE +0 -0
  17. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/MANIFEST.in +0 -0
  18. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/Makefile +0 -0
  19. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/README.md +0 -0
  20. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/SECURITY.md +0 -0
  21. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost +0 -0
  22. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/__init__.py +0 -0
  23. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/__main__.py +0 -0
  24. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/cli.py +0 -0
  25. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/cliparse.py +0 -0
  26. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/__init__.py +0 -0
  27. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/bmad.py +0 -0
  28. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/configuration.py +0 -0
  29. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/discovery.py +0 -0
  30. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/hooks.py +0 -0
  31. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/info.py +0 -0
  32. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/intelligence.py +0 -0
  33. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/pkg.py +0 -0
  34. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/quality.py +0 -0
  35. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/taps.py +0 -0
  36. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/team.py +0 -0
  37. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/__init__.py +0 -0
  38. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/agents.py +0 -0
  39. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/ai.py +0 -0
  40. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/catalog.py +0 -0
  41. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/claude_settings.py +0 -0
  42. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/config.py +0 -0
  43. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/dense.py +0 -0
  44. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/embed.py +0 -0
  45. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/frontmatter.py +0 -0
  46. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/journal.py +0 -0
  47. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/lockfile.py +0 -0
  48. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/logs.py +0 -0
  49. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/mcp.py +0 -0
  50. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/output.py +0 -0
  51. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/paths.py +0 -0
  52. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/policy.py +0 -0
  53. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/rag.py +0 -0
  54. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/registry.py +0 -0
  55. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/store.py +0 -0
  56. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/util.py +0 -0
  57. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/data/registries.json +0 -0
  58. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/errors.py +0 -0
  59. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/spin.py +0 -0
  60. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  61. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  62. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_skill_cli.egg-info/requires.txt +0 -0
  63. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_skill_cli.egg-info/top_level.txt +0 -0
  64. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/.claude/settings.local.json +0 -0
  65. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/DEBUGGING.md +0 -0
  66. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/demo.gif +0 -0
  67. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/demo.tape +0 -0
  68. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/index.html +0 -0
  69. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/mcp-hub.html +0 -0
  70. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/rag-architecture.md +0 -0
  71. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D01.md +0 -0
  72. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D02.md +0 -0
  73. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D03.md +0 -0
  74. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D04.md +0 -0
  75. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D05.md +0 -0
  76. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D06.md +0 -0
  77. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D07.md +0 -0
  78. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D08.md +0 -0
  79. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D09.md +0 -0
  80. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D10.md +0 -0
  81. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D11.md +0 -0
  82. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D12.md +0 -0
  83. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D13.md +0 -0
  84. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D14.md +0 -0
  85. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D15.md +0 -0
  86. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D16.md +0 -0
  87. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D17.md +0 -0
  88. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D18.md +0 -0
  89. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D19.md +0 -0
  90. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D20.md +0 -0
  91. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D21.md +0 -0
  92. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D22.md +0 -0
  93. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D23.md +0 -0
  94. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D24.md +0 -0
  95. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D25.md +0 -0
  96. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  97. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  98. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  99. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  100. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  101. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  102. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  103. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  104. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  105. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  106. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  107. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  108. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  109. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  110. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  111. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  112. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  113. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  114. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  115. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  116. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  117. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  118. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  119. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  120. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  121. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  122. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  123. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  124. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  125. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  126. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  127. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  128. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  129. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  130. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  131. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  132. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  133. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  134. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  135. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  136. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  137. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  138. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  139. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  140. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  141. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  142. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  143. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  144. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  145. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  146. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  147. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  148. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  149. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  150. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  151. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  152. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  153. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  154. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  155. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  156. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  157. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  158. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  159. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  160. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  161. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  162. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  163. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  164. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  165. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  166. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  167. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  168. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  169. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  170. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  171. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  172. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  173. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  174. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  175. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  176. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  177. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  178. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/index.html +0 -0
  179. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/pyproject.toml +0 -0
  180. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/scripts/build_registries.py +0 -0
  181. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/scripts/build_roadmap.py +0 -0
  182. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/scripts/mutation_gate.py +0 -0
  183. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/setup.cfg +0 -0
  184. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/style/README.md +0 -0
  185. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/style/boost.css +0 -0
  186. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/style/boost.js +0 -0
  187. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/style/demo.html +0 -0
  188. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/conftest.py +0 -0
  189. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_cli_bmad.py +0 -0
  190. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_cli_configuration.py +0 -0
  191. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_cli_discovery.py +0 -0
  192. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_cli_hooks.py +0 -0
  193. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_cli_info.py +0 -0
  194. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_cli_intelligence.py +0 -0
  195. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_cli_pkg.py +0 -0
  196. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_cli_quality.py +0 -0
  197. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_cli_taps.py +0 -0
  198. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_cli_team.py +0 -0
  199. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_everyday_loop.py +0 -0
  200. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/make_fixture.py +0 -0
  201. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/smoke.sh +0 -0
  202. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_agents.py +0 -0
  203. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_ai.py +0 -0
  204. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_catalog.py +0 -0
  205. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_claude_settings.py +0 -0
  206. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_cliparse.py +0 -0
  207. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_config.py +0 -0
  208. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_dense.py +0 -0
  209. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_dense_fallback.py +0 -0
  210. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_embed.py +0 -0
  211. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_errors_and_cli_table.py +0 -0
  212. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_frontmatter.py +0 -0
  213. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_journal.py +0 -0
  214. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_lockfile.py +0 -0
  215. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_logs.py +0 -0
  216. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_mcp.py +0 -0
  217. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_mutation_hardening.py +0 -0
  218. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_output.py +0 -0
  219. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_paths.py +0 -0
  220. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_policy.py +0 -0
  221. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_rag.py +0 -0
  222. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_registries_fresh.py +0 -0
  223. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_registry.py +0 -0
  224. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_roadmap_fresh.py +0 -0
  225. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_spin.py +0 -0
  226. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_store.py +0 -0
  227. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_token_parity.py +0 -0
  228. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_util.py +0 -0
  229. {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/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.74
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.74'
22
+ __version_tuple__ = version_tuple = (1, 0, 74)
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.74
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -91,6 +91,7 @@ docs/roadmap/items/BOOST-D22.md
91
91
  docs/roadmap/items/BOOST-D23.md
92
92
  docs/roadmap/items/BOOST-D24.md
93
93
  docs/roadmap/items/BOOST-D25.md
94
+ docs/roadmap/items/BOOST-D26.md
94
95
  docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md
95
96
  docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md
96
97
  docs/roadmap/items/atomic-skill-install-temp-dir-swap.md
@@ -213,7 +213,7 @@
213
213
  <button class="pill" data-filter="impact" data-val="med">Med</button>
214
214
  <button class="pill" data-filter="impact" data-val="low">Low</button>
215
215
  </div>
216
- <p class="roadmap-count"><b id="shown"><!-- ROADMAP:count shown -->25<!-- /ROADMAP:count --></b> of <b><!-- ROADMAP:count total -->25<!-- /ROADMAP:count --></b> opportunities shown</p>
216
+ <p class="roadmap-count"><b id="shown"><!-- ROADMAP:count shown -->26<!-- /ROADMAP:count --></b> of <b><!-- ROADMAP:count total -->26<!-- /ROADMAP:count --></b> opportunities shown</p>
217
217
  </div>
218
218
 
219
219
  <div class="wrap" id="board">
@@ -397,7 +397,7 @@
397
397
  <h3>Command-by-command Polish</h3>
398
398
  <p>The screens users actually stare at — front door, doctor, list, info, browse.</p>
399
399
  </div>
400
- <span class="n"><!-- ROADMAP:count track=commands -->6 items<!-- /ROADMAP:count --></span>
400
+ <span class="n"><!-- ROADMAP:count track=commands -->7 items<!-- /ROADMAP:count --></span>
401
401
  </div>
402
402
  <div class="rcards">
403
403
 
@@ -449,16 +449,15 @@
449
449
  <div class="rmeta"><span class="m-cat">ux</span><span>Complexity L</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★☆☆</span></div>
450
450
  <div class="rref"><code>cliparse.py (BoostArgumentParser) · all 10 command files</code></div>
451
451
  </article>
452
- <!-- /ROADMAP:cards -->
453
-
454
- <article class="ritem" data-track="commands" data-impact="high">
455
- <div class="ritem-top"><span class="rid">BOOST-D26</span><span class="rstatus done">Shipped</span></div>
456
- <h4><code>browse</code> — Aurora the full-screen TUI</h4>
457
- <p>The interactive <code>browse</code> pane was the <b>last off-theme surface</b>: a curses screen drawn in raw <code>A_BOLD</code>/<code>A_DIM</code>/<code>A_REVERSE</code> — zero brand color while every other command spoke Aurora. Rebuilt it as a first-class TUI: a macOS <b>titlebar</b> (traffic-light dots + <code>boost browse</code> wordmark under a cyan→violet→pink gradient rule), an <code>❯</code> chevron prompt with a live cursor, <b>fuzzy-match highlighting</b> (matched chars glow pink as you type), a cyan selection bar, yellow curated <code>★</code>, violet tap labels, a right-edge scrollbar, and a gradient-topped detail pane. Colors come from the single-source <code>out.TOKENS</code> via <code>init_color</code> — parity-locked to <code>style/boost.css</code> — and degrade truecolor → 8-color → monochrome. Stdlib only.</p>
458
- <div class="rmeta"><span class="m-cat">commands</span><span>Complexity L</span><span class="m-imp high">Impact High</span><span class="m-wow">★★★★★</span></div>
459
- <div class="rref"><code>commands/discovery.py · _browse_tui / _aurora_theme</code></div>
460
- </article>
461
452
 
453
+ <article class="ritem" data-track="commands" data-impact="high">
454
+ <div class="ritem-top"><span class="rid">BOOST-D26</span><span class="rstatus done">Shipped</span></div>
455
+ <h4><code>browse</code> — Aurora the full-screen TUI</h4>
456
+ <p>The interactive <code>browse</code> pane was the <b>last off-theme surface</b>: a curses screen drawn in raw <code>A_BOLD</code>/<code>A_DIM</code>/<code>A_REVERSE</code> — zero brand color while every other command spoke Aurora. Rebuilt it as a first-class TUI: a macOS <b>titlebar</b> (traffic-light dots + <code>boost browse</code> wordmark under a cyan→violet→pink gradient rule), an <code>❯</code> chevron prompt with a live <code>▏</code> caret, <b>fuzzy-match highlighting</b> (matched chars glow pink as you type), a cyan selection bar, yellow curated <code>★</code>, violet tap labels, a right-edge scrollbar, and a gradient-topped detail pane with <code>#tag</code> chips. Colors come from the single-source <code>out.TOKENS</code> via <code>init_color</code> — parity-locked to <code>style/boost.css</code> — and degrade truecolor → 8-color → monochrome. Stdlib only. With this, <b>every boost command is on-theme</b>.</p>
457
+ <div class="rmeta"><span class="m-cat">commands</span><span>Complexity L</span><span class="m-imp high">Impact High</span><span class="m-wow">★★★★★</span></div>
458
+ <div class="rref"><code>commands/discovery.py · _browse_tui / _aurora_theme</code></div>
459
+ </article>
460
+ <!-- /ROADMAP:cards -->
462
461
  </div>
463
462
  </section>
464
463
 
@@ -0,0 +1,16 @@
1
+ ---
2
+ id: BOOST-D26
3
+ board: design
4
+ track: commands
5
+ status: done
6
+ impact: high
7
+ complexity: L
8
+ wow: 5
9
+ category: commands
10
+ ref: commands/discovery.py · _browse_tui / _aurora_theme
11
+ order: 7
12
+ owner: loop/browse-aurora
13
+ pr: 80
14
+ title: <code>browse</code> — Aurora the full-screen TUI
15
+ ---
16
+ The interactive <code>browse</code> pane was the <b>last off-theme surface</b>: a curses screen drawn in raw <code>A_BOLD</code>/<code>A_DIM</code>/<code>A_REVERSE</code> — zero brand color while every other command spoke Aurora. Rebuilt it as a first-class TUI: a macOS <b>titlebar</b> (traffic-light dots + <code>boost browse</code> wordmark under a cyan→violet→pink gradient rule), an <code>❯</code> chevron prompt with a live <code>▏</code> caret, <b>fuzzy-match highlighting</b> (matched chars glow pink as you type), a cyan selection bar, yellow curated <code>★</code>, violet tap labels, a right-edge scrollbar, and a gradient-topped detail pane with <code>#tag</code> chips. Colors come from the single-source <code>out.TOKENS</code> via <code>init_color</code> — parity-locked to <code>style/boost.css</code> — and degrade truecolor → 8-color → monochrome. Stdlib only. With this, <b>every boost command is on-theme</b>.
@@ -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