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.
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/gitutil.py +13 -1
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_skill_cli.egg-info/SOURCES.txt +1 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/design-roadmap.html +10 -11
- boost_skill_cli-1.0.74/docs/roadmap/items/BOOST-D26.md +16 -0
- boost_skill_cli-1.0.74/docs/roadmap/items/end-of-options-guard-on-git-commands.md +26 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap.html +23 -12
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_gitutil.py +27 -1
- boost_skill_cli-1.0.72/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -16
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/.gitattributes +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/.gitignore +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/LICENSE +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/Makefile +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/README.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/index.html +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {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
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {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
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {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
- {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
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {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
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {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
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {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
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {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
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {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
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {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
- {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
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {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
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {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
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {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
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {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
- {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
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {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
- {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
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {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
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {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
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/index.html +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/setup.cfg +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/style/README.md +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/style/boost.css +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/style/boost.js +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/style/demo.html +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/tests/unit/test_version.py +0 -0
|
@@ -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.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 0,
|
|
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
|
-
|
|
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:
|
|
@@ -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 -->
|
|
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 -->
|
|
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>
|
|
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 & 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 & 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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/boost_skill_cli.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/command-reference-docs-site.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/layering-guard-import-linter.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{boost_skill_cli-1.0.72 → boost_skill_cli-1.0.74}/docs/roadmap/items/one-command-every-env-nox.md
RENAMED
|
File without changes
|
|
File without changes
|