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.
Files changed (429) hide show
  1. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.github/workflows/ci.yml +2 -1
  2. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.gitignore +2 -0
  3. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/PKG-INFO +2 -1
  4. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/changelog.md +11 -0
  5. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/getting-started.md +1 -1
  6. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/minimum-runtime.md +27 -0
  7. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/releasing.md +9 -5
  8. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/pyproject.toml +3 -1
  9. yaga_cli-0.4.1/release-notes.md +10 -0
  10. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/scripts/check_build.py +30 -1
  11. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/version_requirement.py +1 -1
  12. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_cli.py +1 -1
  13. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_git_runtime.py +50 -3
  14. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_installation.py +2 -2
  15. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_tooling.py +78 -3
  16. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/uv.lock +3 -1
  17. yaga_cli-0.4.0/release-notes.md +0 -58
  18. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.gitattributes +0 -0
  19. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.github/dependabot.yml +0 -0
  20. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.github/workflows/commit-adoption-qualification.yml +0 -0
  21. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.github/workflows/commit-policy.yml +0 -0
  22. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.github/workflows/commit-quality.yml +0 -0
  23. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.github/workflows/docs.yml +0 -0
  24. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.github/workflows/release.yml +0 -0
  25. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.pre-commit-hooks.yaml +0 -0
  26. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.yaga/branch-policy.toml +0 -0
  27. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.yaga/change-policy.toml +0 -0
  28. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.yaga/checks/ci.toml +0 -0
  29. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.yaga/mode-policy.toml +0 -0
  30. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.yaga/path-policy.toml +0 -0
  31. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.yaga/size-policy.toml +0 -0
  32. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/.yaga/tree-policy.toml +0 -0
  33. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/AGENTS.md +0 -0
  34. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/CHANGELOG.md +0 -0
  35. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/CONTRIBUTING.md +0 -0
  36. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/LICENSE +0 -0
  37. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/Makefile +0 -0
  38. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/README.md +0 -0
  39. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/SECURITY.md +0 -0
  40. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/_typos.toml +0 -0
  41. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/action.yml +0 -0
  42. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/actions/commit-check/action.yml +0 -0
  43. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/agent-review-gate.md +0 -0
  44. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/assets/branding/isometric_terminal_y_logo.png +0 -0
  45. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/assets/branding/isometric_terminal_y_logo_transparent.png +0 -0
  46. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/assets/branding/yaga_cli_brand_concept_board.png +0 -0
  47. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/branch-policy.md +0 -0
  48. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/change-policy.md +0 -0
  49. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/ci-adoption.md +0 -0
  50. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/commands.md +0 -0
  51. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/commit-policy-direction.md +0 -0
  52. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/commit-policy.md +0 -0
  53. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/commit-quality.md +0 -0
  54. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/configuration.md +0 -0
  55. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/contributing.md +0 -0
  56. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/examples/test-planning/django-ray.toml +0 -0
  57. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/examples/test-planning/polyglot.toml +0 -0
  58. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/experiments/django-ray-full-shadow-result.json +0 -0
  59. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/experiments/django-ray-shadow-replay/cohort.json +0 -0
  60. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/experiments/django-ray-shadow-replay/observations-01.json +0 -0
  61. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/experiments/django-ray-shadow-replay/observations-02.json +0 -0
  62. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/experiments/django-ray-shadow-replay/observations-03.json +0 -0
  63. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/experiments/django-ray-shadow-replay/observations-04.json +0 -0
  64. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/experiments/django-ray-shadow-replay/observations-05.json +0 -0
  65. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/experiments/django-ray-shadow-replay/observations-06.json +0 -0
  66. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/experiments/django-ray-shadow-replay/report.json +0 -0
  67. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/experiments/django-ray-shadow-replay.md +0 -0
  68. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/staged-checks.md +0 -0
  69. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/designs/test-planning.md +0 -0
  70. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/github-actions.md +0 -0
  71. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/github-review-adapter.md +0 -0
  72. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/index.md +0 -0
  73. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/install.ps1 +0 -0
  74. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/install.sh +0 -0
  75. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/mode-policy.md +0 -0
  76. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/path-policy.md +0 -0
  77. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/pull-request-descriptions.md +0 -0
  78. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/recipes.md +0 -0
  79. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/repository-checks.md +0 -0
  80. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/repository-plans.md +0 -0
  81. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/security.md +0 -0
  82. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/size-policy.md +0 -0
  83. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/stylesheets/extra.css +0 -0
  84. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/test-planning-handoff.md +0 -0
  85. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/test-planning.md +0 -0
  86. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/tree-policy.md +0 -0
  87. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/troubleshooting.md +0 -0
  88. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/usage.md +0 -0
  89. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/docs/workflow-checks.md +0 -0
  90. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/examples/agent-review-policy.toml +0 -0
  91. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/examples/agent-review-results.json +0 -0
  92. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/examples/agent-review.yml +0 -0
  93. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/examples/commit-policy.yml +0 -0
  94. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/examples/description-policy.toml +0 -0
  95. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/examples/pull-request-template.md +0 -0
  96. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/examples/review-policy.yml +0 -0
  97. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/examples/test-planning/fixed_handoff.py +0 -0
  98. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/examples/test-planning/replay_django_ray.py +0 -0
  99. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/overrides/404.html +0 -0
  100. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/scripts/check_description.py +0 -0
  101. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/scripts/check_docs.py +0 -0
  102. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/scripts/check_minimum_runtime.py +0 -0
  103. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/scripts/check_release.py +0 -0
  104. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/scripts/composite_smoke_python +0 -0
  105. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/scripts/prepare_commit_action_control.py +0 -0
  106. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/__init__.py +0 -0
  107. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/__main__.py +0 -0
  108. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/_update_worker.py +0 -0
  109. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/action.py +0 -0
  110. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/action_cli.py +0 -0
  111. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/__init__.py +0 -0
  112. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/evaluation.py +0 -0
  113. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/__init__.py +0 -0
  114. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/boundary.py +0 -0
  115. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/candidate.py +0 -0
  116. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/constants.py +0 -0
  117. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/events.py +0 -0
  118. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/evidence.py +0 -0
  119. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/gate.py +0 -0
  120. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/publication.py +0 -0
  121. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/requests.py +0 -0
  122. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/runs.py +0 -0
  123. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/github/runtime.py +0 -0
  124. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/plan.py +0 -0
  125. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/policy.py +0 -0
  126. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/results.py +0 -0
  127. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/agent_review/runtime.py +0 -0
  128. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/branches/__init__.py +0 -0
  129. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/branches/checker.py +0 -0
  130. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/branches/models.py +0 -0
  131. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/branches/patterns.py +0 -0
  132. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/branches/policy.py +0 -0
  133. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/branches/reporting.py +0 -0
  134. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/branches/service.py +0 -0
  135. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/changes/__init__.py +0 -0
  136. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/changes/checker.py +0 -0
  137. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/changes/git.py +0 -0
  138. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/changes/models.py +0 -0
  139. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/changes/patterns.py +0 -0
  140. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/changes/policy.py +0 -0
  141. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/changes/reporting.py +0 -0
  142. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/changes/service.py +0 -0
  143. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/cli.py +0 -0
  144. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/__init__.py +0 -0
  145. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/branch.py +0 -0
  146. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/change.py +0 -0
  147. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/commit.py +0 -0
  148. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/config.py +0 -0
  149. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/gate.py +0 -0
  150. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/github.py +0 -0
  151. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/mode.py +0 -0
  152. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/path.py +0 -0
  153. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/pull_request.py +0 -0
  154. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/repo.py +0 -0
  155. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/self_manage.py +0 -0
  156. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/size.py +0 -0
  157. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/test.py +0 -0
  158. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/tree.py +0 -0
  159. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commands/workflow.py +0 -0
  160. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commit_action_cli.py +0 -0
  161. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commit_action_runtime.py +0 -0
  162. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/__init__.py +0 -0
  163. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/checker.py +0 -0
  164. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/config.py +0 -0
  165. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/config_explain.py +0 -0
  166. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/config_init.py +0 -0
  167. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/content_policy.py +0 -0
  168. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/dependabot.py +0 -0
  169. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/git.py +0 -0
  170. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/github_event.py +0 -0
  171. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/github_reporting.py +0 -0
  172. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/github_signature.py +0 -0
  173. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/models.py +0 -0
  174. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/parser.py +0 -0
  175. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/policy.py +0 -0
  176. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/quality.py +0 -0
  177. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/reporting.py +0 -0
  178. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/service.py +0 -0
  179. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/severity.py +0 -0
  180. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/sources.py +0 -0
  181. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/template.py +0 -0
  182. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/trusted_policy.py +0 -0
  183. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/commits/typos.py +0 -0
  184. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/config_scope.py +0 -0
  185. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/descriptions/__init__.py +0 -0
  186. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/descriptions/checker.py +0 -0
  187. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/descriptions/github.py +0 -0
  188. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/descriptions/hygiene.py +0 -0
  189. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/descriptions/markdown.py +0 -0
  190. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/descriptions/models.py +0 -0
  191. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/descriptions/policy.py +0 -0
  192. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/descriptions/reporting.py +0 -0
  193. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/descriptions/service.py +0 -0
  194. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/descriptions/sources.py +0 -0
  195. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/errors.py +0 -0
  196. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/files.py +0 -0
  197. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/git/__init__.py +0 -0
  198. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/git/changes.py +0 -0
  199. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/git/process.py +0 -0
  200. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/git/runtime.py +0 -0
  201. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/git/tree.py +0 -0
  202. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/github.py +0 -0
  203. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/models.py +0 -0
  204. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/modes/__init__.py +0 -0
  205. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/modes/checker.py +0 -0
  206. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/modes/git.py +0 -0
  207. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/modes/models.py +0 -0
  208. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/modes/patterns.py +0 -0
  209. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/modes/policy.py +0 -0
  210. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/modes/reporting.py +0 -0
  211. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/modes/service.py +0 -0
  212. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/path_patterns.py +0 -0
  213. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/paths/__init__.py +0 -0
  214. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/paths/checker.py +0 -0
  215. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/paths/git.py +0 -0
  216. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/paths/models.py +0 -0
  217. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/paths/policy.py +0 -0
  218. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/paths/reporting.py +0 -0
  219. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/paths/service.py +0 -0
  220. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/repository/__init__.py +0 -0
  221. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/repository/checker.py +0 -0
  222. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/repository/models.py +0 -0
  223. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/repository/plan.py +0 -0
  224. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/repository/reporting.py +0 -0
  225. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/self_update.py +0 -0
  226. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/sizes/__init__.py +0 -0
  227. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/sizes/checker.py +0 -0
  228. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/sizes/git.py +0 -0
  229. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/sizes/models.py +0 -0
  230. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/sizes/patterns.py +0 -0
  231. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/sizes/policy.py +0 -0
  232. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/sizes/reporting.py +0 -0
  233. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/sizes/service.py +0 -0
  234. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/status.py +0 -0
  235. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/__init__.py +0 -0
  236. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/diagnostics.py +0 -0
  237. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/evaluation.py +0 -0
  238. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/evaluation_service.py +0 -0
  239. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/git.py +0 -0
  240. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/handoff.py +0 -0
  241. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/limits.py +0 -0
  242. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/models.py +0 -0
  243. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/planner.py +0 -0
  244. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/policy.py +0 -0
  245. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/reporting.py +0 -0
  246. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/reports.py +0 -0
  247. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/results.py +0 -0
  248. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/selection.py +0 -0
  249. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/service.py +0 -0
  250. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/test_planning/source.py +0 -0
  251. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/trees/__init__.py +0 -0
  252. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/trees/checker.py +0 -0
  253. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/trees/git.py +0 -0
  254. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/trees/models.py +0 -0
  255. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/trees/patterns.py +0 -0
  256. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/trees/policy.py +0 -0
  257. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/trees/reporting.py +0 -0
  258. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/trees/service.py +0 -0
  259. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/__init__.py +0 -0
  260. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/actionlint_runtime.py +0 -0
  261. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/actionlint_snapshot.py +0 -0
  262. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/checker.py +0 -0
  263. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/inputs.py +0 -0
  264. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/lint.py +0 -0
  265. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/models.py +0 -0
  266. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/parser.py +0 -0
  267. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/references.py +0 -0
  268. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/reporting.py +0 -0
  269. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/security.py +0 -0
  270. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/security_facts.py +0 -0
  271. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/security_models.py +0 -0
  272. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/security_reporting.py +0 -0
  273. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/security_rules.py +0 -0
  274. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/src/yaga/workflows/yaml.py +0 -0
  275. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/__init__.py +0 -0
  276. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/codex_support.py +0 -0
  277. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/fixtures/commit_consumer_parity.json +0 -0
  278. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/fixtures/github-signatures/.gitattributes +0 -0
  279. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/fixtures/github-signatures/.typos.toml +0 -0
  280. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/fixtures/github-signatures/README.md +0 -0
  281. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/fixtures/github-signatures/dependabot-setup-uv.commit +0 -0
  282. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/fixtures/github-signatures/dependabot-urllib3-parent.commit +0 -0
  283. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/fixtures/github-signatures/dependabot-urllib3.commit +0 -0
  284. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/fixtures/github-signatures/web-flow.asc +0 -0
  285. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_action.py +0 -0
  286. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_agent_review_cli.py +0 -0
  287. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_agent_review_evaluation.py +0 -0
  288. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_agent_review_plan.py +0 -0
  289. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_agent_review_policy.py +0 -0
  290. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_agent_review_results.py +0 -0
  291. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_branch_checker.py +0 -0
  292. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_branch_cli.py +0 -0
  293. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_branch_models.py +0 -0
  294. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_branch_patterns.py +0 -0
  295. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_branch_policy.py +0 -0
  296. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_branch_reporting.py +0 -0
  297. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_branch_service.py +0 -0
  298. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_build_git_isolation.py +0 -0
  299. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_change_checker.py +0 -0
  300. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_change_cli.py +0 -0
  301. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_change_git.py +0 -0
  302. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_change_patterns.py +0 -0
  303. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_change_policy.py +0 -0
  304. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_change_reporting.py +0 -0
  305. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_codex_events.py +0 -0
  306. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_codex_evidence.py +0 -0
  307. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_codex_evidence_literals.py +0 -0
  308. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_codex_gate.py +0 -0
  309. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_codex_publication.py +0 -0
  310. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_codex_requests.py +0 -0
  311. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_codex_runs.py +0 -0
  312. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_codex_runtime.py +0 -0
  313. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_command_guide.py +0 -0
  314. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_action.py +0 -0
  315. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_action_controls.py +0 -0
  316. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_body_customization.py +0 -0
  317. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_checker.py +0 -0
  318. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_config.py +0 -0
  319. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_consumer_policy.py +0 -0
  320. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_content_policy.py +0 -0
  321. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_explicit_inputs.py +0 -0
  322. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_git.py +0 -0
  323. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_parser.py +0 -0
  324. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_quality.py +0 -0
  325. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_quality_workflow.py +0 -0
  326. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_reporting.py +0 -0
  327. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_service.py +0 -0
  328. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_sources.py +0 -0
  329. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_template.py +0 -0
  330. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_trusted_policy.py +0 -0
  331. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_typos.py +0 -0
  332. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_commit_warnings.py +0 -0
  333. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_config_init.py +0 -0
  334. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_config_workflows.py +0 -0
  335. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_consumer_policy_entrypoints.py +0 -0
  336. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_dependabot_commit_filter.py +0 -0
  337. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_description.py +0 -0
  338. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_description_checker.py +0 -0
  339. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_description_cli.py +0 -0
  340. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_description_github.py +0 -0
  341. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_description_hygiene.py +0 -0
  342. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_description_markdown.py +0 -0
  343. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_description_policy.py +0 -0
  344. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_description_remote_cli.py +0 -0
  345. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_description_sources.py +0 -0
  346. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_description_structure.py +0 -0
  347. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_docs_links.py +0 -0
  348. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_files.py +0 -0
  349. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_git_tree.py +0 -0
  350. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_github.py +0 -0
  351. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_github_commit_signature.py +0 -0
  352. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_github_pull_request.py +0 -0
  353. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_github_reporting.py +0 -0
  354. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_installers.py +0 -0
  355. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_minimum_runtime.py +0 -0
  356. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_mode_checker.py +0 -0
  357. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_mode_cli.py +0 -0
  358. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_mode_git.py +0 -0
  359. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_mode_models.py +0 -0
  360. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_mode_patterns.py +0 -0
  361. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_mode_policy.py +0 -0
  362. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_mode_reporting.py +0 -0
  363. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_mode_service.py +0 -0
  364. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_models.py +0 -0
  365. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_path_checker.py +0 -0
  366. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_path_cli.py +0 -0
  367. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_path_git.py +0 -0
  368. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_path_models.py +0 -0
  369. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_path_patterns.py +0 -0
  370. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_path_policy.py +0 -0
  371. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_path_reporting.py +0 -0
  372. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_path_service.py +0 -0
  373. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_plain_messages.py +0 -0
  374. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_pr_proposed_message.py +0 -0
  375. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_regular_file_prefix.py +0 -0
  376. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_release.py +0 -0
  377. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_repo_cli.py +0 -0
  378. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_repository_checker.py +0 -0
  379. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_repository_contract.py +0 -0
  380. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_repository_models.py +0 -0
  381. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_repository_plan.py +0 -0
  382. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_repository_reporting.py +0 -0
  383. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_size_checker.py +0 -0
  384. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_size_cli.py +0 -0
  385. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_size_git.py +0 -0
  386. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_size_models.py +0 -0
  387. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_size_patterns.py +0 -0
  388. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_size_policy.py +0 -0
  389. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_size_reporting.py +0 -0
  390. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_size_service.py +0 -0
  391. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_status.py +0 -0
  392. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_cli.py +0 -0
  393. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_diagnostics.py +0 -0
  394. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_evaluate_cli.py +0 -0
  395. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_evaluation.py +0 -0
  396. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_examples.py +0 -0
  397. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_git.py +0 -0
  398. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_handoff.py +0 -0
  399. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_handoff_example.py +0 -0
  400. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_planner.py +0 -0
  401. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_policy.py +0 -0
  402. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_replay.py +0 -0
  403. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_reporting.py +0 -0
  404. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_test_planning_results.py +0 -0
  405. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_tree_checker.py +0 -0
  406. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_tree_cli.py +0 -0
  407. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_tree_git.py +0 -0
  408. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_tree_models.py +0 -0
  409. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_tree_patterns.py +0 -0
  410. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_tree_policy.py +0 -0
  411. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_tree_reporting.py +0 -0
  412. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_tree_service.py +0 -0
  413. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_checker.py +0 -0
  414. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_inputs.py +0 -0
  415. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_lint.py +0 -0
  416. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_lint_hardening.py +0 -0
  417. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_lint_reporting.py +0 -0
  418. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_provider_inputs.py +0 -0
  419. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_references.py +0 -0
  420. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_reporting.py +0 -0
  421. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_security_cli.py +0 -0
  422. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_security_facts.py +0 -0
  423. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_security_models.py +0 -0
  424. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_security_reporting.py +0 -0
  425. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_security_rules.py +0 -0
  426. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_security_selection.py +0 -0
  427. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_security_service.py +0 -0
  428. {yaga_cli-0.4.0 → yaga_cli-0.4.1}/tests/test_workflow_yaml.py +0 -0
  429. {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
- timeout-minutes: 10
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:
@@ -2,6 +2,8 @@ __pycache__/
2
2
  .pytest_cache/
3
3
  .ruff_cache/
4
4
  .venv/
5
+ .artifacts/
6
+ .cache/
5
7
  *.py[cod]
6
8
  .coverage
7
9
  *.egg-info/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: yaga-cli
3
- Version: 0.4.0
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.0 (Beta)**. YAGA requires Python 3.12 or newer. Install the **`yaga-cli`** distribution from PyPI;
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. Merge the release changes and require all hosted CI lanes to pass for the exact commit,
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
- 3. After publication is explicitly authorized, create and push the matching `v0.1.0` tag at that
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
- 4. The workflow requires the tagged commit to be on the default branch, checks that the tag matches
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
- 5. Verify the PyPI project files and install `yaga-cli==0.1.0` from PyPI in a clean tool environment.
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.0"
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.0"
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.0"
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
- "time.sleep(1.0); "
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
- elapsed = time.monotonic() - before
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 elapsed < 2.0
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.0", ">0.0.9, <1.0.0", "!=2.0.0"])
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.0", "<0.1.0", ">=1.0.0", "!=0.4.0"])
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 'EXPECTED_REQUIRES_DIST = ["pyyaml<7,>=6.0.3", "typer<1,>=0.27.2"]' in build_gate
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
- def test_wheel_metadata_must_advertise_the_locked_runtime() -> None:
342
- valid = (
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.0"
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" },
@@ -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