yaga-cli 0.4.0__tar.gz → 0.4.1__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.
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.github/workflows/ci.yml +2 -1
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.gitignore +2 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/PKG-INFO +2 -1
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/changelog.md +11 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/getting-started.md +1 -1
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/minimum-runtime.md +27 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/releasing.md +9 -5
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/pyproject.toml +3 -1
- yaga_cli-0.4.1/release-notes.md +10 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/scripts/check_build.py +30 -1
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/version_requirement.py +1 -1
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_cli.py +1 -1
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_git_runtime.py +50 -3
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_installation.py +2 -2
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_tooling.py +78 -3
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/uv.lock +3 -1
- yaga_cli-0.4.0/release-notes.md +0 -58
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.gitattributes +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.github/dependabot.yml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.github/workflows/commit-adoption-qualification.yml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.github/workflows/commit-policy.yml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.github/workflows/commit-quality.yml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.github/workflows/docs.yml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.github/workflows/release.yml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.pre-commit-hooks.yaml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.yaga/branch-policy.toml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.yaga/change-policy.toml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.yaga/checks/ci.toml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.yaga/mode-policy.toml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.yaga/path-policy.toml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.yaga/size-policy.toml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.yaga/tree-policy.toml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/AGENTS.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/CHANGELOG.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/CONTRIBUTING.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/LICENSE +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/Makefile +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/README.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/SECURITY.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/_typos.toml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/action.yml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/actions/commit-check/action.yml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/agent-review-gate.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/assets/branding/isometric_terminal_y_logo.png +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/assets/branding/isometric_terminal_y_logo_transparent.png +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/assets/branding/yaga_cli_brand_concept_board.png +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/branch-policy.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/change-policy.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/ci-adoption.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/commands.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/commit-policy-direction.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/commit-policy.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/commit-quality.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/configuration.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/contributing.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/examples/test-planning/django-ray.toml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/examples/test-planning/polyglot.toml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/experiments/django-ray-full-shadow-result.json +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/experiments/django-ray-shadow-replay/cohort.json +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/experiments/django-ray-shadow-replay/observations-01.json +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/experiments/django-ray-shadow-replay/observations-02.json +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/experiments/django-ray-shadow-replay/observations-03.json +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/experiments/django-ray-shadow-replay/observations-04.json +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/experiments/django-ray-shadow-replay/observations-05.json +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/experiments/django-ray-shadow-replay/observations-06.json +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/experiments/django-ray-shadow-replay/report.json +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/experiments/django-ray-shadow-replay.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/staged-checks.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/test-planning.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/github-actions.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/github-review-adapter.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/index.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/install.ps1 +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/install.sh +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/mode-policy.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/path-policy.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/pull-request-descriptions.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/recipes.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/repository-checks.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/repository-plans.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/security.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/size-policy.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/stylesheets/extra.css +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/test-planning-handoff.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/test-planning.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/tree-policy.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/troubleshooting.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/usage.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/workflow-checks.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/examples/agent-review-policy.toml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/examples/agent-review-results.json +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/examples/agent-review.yml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/examples/commit-policy.yml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/examples/description-policy.toml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/examples/pull-request-template.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/examples/review-policy.yml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/examples/test-planning/fixed_handoff.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/examples/test-planning/replay_django_ray.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/overrides/404.html +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/scripts/check_description.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/scripts/check_docs.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/scripts/check_minimum_runtime.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/scripts/check_release.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/scripts/composite_smoke_python +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/scripts/prepare_commit_action_control.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/__init__.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/__main__.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/_update_worker.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/action.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/action_cli.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/__init__.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/evaluation.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/__init__.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/boundary.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/candidate.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/constants.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/events.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/evidence.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/gate.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/publication.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/requests.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/runs.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/runtime.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/plan.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/results.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/runtime.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/branches/__init__.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/branches/checker.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/branches/models.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/branches/patterns.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/branches/policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/branches/reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/branches/service.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/changes/__init__.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/changes/checker.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/changes/git.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/changes/models.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/changes/patterns.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/changes/policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/changes/reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/changes/service.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/cli.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/__init__.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/branch.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/change.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/commit.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/config.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/gate.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/github.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/mode.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/path.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/pull_request.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/repo.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/self_manage.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/size.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/test.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/tree.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/workflow.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commit_action_cli.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commit_action_runtime.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/__init__.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/checker.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/config.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/config_explain.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/config_init.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/content_policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/dependabot.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/git.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/github_event.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/github_reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/github_signature.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/models.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/parser.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/quality.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/service.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/severity.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/sources.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/template.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/trusted_policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/typos.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/config_scope.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/descriptions/__init__.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/descriptions/checker.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/descriptions/github.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/descriptions/hygiene.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/descriptions/markdown.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/descriptions/models.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/descriptions/policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/descriptions/reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/descriptions/service.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/descriptions/sources.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/errors.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/files.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/git/__init__.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/git/changes.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/git/process.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/git/runtime.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/git/tree.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/github.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/models.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/modes/__init__.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/modes/checker.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/modes/git.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/modes/models.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/modes/patterns.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/modes/policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/modes/reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/modes/service.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/path_patterns.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/paths/__init__.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/paths/checker.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/paths/git.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/paths/models.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/paths/policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/paths/reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/paths/service.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/repository/__init__.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/repository/checker.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/repository/models.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/repository/plan.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/repository/reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/self_update.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/sizes/__init__.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/sizes/checker.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/sizes/git.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/sizes/models.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/sizes/patterns.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/sizes/policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/sizes/reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/sizes/service.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/status.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/__init__.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/diagnostics.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/evaluation.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/evaluation_service.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/git.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/handoff.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/limits.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/models.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/planner.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/reports.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/results.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/selection.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/service.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/source.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/trees/__init__.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/trees/checker.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/trees/git.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/trees/models.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/trees/patterns.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/trees/policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/trees/reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/trees/service.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/__init__.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/actionlint_runtime.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/actionlint_snapshot.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/checker.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/inputs.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/lint.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/models.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/parser.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/references.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/security.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/security_facts.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/security_models.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/security_reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/security_rules.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/yaml.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/__init__.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/codex_support.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/fixtures/commit_consumer_parity.json +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/fixtures/github-signatures/.gitattributes +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/fixtures/github-signatures/.typos.toml +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/fixtures/github-signatures/README.md +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/fixtures/github-signatures/dependabot-setup-uv.commit +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/fixtures/github-signatures/dependabot-urllib3-parent.commit +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/fixtures/github-signatures/dependabot-urllib3.commit +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/fixtures/github-signatures/web-flow.asc +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_action.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_agent_review_cli.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_agent_review_evaluation.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_agent_review_plan.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_agent_review_policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_agent_review_results.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_branch_checker.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_branch_cli.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_branch_models.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_branch_patterns.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_branch_policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_branch_reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_branch_service.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_build_git_isolation.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_change_checker.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_change_cli.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_change_git.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_change_patterns.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_change_policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_change_reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_codex_events.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_codex_evidence.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_codex_evidence_literals.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_codex_gate.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_codex_publication.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_codex_requests.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_codex_runs.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_codex_runtime.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_command_guide.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_action.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_action_controls.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_body_customization.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_checker.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_config.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_consumer_policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_content_policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_explicit_inputs.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_git.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_parser.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_quality.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_quality_workflow.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_service.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_sources.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_template.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_trusted_policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_typos.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_warnings.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_config_init.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_config_workflows.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_consumer_policy_entrypoints.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_dependabot_commit_filter.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_description.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_description_checker.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_description_cli.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_description_github.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_description_hygiene.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_description_markdown.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_description_policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_description_remote_cli.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_description_sources.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_description_structure.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_docs_links.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_files.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_git_tree.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_github.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_github_commit_signature.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_github_pull_request.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_github_reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_installers.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_minimum_runtime.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_mode_checker.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_mode_cli.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_mode_git.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_mode_models.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_mode_patterns.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_mode_policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_mode_reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_mode_service.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_models.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_path_checker.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_path_cli.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_path_git.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_path_models.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_path_patterns.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_path_policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_path_reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_path_service.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_plain_messages.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_pr_proposed_message.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_regular_file_prefix.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_release.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_repo_cli.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_repository_checker.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_repository_contract.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_repository_models.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_repository_plan.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_repository_reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_size_checker.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_size_cli.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_size_git.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_size_models.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_size_patterns.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_size_policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_size_reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_size_service.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_status.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_cli.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_diagnostics.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_evaluate_cli.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_evaluation.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_examples.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_git.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_handoff.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_handoff_example.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_planner.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_replay.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_results.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_tree_checker.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_tree_cli.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_tree_git.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_tree_models.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_tree_patterns.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_tree_policy.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_tree_reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_tree_service.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_checker.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_inputs.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_lint.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_lint_hardening.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_lint_reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_provider_inputs.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_references.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_security_cli.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_security_facts.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_security_models.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_security_reporting.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_security_rules.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_security_selection.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_security_service.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_yaml.py +0 -0
- {yaga_cli-0.4.0 → yaga_cli-0.4.1}/zensical.toml +0 -0
|
@@ -145,7 +145,8 @@ jobs:
|
|
|
145
145
|
- python-version: "3.15"
|
|
146
146
|
os: windows-latest
|
|
147
147
|
runs-on: ${{ matrix.os }}
|
|
148
|
-
|
|
148
|
+
# Include setup time and the complete process-heavy suite on Windows.
|
|
149
|
+
timeout-minutes: ${{ matrix.os == 'windows-latest' && 20 || 10 }}
|
|
149
150
|
steps:
|
|
150
151
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
151
152
|
with:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: yaga-cli
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.1
|
|
4
4
|
Summary: Configurable developer workflow checks for local use and GitHub Actions
|
|
5
5
|
Project-URL: Documentation, https://dariuszpanas.github.io/yaga/
|
|
6
6
|
Project-URL: Changelog, https://dariuszpanas.github.io/yaga/changelog.html
|
|
@@ -21,6 +21,7 @@ Classifier: Programming Language :: Python :: 3.14
|
|
|
21
21
|
Classifier: Programming Language :: Python :: 3.15
|
|
22
22
|
Classifier: Topic :: Software Development :: Quality Assurance
|
|
23
23
|
Requires-Python: >=3.12
|
|
24
|
+
Requires-Dist: pygments<3,>=2.20.0
|
|
24
25
|
Requires-Dist: pyyaml<7,>=6.0.3
|
|
25
26
|
Requires-Dist: typer<1,>=0.27.2
|
|
26
27
|
Provides-Extra: quality
|
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [0.4.1] - 2026-10-29
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- Require `Pygments>=2.20.0,<3` in base package metadata so minimum-supported installs
|
|
10
|
+
exclude the versions affected by CVE-2022-40896 and CVE-2026-4539. This constrains the
|
|
11
|
+
existing Typer/Rich dependency; YAGA does not call the affected language lexers.
|
|
12
|
+
- Check the dependency contract in both wheel and source-distribution metadata, and document
|
|
13
|
+
advisory auditing of the actual lowest-resolved dependencies before publication separately
|
|
14
|
+
from their functional CLI qualification.
|
|
15
|
+
|
|
5
16
|
## [0.4.0] - 2026-10-29
|
|
6
17
|
|
|
7
18
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Get started
|
|
2
2
|
|
|
3
|
-
This guide covers **YAGA 0.4.
|
|
3
|
+
This guide covers **YAGA 0.4.1 (Beta)**. YAGA requires Python 3.12 or newer. Install the **`yaga-cli`** distribution from PyPI;
|
|
4
4
|
the executable and import package are **`yaga`**. The `yaga` distribution is an unrelated project.
|
|
5
5
|
|
|
6
6
|
The core CLI is tested on Python 3.12 through 3.15. Python 3.15 installations currently use
|
|
@@ -42,3 +42,30 @@ of versions. Do not raise dependency floors just to match the development lock.
|
|
|
42
42
|
This helper does not replace `uv run make ci`, the frozen platform matrix, or the strict build
|
|
43
43
|
gate's hash-locked installation. It adds no hosted workload; a small hosted smoke can be considered
|
|
44
44
|
when the Actions budget permits.
|
|
45
|
+
|
|
46
|
+
## Security audit of the resolved dependencies
|
|
47
|
+
|
|
48
|
+
Functional smoke success does not mean a dependency set is free of known advisories. Before
|
|
49
|
+
publication, audit the exact installed versions recorded in the minimum-runtime receipt, in
|
|
50
|
+
addition to auditing the release lock. Keep the audit output and the receipt together.
|
|
51
|
+
|
|
52
|
+
Generate a requirements file from the receipt's `runtime.distributions` mapping, excluding
|
|
53
|
+
`yaga-cli` itself, with one `name==version` per line. Audit those pins without installing them:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
uv tool run --from pip-audit==2.10.1 pip-audit --no-deps --disable-pip --strict \
|
|
57
|
+
--requirement minimum-runtime-requirements.txt --format json --output minimum-runtime-audit.json
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Require a successful audit with no skipped distributions or known advisories; inspect the JSON
|
|
61
|
+
rather than treating an unavailable advisory service as a clean result. This command contacts the
|
|
62
|
+
advisory service. It does not execute the recorded dependency versions or replace the installed
|
|
63
|
+
smoke checks. Repeat the audit against the actual pins from fresh public-package installations,
|
|
64
|
+
including lowest resolution, after publication. Retain the audit time because advisory data changes.
|
|
65
|
+
|
|
66
|
+
YAGA 0.4.1 adds a base `Pygments>=2.20.0,<3` constraint to exclude the versions affected by
|
|
67
|
+
[CVE-2022-40896](https://github.com/advisories/GHSA-mrwq-x4v8-fh7p) and
|
|
68
|
+
[CVE-2026-4539](https://github.com/advisories/GHSA-5239-wwwm-4pmq). This is a security-driven floor
|
|
69
|
+
for the existing Typer/Rich dependency, not an attempt to match every development-lock version.
|
|
70
|
+
YAGA does not call the affected Smithy or ADL lexers; that reachability assessment does not waive
|
|
71
|
+
the dependency audit.
|
|
@@ -48,16 +48,20 @@ package users. Twine's metadata check does not prove remote images or links are
|
|
|
48
48
|
above it. The Beta classifier is a maturity label; version `0.1.0` is a normal PyPI version,
|
|
49
49
|
not the PEP 440 prerelease `0.1.0b1`. Use `YAGA 0.1.0` as the GitHub Release title;
|
|
50
50
|
keep the maturity label in package metadata rather than appending `(Beta)` to the title.
|
|
51
|
-
2.
|
|
51
|
+
2. Run [minimum runtime qualification](minimum-runtime.md) and audit the exact recorded
|
|
52
|
+
dependency pins with no skipped distributions or known advisories. Also audit the release
|
|
53
|
+
lock; functional smoke and locked-dependency success do not qualify the lowest set.
|
|
54
|
+
3. Merge the release changes and require all hosted CI lanes to pass for the exact commit,
|
|
52
55
|
including Windows. Resolve dependency PR failures before choosing the candidate.
|
|
53
|
-
|
|
56
|
+
4. After publication is explicitly authorized, create and push the matching `v0.1.0` tag at that
|
|
54
57
|
verified commit. Use the corresponding version for later releases.
|
|
55
|
-
|
|
58
|
+
5. The workflow requires the tagged commit to be on the default branch, checks that the tag matches
|
|
56
59
|
package metadata and a dated changelog entry, and reruns `uv run make ci`. Only then does it
|
|
57
60
|
offer the `pypi` environment approval and upload the validated distributions with attestations.
|
|
58
|
-
|
|
61
|
+
6. Verify the PyPI project files and install `yaga-cli==0.1.0` from PyPI in a clean tool environment.
|
|
59
62
|
Confirm `yaga --help` and the automatically created GitHub Release. Its wheel and source
|
|
60
|
-
archive must be the same artifacts published to PyPI.
|
|
63
|
+
archive must be the same artifacts published to PyPI. Repeat the lowest-resolved installed
|
|
64
|
+
smoke and audit its actual dependency pins from the public package; retain both reports.
|
|
61
65
|
|
|
62
66
|
This workflow accepts final `vMAJOR.MINOR.PATCH` tags and does not publish TestPyPI packages.
|
|
63
67
|
After PyPI publication succeeds, a separate job creates the GitHub Release from the validated
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "yaga-cli"
|
|
7
|
-
version = "0.4.
|
|
7
|
+
version = "0.4.1"
|
|
8
8
|
description = "Configurable developer workflow checks for local use and GitHub Actions"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "BSD-3-Clause"
|
|
@@ -32,7 +32,9 @@ classifiers = [
|
|
|
32
32
|
"Programming Language :: Python :: 3.15",
|
|
33
33
|
"Topic :: Software Development :: Quality Assurance",
|
|
34
34
|
]
|
|
35
|
+
# Keep the transitive renderer dependency above the known lexer advisory floors.
|
|
35
36
|
dependencies = [
|
|
37
|
+
"pygments>=2.20.0,<3",
|
|
36
38
|
"pyyaml>=6.0.3,<7",
|
|
37
39
|
"typer>=0.27.2,<1",
|
|
38
40
|
]
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
### Fixed
|
|
2
|
+
|
|
3
|
+
- Require `Pygments>=2.20.0,<3` in base package metadata so minimum-supported installs
|
|
4
|
+
exclude the versions affected by CVE-2022-40896 and CVE-2026-4539. This constrains the
|
|
5
|
+
existing Typer/Rich dependency; YAGA does not call the affected language lexers.
|
|
6
|
+
- Check the dependency contract in both wheel and source-distribution metadata, and document
|
|
7
|
+
advisory auditing of the actual lowest-resolved dependencies before publication separately
|
|
8
|
+
from their functional CLI qualification.
|
|
9
|
+
|
|
10
|
+
[PyPI](https://pypi.org/project/yaga-cli/0.4.1/)
|
|
@@ -24,8 +24,9 @@ else:
|
|
|
24
24
|
|
|
25
25
|
ROOT = Path(__file__).resolve().parents[1]
|
|
26
26
|
MAX_SMOKE_OUTPUT_BYTES = 65_536
|
|
27
|
+
MAX_DISTRIBUTION_METADATA_BYTES = 1024 * 1024
|
|
27
28
|
SMOKE_MESSAGE = "feat(build): execute the built wheel"
|
|
28
|
-
EXPECTED_REQUIRES_DIST = ["pyyaml<7,>=6.0.3", "typer<1,>=0.27.2"]
|
|
29
|
+
EXPECTED_REQUIRES_DIST = ["pygments<3,>=2.20.0", "pyyaml<7,>=6.0.3", "typer<1,>=0.27.2"]
|
|
29
30
|
EXPECTED_OPTIONAL_REQUIRES_DIST = [
|
|
30
31
|
"boto3<2,>=1.37; extra == 'quality-bedrock'",
|
|
31
32
|
"certifi>=2026.10.19; extra == 'quality'",
|
|
@@ -213,6 +214,33 @@ def validate_wheel_metadata(raw: bytes) -> None:
|
|
|
213
214
|
validate_description(payload.decode("utf-8"))
|
|
214
215
|
|
|
215
216
|
|
|
217
|
+
def validate_sdist_metadata(source_distribution: tarfile.TarFile) -> None:
|
|
218
|
+
"""Require one bounded root metadata file with the same contract as the wheel."""
|
|
219
|
+
members = [
|
|
220
|
+
member
|
|
221
|
+
for member in source_distribution.getmembers()
|
|
222
|
+
if member.name.rsplit("/", 1)[-1] == "PKG-INFO"
|
|
223
|
+
]
|
|
224
|
+
if len(members) != 1:
|
|
225
|
+
raise SystemExit("source distribution must contain exactly one metadata document")
|
|
226
|
+
member = members[0]
|
|
227
|
+
if (
|
|
228
|
+
member.name.count("/") != 1
|
|
229
|
+
or not member.name.startswith("yaga_cli-")
|
|
230
|
+
or not member.isfile()
|
|
231
|
+
or not 0 < member.size <= MAX_DISTRIBUTION_METADATA_BYTES
|
|
232
|
+
):
|
|
233
|
+
raise SystemExit("source distribution metadata must be a bounded regular root file")
|
|
234
|
+
metadata_file = source_distribution.extractfile(member)
|
|
235
|
+
if metadata_file is None:
|
|
236
|
+
raise SystemExit("source distribution metadata could not be read")
|
|
237
|
+
with metadata_file:
|
|
238
|
+
raw = metadata_file.read(MAX_DISTRIBUTION_METADATA_BYTES + 1)
|
|
239
|
+
if len(raw) != member.size:
|
|
240
|
+
raise SystemExit("source distribution metadata size does not match its header")
|
|
241
|
+
validate_wheel_metadata(raw)
|
|
242
|
+
|
|
243
|
+
|
|
216
244
|
def run_bounded(
|
|
217
245
|
command: list[str],
|
|
218
246
|
*,
|
|
@@ -1720,6 +1748,7 @@ def main() -> int:
|
|
|
1720
1748
|
raise SystemExit("wheel must contain exactly one metadata document")
|
|
1721
1749
|
validate_wheel_metadata(wheel.read(metadata_paths[0]))
|
|
1722
1750
|
with tarfile.open(source_distributions[0], mode="r:gz") as source_distribution:
|
|
1751
|
+
validate_sdist_metadata(source_distribution)
|
|
1723
1752
|
names = source_distribution.getnames()
|
|
1724
1753
|
required_suffixes = {
|
|
1725
1754
|
"/action.yml": "the composite Action",
|
|
@@ -7,7 +7,7 @@ import re
|
|
|
7
7
|
from yaga.errors import ConfigurationError
|
|
8
8
|
|
|
9
9
|
# Keep this equal to project.version; the build contract tests enforce that boundary.
|
|
10
|
-
VERSION = "0.4.
|
|
10
|
+
VERSION = "0.4.1"
|
|
11
11
|
_RELEASE = r"(0|[1-9][0-9]{0,8})\.(0|[1-9][0-9]{0,8})\.(0|[1-9][0-9]{0,8})"
|
|
12
12
|
_CLAUSE = re.compile(r"(>=|<=|==|!=|>|<)\s*" + _RELEASE, re.ASCII)
|
|
13
13
|
|
|
@@ -193,7 +193,7 @@ def test_version_is_available_from_the_installed_command() -> None:
|
|
|
193
193
|
result = runner.invoke(app, ["--version"])
|
|
194
194
|
|
|
195
195
|
assert result.exit_code == 0
|
|
196
|
-
assert result.stdout.strip() == "yaga 0.4.
|
|
196
|
+
assert result.stdout.strip() == "yaga 0.4.1"
|
|
197
197
|
|
|
198
198
|
|
|
199
199
|
def test_github_pull_request_command_requires_explicit_signature_opt_out_for_unsigned_bot(
|
|
@@ -561,15 +561,24 @@ def test_blocked_input_writer_shares_process_timeout() -> None:
|
|
|
561
561
|
assert time.monotonic() - before < 2
|
|
562
562
|
|
|
563
563
|
|
|
564
|
+
@pytest.mark.parametrize("startup_delay", [0.0, 0.8])
|
|
564
565
|
def test_timeout_terminates_pipe_holding_descendants_within_a_bounded_cleanup(
|
|
565
566
|
tmp_path: Path,
|
|
567
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
568
|
+
startup_delay: float,
|
|
566
569
|
) -> None:
|
|
567
570
|
started = tmp_path / "timeout-child-started"
|
|
571
|
+
armed = tmp_path / "timeout-child-armed"
|
|
568
572
|
survived = tmp_path / "timeout-child-survived"
|
|
569
573
|
child_code = (
|
|
570
574
|
"import pathlib,time; "
|
|
575
|
+
f"time.sleep({startup_delay!r}); "
|
|
571
576
|
f"pathlib.Path({str(started)!r}).write_text('started'); "
|
|
572
|
-
"
|
|
577
|
+
f"armed=pathlib.Path({str(armed)!r}); "
|
|
578
|
+
"deadline=time.monotonic()+10; "
|
|
579
|
+
"\nwhile not armed.exists() and time.monotonic() < deadline: time.sleep(0.01); "
|
|
580
|
+
"\nif not armed.exists(): raise SystemExit(2)"
|
|
581
|
+
"\ntime.sleep(1.0); "
|
|
573
582
|
f"pathlib.Path({str(survived)!r}).write_text('survived')"
|
|
574
583
|
)
|
|
575
584
|
parent_code = (
|
|
@@ -578,9 +587,43 @@ def test_timeout_terminates_pipe_holding_descendants_within_a_bounded_cleanup(
|
|
|
578
587
|
f"started=pathlib.Path({str(started)!r}); "
|
|
579
588
|
"deadline=time.monotonic()+5; "
|
|
580
589
|
"\nwhile not started.exists() and time.monotonic() < deadline: time.sleep(0.01); "
|
|
590
|
+
"\nif not started.exists(): raise SystemExit(2)"
|
|
581
591
|
"\nprint('spawned', flush=True)"
|
|
582
592
|
)
|
|
583
593
|
|
|
594
|
+
real_open_process_tree = runtime.open_process_tree
|
|
595
|
+
ready_at: float | None = None
|
|
596
|
+
|
|
597
|
+
class ReadyProcessTree:
|
|
598
|
+
def __init__(self) -> None:
|
|
599
|
+
self.tree = real_open_process_tree()
|
|
600
|
+
|
|
601
|
+
def creation_flags(self) -> int:
|
|
602
|
+
return self.tree.creation_flags()
|
|
603
|
+
|
|
604
|
+
def starts_new_session(self) -> bool:
|
|
605
|
+
return self.tree.starts_new_session()
|
|
606
|
+
|
|
607
|
+
def attach_and_start(self, process: subprocess.Popen[bytes]) -> None:
|
|
608
|
+
nonlocal ready_at
|
|
609
|
+
self.tree.attach_and_start(process)
|
|
610
|
+
startup_deadline = time.monotonic() + 5.0
|
|
611
|
+
while process.poll() is None and time.monotonic() < startup_deadline:
|
|
612
|
+
time.sleep(0.01)
|
|
613
|
+
if process.poll() != 0 or not started.exists():
|
|
614
|
+
raise OSError("test setup did not establish a ready pipe-holding descendant")
|
|
615
|
+
# Begin the real timeout only after both interpreters have started and the
|
|
616
|
+
# parent has exited. The descendant's survival clock must start here too.
|
|
617
|
+
armed.write_text("armed")
|
|
618
|
+
ready_at = time.monotonic()
|
|
619
|
+
|
|
620
|
+
def terminate(self, process: subprocess.Popen[bytes]) -> None:
|
|
621
|
+
self.tree.terminate(process)
|
|
622
|
+
|
|
623
|
+
def close(self) -> None:
|
|
624
|
+
self.tree.close()
|
|
625
|
+
|
|
626
|
+
monkeypatch.setattr(runtime, "open_process_tree", ReadyProcessTree)
|
|
584
627
|
before = time.monotonic()
|
|
585
628
|
result = runtime._run_bounded(
|
|
586
629
|
[sys.executable, "-c", parent_code],
|
|
@@ -588,12 +631,16 @@ def test_timeout_terminates_pipe_holding_descendants_within_a_bounded_cleanup(
|
|
|
588
631
|
stderr_limit=1024,
|
|
589
632
|
timeout_seconds=0.6,
|
|
590
633
|
)
|
|
591
|
-
|
|
634
|
+
returned_at = time.monotonic()
|
|
592
635
|
|
|
636
|
+
assert result.returncode == 0
|
|
593
637
|
assert result.timed_out
|
|
594
638
|
expected_output = b"spawned\r\n" if os.name == "nt" else b"spawned\n"
|
|
595
639
|
assert result.stdout == expected_output
|
|
596
|
-
assert
|
|
640
|
+
assert result.stderr == b""
|
|
641
|
+
assert ready_at is not None
|
|
642
|
+
assert returned_at - ready_at < 2.0
|
|
643
|
+
assert returned_at - before < 7.0
|
|
597
644
|
assert started.exists()
|
|
598
645
|
time.sleep(0.6)
|
|
599
646
|
assert not survived.exists()
|
|
@@ -68,7 +68,7 @@ def test_windows_worker_waits_and_reports_completion(tmp_path: Path) -> None:
|
|
|
68
68
|
assert not worker.exists()
|
|
69
69
|
|
|
70
70
|
|
|
71
|
-
@pytest.mark.parametrize("requirement", [">=0.1.0", "==0.4.
|
|
71
|
+
@pytest.mark.parametrize("requirement", [">=0.1.0", "==0.4.1", ">0.0.9, <1.0.0", "!=2.0.0"])
|
|
72
72
|
def test_requirement_accepts_current_release(requirement: str) -> None:
|
|
73
73
|
assert check_requirement(requirement) == requirement
|
|
74
74
|
|
|
@@ -82,7 +82,7 @@ def test_requirement_rejects_invalid_syntax(requirement: object) -> None:
|
|
|
82
82
|
check_requirement(requirement)
|
|
83
83
|
|
|
84
84
|
|
|
85
|
-
@pytest.mark.parametrize("requirement", [">0.4.
|
|
85
|
+
@pytest.mark.parametrize("requirement", [">0.4.1", "<0.1.0", ">=1.0.0", "!=0.4.1"])
|
|
86
86
|
def test_requirement_rejects_incompatible_release(requirement: str) -> None:
|
|
87
87
|
with pytest.raises(ConfigurationError, match="does not satisfy"):
|
|
88
88
|
check_requirement(requirement)
|
|
@@ -5,7 +5,9 @@ from __future__ import annotations
|
|
|
5
5
|
import os
|
|
6
6
|
import re
|
|
7
7
|
import sys
|
|
8
|
+
import tarfile
|
|
8
9
|
import tomllib
|
|
10
|
+
from io import BytesIO
|
|
9
11
|
from pathlib import Path
|
|
10
12
|
|
|
11
13
|
import pytest
|
|
@@ -28,6 +30,7 @@ def test_toolchain_supply_chain_inputs_are_exactly_pinned() -> None:
|
|
|
28
30
|
assert project["project"]["name"] == "yaga-cli"
|
|
29
31
|
assert project["project"]["scripts"] == {"yaga": "yaga.cli:main"}
|
|
30
32
|
assert project["project"]["dependencies"] == [
|
|
33
|
+
"pygments>=2.20.0,<3",
|
|
31
34
|
"pyyaml>=6.0.3,<7",
|
|
32
35
|
"typer>=0.27.2,<1",
|
|
33
36
|
]
|
|
@@ -218,7 +221,12 @@ def test_toolchain_supply_chain_inputs_are_exactly_pinned() -> None:
|
|
|
218
221
|
):
|
|
219
222
|
assert f'"{locked_argument}"' in build_gate
|
|
220
223
|
assert '"--no-hashes"' not in build_gate
|
|
221
|
-
assert
|
|
224
|
+
assert check_build.EXPECTED_REQUIRES_DIST == [
|
|
225
|
+
"pygments<3,>=2.20.0",
|
|
226
|
+
"pyyaml<7,>=6.0.3",
|
|
227
|
+
"typer<1,>=0.27.2",
|
|
228
|
+
]
|
|
229
|
+
assert "validate_sdist_metadata(source_distribution)" in build_gate
|
|
222
230
|
assert '"PYTHONPATH"' in build_gate
|
|
223
231
|
assert '"YAGA_ACTION_RUNTIME"' in build_gate
|
|
224
232
|
assert "cwd=consumer" in build_gate
|
|
@@ -338,11 +346,13 @@ def test_toolchain_supply_chain_inputs_are_exactly_pinned() -> None:
|
|
|
338
346
|
assert '"--format",\n "json"' in build_gate
|
|
339
347
|
|
|
340
348
|
|
|
341
|
-
|
|
342
|
-
|
|
349
|
+
@pytest.fixture
|
|
350
|
+
def runtime_metadata() -> bytes:
|
|
351
|
+
return (
|
|
343
352
|
b"Metadata-Version: 2.4\n"
|
|
344
353
|
b"Requires-Python: >=3.12\n"
|
|
345
354
|
b"Description-Content-Type: text/markdown\n"
|
|
355
|
+
b"Requires-Dist: pygments<3,>=2.20.0\n"
|
|
346
356
|
b"Requires-Dist: pyyaml<7,>=6.0.3\n"
|
|
347
357
|
b"Requires-Dist: typer<1,>=0.27.2\n"
|
|
348
358
|
b"Requires-Dist: boto3<2,>=1.37; extra == 'quality-bedrock'\n"
|
|
@@ -353,9 +363,17 @@ def test_wheel_metadata_must_advertise_the_locked_runtime() -> None:
|
|
|
353
363
|
b'<img src="https://dariuszpanas.github.io/yaga/assets/branding/'
|
|
354
364
|
b'isometric_terminal_y_logo_transparent.png" alt="YAGA terminal Y logo">'
|
|
355
365
|
)
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
def test_wheel_metadata_must_advertise_the_locked_runtime(runtime_metadata: bytes) -> None:
|
|
369
|
+
valid = runtime_metadata
|
|
356
370
|
check_build.validate_wheel_metadata(valid)
|
|
357
371
|
|
|
358
372
|
for malformed in (
|
|
373
|
+
valid.replace(b"Requires-Dist: pygments<3,>=2.20.0\n", b""),
|
|
374
|
+
valid.replace(b"pygments<3,>=2.20.0", b"pygments<3,>=2.13.0"),
|
|
375
|
+
valid.replace(b"pygments<3,>=2.20.0", b"pygments>=2.20.0"),
|
|
376
|
+
valid.replace(b"pygments<3,>=2.20.0", b"pygments<3,>=2.20.0; extra == 'quality'"),
|
|
359
377
|
valid.replace(b"Requires-Dist: pyyaml<7,>=6.0.3\n", b""),
|
|
360
378
|
valid.replace(b"Requires-Dist: typer<1,>=0.27.2\n", b""),
|
|
361
379
|
valid.replace(b"pyyaml<7,>=6.0.3", b"pyyaml>=6.0.3"),
|
|
@@ -376,6 +394,63 @@ def test_wheel_metadata_must_advertise_the_locked_runtime() -> None:
|
|
|
376
394
|
check_build.validate_wheel_metadata(malformed)
|
|
377
395
|
|
|
378
396
|
|
|
397
|
+
def _sdist_metadata_archive(
|
|
398
|
+
metadata: bytes,
|
|
399
|
+
*,
|
|
400
|
+
names: tuple[str, ...] = ("yaga_cli-0.0.0/PKG-INFO",),
|
|
401
|
+
entry_type: bytes = tarfile.REGTYPE,
|
|
402
|
+
) -> BytesIO:
|
|
403
|
+
stream = BytesIO()
|
|
404
|
+
with tarfile.open(fileobj=stream, mode="w") as archive:
|
|
405
|
+
for name in names:
|
|
406
|
+
member = tarfile.TarInfo(name)
|
|
407
|
+
member.type = entry_type
|
|
408
|
+
member.linkname = "outside-metadata"
|
|
409
|
+
member.size = len(metadata) if member.isfile() else 0
|
|
410
|
+
archive.addfile(member, BytesIO(metadata) if member.isfile() else None)
|
|
411
|
+
stream.seek(0)
|
|
412
|
+
return stream
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
def test_sdist_metadata_enforces_the_same_runtime_floor(runtime_metadata: bytes) -> None:
|
|
416
|
+
with tarfile.open(fileobj=_sdist_metadata_archive(runtime_metadata)) as archive:
|
|
417
|
+
check_build.validate_sdist_metadata(archive)
|
|
418
|
+
weakened = runtime_metadata.replace(b"pygments<3,>=2.20.0", b"pygments<3,>=2.13.0")
|
|
419
|
+
with tarfile.open(fileobj=_sdist_metadata_archive(weakened)) as archive:
|
|
420
|
+
with pytest.raises(SystemExit, match="runtime dependency metadata"):
|
|
421
|
+
check_build.validate_sdist_metadata(archive)
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
@pytest.mark.parametrize(
|
|
425
|
+
"names",
|
|
426
|
+
[(), ("yaga_cli-0.0.0/PKG-INFO",) * 2, ("yaga_cli-0.0.0/nested/PKG-INFO",)],
|
|
427
|
+
)
|
|
428
|
+
def test_sdist_metadata_must_be_unique_at_the_root(
|
|
429
|
+
runtime_metadata: bytes, names: tuple[str, ...]
|
|
430
|
+
) -> None:
|
|
431
|
+
with tarfile.open(fileobj=_sdist_metadata_archive(runtime_metadata, names=names)) as archive:
|
|
432
|
+
with pytest.raises(SystemExit, match="metadata"):
|
|
433
|
+
check_build.validate_sdist_metadata(archive)
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
@pytest.mark.parametrize("entry_type", [tarfile.SYMTYPE, tarfile.LNKTYPE, tarfile.DIRTYPE])
|
|
437
|
+
def test_sdist_metadata_must_not_follow_links_or_directories(
|
|
438
|
+
runtime_metadata: bytes, entry_type: bytes
|
|
439
|
+
) -> None:
|
|
440
|
+
with tarfile.open(
|
|
441
|
+
fileobj=_sdist_metadata_archive(runtime_metadata, entry_type=entry_type)
|
|
442
|
+
) as archive:
|
|
443
|
+
with pytest.raises(SystemExit, match="regular root file"):
|
|
444
|
+
check_build.validate_sdist_metadata(archive)
|
|
445
|
+
|
|
446
|
+
|
|
447
|
+
def test_sdist_metadata_has_a_byte_limit() -> None:
|
|
448
|
+
oversized = b"x" * (check_build.MAX_DISTRIBUTION_METADATA_BYTES + 1)
|
|
449
|
+
with tarfile.open(fileobj=_sdist_metadata_archive(oversized)) as archive:
|
|
450
|
+
with pytest.raises(SystemExit, match="bounded"):
|
|
451
|
+
check_build.validate_sdist_metadata(archive)
|
|
452
|
+
|
|
453
|
+
|
|
379
454
|
@pytest.mark.parametrize("stream", ["stdout", "stderr"])
|
|
380
455
|
def test_wheel_smoke_process_output_is_bounded(tmp_path: Path, stream: str) -> None:
|
|
381
456
|
command = [
|
|
@@ -1203,9 +1203,10 @@ wheels = [
|
|
|
1203
1203
|
|
|
1204
1204
|
[[package]]
|
|
1205
1205
|
name = "yaga-cli"
|
|
1206
|
-
version = "0.4.
|
|
1206
|
+
version = "0.4.1"
|
|
1207
1207
|
source = { editable = "." }
|
|
1208
1208
|
dependencies = [
|
|
1209
|
+
{ name = "pygments" },
|
|
1209
1210
|
{ name = "pyyaml" },
|
|
1210
1211
|
{ name = "typer" },
|
|
1211
1212
|
]
|
|
@@ -1236,6 +1237,7 @@ dev = [
|
|
|
1236
1237
|
requires-dist = [
|
|
1237
1238
|
{ name = "boto3", marker = "extra == 'quality-bedrock'", specifier = ">=1.37,<2" },
|
|
1238
1239
|
{ name = "certifi", marker = "extra == 'quality'", specifier = ">=2026.10.19" },
|
|
1240
|
+
{ name = "pygments", specifier = ">=2.20.0,<3" },
|
|
1239
1241
|
{ name = "pyyaml", specifier = ">=6.0.3,<7" },
|
|
1240
1242
|
{ name = "torch", marker = "sys_platform == 'linux' and extra == 'quality'", specifier = ">=2.13,<3", index = "https://download.pytorch.org/whl/cpu" },
|
|
1241
1243
|
{ name = "torch", marker = "sys_platform != 'linux' and extra == 'quality'", specifier = ">=2.13,<3" },
|
yaga_cli-0.4.0/release-notes.md
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
### Added
|
|
2
|
-
|
|
3
|
-
- Add installed `pull-request description check` and `github pull-request description check`
|
|
4
|
-
commands for explicit Markdown files, stdin, and GitHub event bodies. Version-one policies
|
|
5
|
-
check meaningful content, word and character limits, unfinished placeholders, optional task
|
|
6
|
-
completion, and isolated Typos spelling. Explicit templates require ordered, filled sections
|
|
7
|
-
and replacement of unchanged prompts. Reports support text, JSON, and GitHub annotations;
|
|
8
|
-
existing commit checks and composite Actions retain their separate contracts.
|
|
9
|
-
|
|
10
|
-
- Check description heading structure even without a template. Default to H2 or deeper and at
|
|
11
|
-
most 120 heading-text characters; reject empty headings and raw HTML heading tags. Recognize
|
|
12
|
-
top-level Setext headings so a whole paragraph formatted as an H1 or H2 cannot count as prose.
|
|
13
|
-
Reject templates whose headings conflict with the selected policy.
|
|
14
|
-
|
|
15
|
-
- Detect suspicious invisible characters, prose tabs, literal escaped line breaks, and unmatched
|
|
16
|
-
backticks outside code and comments. Reject bare carriage returns and identify unsupported
|
|
17
|
-
control characters without rendering them. Document literal UTF-8 file authoring to preserve
|
|
18
|
-
Markdown through shell commands.
|
|
19
|
-
|
|
20
|
-
- Add `pull-request description check --pr` for the current body of an existing GitHub pull
|
|
21
|
-
request. Accept an explicit URL or a number with `--repo`, fetch through the installed
|
|
22
|
-
authenticated `gh` CLI with bounded process execution, and run the same policy/template checks
|
|
23
|
-
without a checkout or Actions. File, stdin, and event checks remain offline.
|
|
24
|
-
|
|
25
|
-
- Add a separate minimum-runtime qualification helper that builds a fresh base wheel, installs
|
|
26
|
-
the lowest resolved runtime dependencies outside the checkout, checks installed imports, and
|
|
27
|
-
runs the shared CLI smoke checks. Its JSON receipt records actual versions and the wheel hash;
|
|
28
|
-
the frozen-lock matrix and strict package build gate remain required.
|
|
29
|
-
|
|
30
|
-
- Make source types, prerequisites, network behavior, reports, repository-plan membership, and
|
|
31
|
-
Action availability discoverable from installed help and the command guide, with tested local
|
|
32
|
-
and complete-PR recipes.
|
|
33
|
-
|
|
34
|
-
- Document the staged-check design assessment, including index semantics, report compatibility,
|
|
35
|
-
and implementation acceptance criteria. Staged execution is not included in this release.
|
|
36
|
-
|
|
37
|
-
### Fixed
|
|
38
|
-
|
|
39
|
-
- Reject Git object-path selectors in changed-path range endpoints before repository access, so
|
|
40
|
-
a crafted gitlink cannot redirect the selected comparison and hide policy findings.
|
|
41
|
-
|
|
42
|
-
- Isolate installed-wheel smoke Git setup from ambient repository variables, user/system
|
|
43
|
-
configuration, and templates, preserving unrelated repositories during qualification.
|
|
44
|
-
|
|
45
|
-
- Allow an explicit `CHANGE_RANGE` override for local `make ci` qualification. Document the
|
|
46
|
-
independent full commit range check and the default last-commit-only comparison.
|
|
47
|
-
|
|
48
|
-
- Require `certifi>=2026.10.19` in the published `quality` extra, including wheel metadata, to
|
|
49
|
-
prevent supported model-download stacks retaining older affected certificate bundles. This
|
|
50
|
-
applies when installing/upgrading with the extra; base and Bedrock requirements are unchanged.
|
|
51
|
-
|
|
52
|
-
- Reject inconsistent Typos success/finding responses instead of silently accepting unexpected
|
|
53
|
-
output as a clean spelling result.
|
|
54
|
-
|
|
55
|
-
- Correct the documented repository-plan key, stdout/stderr capture, lifecycle exit codes,
|
|
56
|
-
quality-provider help, and the fixed GitHub Action's rejecting policy-file input.
|
|
57
|
-
|
|
58
|
-
[PyPI](https://pypi.org/project/yaga-cli/0.4.0/)
|
|
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
|
{yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/assets/branding/isometric_terminal_y_logo_transparent.png
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
|