hyperi-ci 2.7.2__tar.gz → 2.8.0__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 (291) hide show
  1. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/.github/actions/predict-version/action.yml +30 -2
  2. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/.github/actions/setup-runtime/action.yml +1 -1
  3. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/.github/workflows/_release-tail.yml +22 -16
  4. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/.github/workflows/ci.yml +30 -9
  5. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/.github/workflows/go-ci.yml +47 -16
  6. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/.github/workflows/python-ci.yml +40 -11
  7. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/.github/workflows/rust-ci.yml +47 -17
  8. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/.github/workflows/ts-ci.yml +40 -11
  9. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/.hyperi-ci.yaml +4 -0
  10. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/PKG-INFO +14 -1
  11. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/README.md +13 -0
  12. hyperi_ci-2.8.0/VERSION +1 -0
  13. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/config/versions.yaml +13 -13
  14. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/ARCHITECTURE.md +19 -4
  15. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/DESIGN.md +1 -0
  16. hyperi_ci-2.8.0/docs/quality-gate.md +142 -0
  17. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/scripts/update-versions.py +58 -94
  18. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/argocd/stage.py +6 -15
  19. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/cli.py +25 -4
  20. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/config/defaults.yaml +1 -4
  21. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/container/build.py +26 -14
  22. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/container/stage.py +57 -48
  23. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/dispatch.py +8 -1
  24. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/helm/stage.py +6 -15
  25. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/golang/quality.py +10 -13
  26. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/python/quality.py +14 -16
  27. hyperi_ci-2.8.0/src/hyperi_ci/languages/quality_common.py +131 -0
  28. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/rust/quality.py +10 -13
  29. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/typescript/quality.py +10 -11
  30. hyperi_ci-2.8.0/src/hyperi_ci/publish_mode.py +119 -0
  31. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/quality/commit_validation.py +1 -1
  32. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/quality/gitleaks.py +3 -0
  33. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/quality/predicted_bump.py +2 -1
  34. hyperi_ci-2.8.0/src/hyperi_ci/quality/semgrep.py +98 -0
  35. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/watch.py +45 -0
  36. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_container_build.py +47 -3
  37. hyperi_ci-2.8.0/tests/unit/test_publish_mode.py +139 -0
  38. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_push.py +4 -0
  39. hyperi_ci-2.8.0/tests/unit/test_quality_strict.py +134 -0
  40. hyperi_ci-2.8.0/tests/unit/test_semgrep.py +71 -0
  41. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_typescript_quality.py +7 -6
  42. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_update_versions.py +40 -0
  43. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_watch.py +94 -0
  44. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_workflow_consistency.py +133 -0
  45. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/uv.lock +3 -3
  46. hyperi_ci-2.7.2/VERSION +0 -1
  47. hyperi_ci-2.7.2/src/hyperi_ci/languages/quality_common.py +0 -48
  48. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/.gitattributes +0 -0
  49. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/.github/actions/setup-osv-scanner/action.yml +0 -0
  50. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/.github/actions/setup-semantic-release/action.yml +0 -0
  51. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/.github/actions/setup-semantic-release/default.releaserc.json +0 -0
  52. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/.gitignore +0 -0
  53. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/.releaserc.yaml +0 -0
  54. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/AI-TRAINING-POLICY.md +0 -0
  55. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/CHANGELOG.md +0 -0
  56. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/COMMERCIAL.md +0 -0
  57. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/CONTRIBUTING.md +0 -0
  58. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/LICENSE +0 -0
  59. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/SECURITY.md +0 -0
  60. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/config/commit-types.yaml +0 -0
  61. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/config/org.yaml +0 -0
  62. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/config/runners.yaml +0 -0
  63. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/config/secrets-access.yaml +0 -0
  64. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/ARC-RUNNERS.md +0 -0
  65. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/CI-LESSONS.md +0 -0
  66. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/FLOW.md +0 -0
  67. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/JFROG-MIGRATION.md +0 -0
  68. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/LESSONS.md +0 -0
  69. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/MIGRATION-GUIDE.md +0 -0
  70. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/PGO-WORKLOAD-GUIDE.md +0 -0
  71. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/README.md +0 -0
  72. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/dependencies/DEPS-PINNING.md +0 -0
  73. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/dependencies/WORKFLOW-PINNING.md +0 -0
  74. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/deployment/CONTRACT-IDENTITY.md +0 -0
  75. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/deployment/CONTRACT.md +0 -0
  76. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/deployment/TIERS.md +0 -0
  77. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/deployment-contract.md +0 -0
  78. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/languages/GO.md +0 -0
  79. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/languages/PYTHON.md +0 -0
  80. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/languages/RUST.md +0 -0
  81. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/languages/TYPESCRIPT.md +0 -0
  82. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/migration/CODEBERG-SECRETS-AND-CI.md +0 -0
  83. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/migration/JFROG.md +0 -0
  84. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/migration/ONBOARDING.md +0 -0
  85. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/migration/codeberg-secrets-and-ci.md +0 -0
  86. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/migration/codeberg.md +0 -0
  87. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/migration/deployment-contract-tier3.md +0 -0
  88. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/runtime/PGO-BOLT.md +0 -0
  89. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/runtime/RUNNERS.md +0 -0
  90. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/runtime/TESTENV.md +0 -0
  91. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/rust.md +0 -0
  92. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/docs/typescript.md +0 -0
  93. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/pyproject.toml +0 -0
  94. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/renovate.json +0 -0
  95. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/robots.txt +0 -0
  96. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/scripts/check-workflow-interfaces.py +0 -0
  97. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/scripts/pre-commit-versions.sh +0 -0
  98. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/scripts/recover-tags.py +0 -0
  99. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/scripts/setup-rust-dev.py +0 -0
  100. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/scripts/sync-secrets-access.py +0 -0
  101. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/__init__.py +0 -0
  102. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/argocd/__init__.py +0 -0
  103. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/argocd/gitops_push.py +0 -0
  104. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/common.py +0 -0
  105. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/config/native-deps/golang.yaml +0 -0
  106. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/config/native-deps/python.yaml +0 -0
  107. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/config/native-deps/rust.yaml +0 -0
  108. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/config/native-deps/typescript.yaml +0 -0
  109. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/config/org.yaml +0 -0
  110. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/config/toolchains/gcc.yaml +0 -0
  111. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/config/toolchains/llvm.yaml +0 -0
  112. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/config.py +0 -0
  113. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/container/__init__.py +0 -0
  114. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/container/binary_stage.py +0 -0
  115. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/container/compose.py +0 -0
  116. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/container/detect.py +0 -0
  117. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/container/labels.py +0 -0
  118. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/container/manifest.py +0 -0
  119. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/container/registry.py +0 -0
  120. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/container/templates.py +0 -0
  121. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/deployment/__init__.py +0 -0
  122. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/deployment/cli.py +0 -0
  123. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/deployment/contract.py +0 -0
  124. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/deployment/detect.py +0 -0
  125. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/deployment/overlay/__init__.py +0 -0
  126. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/deployment/overlay/anchors/__init__.py +0 -0
  127. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/deployment/overlay/anchors/argocd.py +0 -0
  128. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/deployment/overlay/anchors/dockerfile.py +0 -0
  129. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/deployment/overlay/anchors/helm.py +0 -0
  130. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/deployment/overlay/cli.py +0 -0
  131. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/deployment/overlay/errors.py +0 -0
  132. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/deployment/overlay/model.py +0 -0
  133. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/deployment/overlay/render.py +0 -0
  134. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/deployment/registry.py +0 -0
  135. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/deployment/scaffold.py +0 -0
  136. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/deployment/stage.py +0 -0
  137. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/deployment/topology/__init__.py +0 -0
  138. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/deployment/topology/resolve.py +0 -0
  139. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/deployment/topology/stitch.py +0 -0
  140. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/detect.py +0 -0
  141. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gh.py +0 -0
  142. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/.gitbook.yaml +0 -0
  143. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/.gitignore +0 -0
  144. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/CODEOWNERS +0 -0
  145. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/LICENSE +0 -0
  146. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/README.md +0 -0
  147. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/argocd/README.md +0 -0
  148. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/argocd/applicationsets/.gitkeep +0 -0
  149. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/argocd/appprojects/.gitkeep +0 -0
  150. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/argocd/bootstrap/.gitkeep +0 -0
  151. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/docs/concepts/architecture.md +0 -0
  152. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/docs/concepts/overview.md +0 -0
  153. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/docs/how-to/add-app.md +0 -0
  154. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/docs/how-to/add-environment.md +0 -0
  155. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/docs/how-to/add-topology.md +0 -0
  156. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/docs/index.md +0 -0
  157. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/docs/operations/disaster-recovery.md +0 -0
  158. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/docs/operations/rollback.md +0 -0
  159. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/docs/quickstart.md +0 -0
  160. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/docs/reference/sync-waves.md +0 -0
  161. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/docs/reference/topology-schema.md +0 -0
  162. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/mkdocs.yml +0 -0
  163. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/pull_request_template.md +0 -0
  164. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/terraform/README.md +0 -0
  165. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/terraform/aws/environments/.gitkeep +0 -0
  166. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/terraform/aws/modules/.gitkeep +0 -0
  167. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/terraform/rancher/clusters/.gitkeep +0 -0
  168. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/terraform/rancher/modules/.gitkeep +0 -0
  169. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/topologies/README.md +0 -0
  170. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/values/.gitkeep +0 -0
  171. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/workflows/docs.yaml +0 -0
  172. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/workflows/stitch-and-publish.yaml +0 -0
  173. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/gitops_templates/workflows/validate.yaml +0 -0
  174. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/helm/__init__.py +0 -0
  175. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/init.py +0 -0
  176. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/init_gitops.py +0 -0
  177. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/install_deps.py +0 -0
  178. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/__init__.py +0 -0
  179. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/_build_common.py +0 -0
  180. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/golang/__init__.py +0 -0
  181. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/golang/build.py +0 -0
  182. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/golang/publish.py +0 -0
  183. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/golang/test.py +0 -0
  184. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/python/__init__.py +0 -0
  185. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/python/build.py +0 -0
  186. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/python/publish.py +0 -0
  187. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/python/test.py +0 -0
  188. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/rust/__init__.py +0 -0
  189. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/rust/build.py +0 -0
  190. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/rust/optimize.py +0 -0
  191. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/rust/pgo.py +0 -0
  192. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/rust/publish.py +0 -0
  193. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/rust/test.py +0 -0
  194. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/typescript/__init__.py +0 -0
  195. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/typescript/_common.py +0 -0
  196. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/typescript/build.py +0 -0
  197. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/typescript/install_deps.py +0 -0
  198. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/typescript/publish.py +0 -0
  199. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/languages/typescript/test.py +0 -0
  200. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/licenses.py +0 -0
  201. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/logs.py +0 -0
  202. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/migrate.py +0 -0
  203. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/native_deps.py +0 -0
  204. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/publish/__init__.py +0 -0
  205. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/publish/binaries.py +0 -0
  206. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/publish/dispatch.py +0 -0
  207. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/publish_binaries.py +0 -0
  208. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/push.py +0 -0
  209. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/quality/__init__.py +0 -0
  210. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/quality/ignores.py +0 -0
  211. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/quality/osv_scanner.py +0 -0
  212. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/release.py +0 -0
  213. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/stamp.py +0 -0
  214. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/trigger.py +0 -0
  215. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/src/hyperi_ci/upgrade.py +0 -0
  216. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/templates/pgo-workload/README.md +0 -0
  217. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/templates/pgo-workload/grpc-server.sh +0 -0
  218. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/templates/pgo-workload/http-server.sh +0 -0
  219. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/templates/pgo-workload/kafka-consumer.sh +0 -0
  220. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/templates/pgo-workload/kafka-producer.sh +0 -0
  221. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/templates/pgo-workload/multi-protocol.sh +0 -0
  222. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/templates/testenv/README.md +0 -0
  223. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/templates/testenv/clickhouse-low-mem.xml +0 -0
  224. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/templates/testenv/clickhouse.compose.yaml +0 -0
  225. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/templates/testenv/redpanda.compose.yaml +0 -0
  226. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/__init__.py +0 -0
  227. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/argocd/__init__.py +0 -0
  228. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/argocd/test_gitops_push.py +0 -0
  229. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/argocd/test_stage.py +0 -0
  230. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/deployment/__init__.py +0 -0
  231. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/deployment/overlay/__init__.py +0 -0
  232. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/deployment/overlay/test_argocd_anchors.py +0 -0
  233. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/deployment/overlay/test_cli.py +0 -0
  234. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/deployment/overlay/test_dockerfile_anchors.py +0 -0
  235. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/deployment/overlay/test_helm_anchors.py +0 -0
  236. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/deployment/overlay/test_model.py +0 -0
  237. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/deployment/topology/__init__.py +0 -0
  238. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/deployment/topology/test_resolve.py +0 -0
  239. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/deployment/topology/test_stitch.py +0 -0
  240. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/helm/__init__.py +0 -0
  241. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/helm/test_stage.py +0 -0
  242. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/helm/test_stage_topology_mode.py +0 -0
  243. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/integration/__init__.py +0 -0
  244. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/integration/test_rust_build_optimize.py +0 -0
  245. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/__init__.py +0 -0
  246. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/deployment/__init__.py +0 -0
  247. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/deployment/test_contract.py +0 -0
  248. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/deployment/test_detect_tier.py +0 -0
  249. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/deployment/test_emit_artefacts_cli.py +0 -0
  250. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/deployment/test_registry_cascade.py +0 -0
  251. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/deployment/test_scaffold.py +0 -0
  252. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/deployment/test_stage.py +0 -0
  253. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_build_common.py +0 -0
  254. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_cli.py +0 -0
  255. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_cli_init_gitops.py +0 -0
  256. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_cli_stitch.py +0 -0
  257. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_commit_validation.py +0 -0
  258. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_common.py +0 -0
  259. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_config.py +0 -0
  260. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_container_binary_stage.py +0 -0
  261. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_container_compose.py +0 -0
  262. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_container_detect.py +0 -0
  263. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_container_labels.py +0 -0
  264. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_container_manifest.py +0 -0
  265. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_container_registry.py +0 -0
  266. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_container_stage.py +0 -0
  267. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_container_templates.py +0 -0
  268. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_detect.py +0 -0
  269. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_dispatch_alias.py +0 -0
  270. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_dispatch_status.py +0 -0
  271. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_gh.py +0 -0
  272. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_init.py +0 -0
  273. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_init_gitops.py +0 -0
  274. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_init_topology.py +0 -0
  275. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_licenses.py +0 -0
  276. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_migrate.py +0 -0
  277. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_native_deps.py +0 -0
  278. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_osv_scanner.py +0 -0
  279. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_predicted_bump.py +0 -0
  280. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_publish.py +0 -0
  281. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_publish_dispatch.py +0 -0
  282. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_quality_ignore_wiring.py +0 -0
  283. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_quality_ignores.py +0 -0
  284. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_recover_tags.py +0 -0
  285. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_release_version.py +0 -0
  286. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_rust_optimize.py +0 -0
  287. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_rust_pgo.py +0 -0
  288. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_rust_quality.py +0 -0
  289. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_stamp.py +0 -0
  290. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_upgrade.py +0 -0
  291. {hyperi_ci-2.7.2 → hyperi_ci-2.8.0}/tests/unit/test_workflow_interfaces.py +0 -0
@@ -29,6 +29,10 @@ inputs:
29
29
  description: "Version resolution for from-head: auto (semantic-release picks) | patch | minor (forced)"
30
30
  required: false
31
31
  default: "auto"
32
+ branch-build:
33
+ description: "'true' to run build + container on pull_request events (branch-mode: PRs validate the full pipeline; whether the container also pushes a dev image is the separate publish.container.dev_push opt-in in .hyperi-ci.yaml)"
34
+ required: false
35
+ default: ""
32
36
 
33
37
  outputs:
34
38
  will-publish:
@@ -63,7 +67,22 @@ runs:
63
67
  exit 0
64
68
  fi
65
69
 
66
- # push event match Publish: true trailer (case-insensitive on key)
70
+ # Publish only ever happens from main (branch-mode decision 1:
71
+ # branches validate, main is the sole publish path). Stated HERE,
72
+ # at the gate SSOT, rather than relying on downstream job `if:`
73
+ # conditions to catch a trailer on a branch. A trailer on a
74
+ # non-main ref is ignored LOUDLY, never silently.
75
+ if [[ "${{ github.ref }}" != "refs/heads/main" ]]; then
76
+ echo "will-publish=false" >> "$GITHUB_OUTPUT"
77
+ msg=$(git log -1 --format=%B HEAD)
78
+ if printf '%s' "$msg" | grep -qiE '^[[:space:]]*Publish:[[:space:]]*true[[:space:]]*$'; then
79
+ echo "::warning::'Publish: true' trailer on non-main ref '${{ github.ref }}' — ignored. Publishing only happens from main; merge first."
80
+ fi
81
+ echo "Non-main ref — validate-only run (no tag, no publish)"
82
+ exit 0
83
+ fi
84
+
85
+ # push to main — match Publish: true trailer (case-insensitive on key)
67
86
  msg=$(git log -1 --format=%B HEAD)
68
87
  if printf '%s' "$msg" | grep -qiE '^[[:space:]]*Publish:[[:space:]]*true[[:space:]]*$'; then
69
88
  echo "will-publish=true" >> "$GITHUB_OUTPUT"
@@ -215,9 +234,18 @@ runs:
215
234
  set -euo pipefail
216
235
  will_publish='${{ steps.gate.outputs.will-publish }}'
217
236
  event_name='${{ github.event_name }}'
237
+ branch_build='${{ inputs.branch-build }}'
218
238
 
239
+ # run-build: publish runs always; an opted-in pull_request also
240
+ # builds (branch-mode decision 2 — PRs validate the FULL pipeline
241
+ # incl. container; whether that container is pushed as a dev
242
+ # image is the container stage's own dev_push decision). Raw
243
+ # branch pushes never build — the gate doctrine (non-shipping
244
+ # commits compile nothing) is unchanged.
219
245
  if [[ "$will_publish" == "true" ]]; then
220
246
  run_build=true
247
+ elif [[ "$event_name" == "pull_request" && "$branch_build" == "true" ]]; then
248
+ run_build=true
221
249
  else
222
250
  run_build=false
223
251
  fi
@@ -230,4 +258,4 @@ runs:
230
258
 
231
259
  echo "run-build=$run_build" >> "$GITHUB_OUTPUT"
232
260
  echo "run-checks=$run_checks" >> "$GITHUB_OUTPUT"
233
- echo "::notice::run-checks=$run_checks run-build=$run_build (will-publish=$will_publish event=$event_name)"
261
+ echo "::notice::run-checks=$run_checks run-build=$run_build (will-publish=$will_publish event=$event_name branch-build=$branch_build)"
@@ -40,7 +40,7 @@ runs:
40
40
  steps:
41
41
  - name: Install uv
42
42
  if: ${{ !contains(runner.name, 'arc-runner') }}
43
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
43
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
44
44
  with:
45
45
  enable-cache: ${{ inputs.enable-uv-cache }}
46
46
 
@@ -85,9 +85,10 @@ env:
85
85
  jobs:
86
86
  container:
87
87
  name: Container
88
- # Branch / PR pushes never reach this workflow (caller gates on
89
- # quality+test+build pre-needs). Pushes to main and
90
- # workflow_dispatch always reach here:
88
+ # Raw branch pushes never reach this workflow (caller gates on
89
+ # quality+test+build pre-needs). Pushes to main, workflow_dispatch,
90
+ # and branch-mode pull_request runs (caller's branch-build opt-in)
91
+ # reach here:
91
92
  #
92
93
  # - Validate-only (push to main, will-publish == 'false'):
93
94
  # docker build runs to catch Dockerfile breakages, but no push
@@ -95,20 +96,25 @@ jobs:
95
96
  # BEFORE we ever try to publish from it.
96
97
  # - Publish (will-publish == 'true'): docker build + push to all
97
98
  # configured registries.
99
+ # - pull_request (branch-mode): docker build; pushed as a DEV image
100
+ # (branch-<slug> + sha tags, GHCR only) iff the project sets
101
+ # publish.container.dev_push — else validate-only. Fork PRs are
102
+ # excluded outright (first clause; no secrets, no pushes).
98
103
  #
99
- # The push-vs-validate decision lives in container/stage.py keyed
100
- # off HYPERCI_PUBLISH_MODE set when will-publish is true.
104
+ # The publish/dev/validate decision lives in hyperi_ci.publish_mode
105
+ # (the SSOT), keyed off HYPERCI_PUBLISH_MODE + the event context.
101
106
  if: |
102
107
  github.event.pull_request.head.repo.fork != true && (
103
108
  (github.event_name == 'push' && github.ref == 'refs/heads/main') ||
104
- github.event_name == 'workflow_dispatch'
109
+ github.event_name == 'workflow_dispatch' ||
110
+ github.event_name == 'pull_request'
105
111
  )
106
112
  runs-on: ubuntu-latest
107
113
  permissions:
108
114
  contents: read
109
115
  packages: write
110
116
  steps:
111
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
117
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
112
118
  with:
113
119
  ref: ${{ inputs.tag || github.ref }}
114
120
 
@@ -121,7 +127,7 @@ jobs:
121
127
  - name: Install uv
122
128
  # Needed to run the resolve step below. Cheap, no Docker Hub —
123
129
  # so a library never pays the Buildx/Docker-Hub cost (issue #33).
124
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
130
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
125
131
  with:
126
132
  enable-cache: false
127
133
 
@@ -142,7 +148,7 @@ jobs:
142
148
  # anonymous rate limits when the Dockerfile pulls a Hub base
143
149
  # image. Conditional on the org var being set; no-op otherwise.
144
150
  if: steps.resolve.outputs.build == 'true' && vars.DOCKERHUB_USERNAME != ''
145
- uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
151
+ uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
146
152
  with:
147
153
  username: ${{ secrets.DOCKERHUB_USERNAME }}
148
154
  password: ${{ secrets.DOCKERHUB_TOKEN }}
@@ -151,7 +157,7 @@ jobs:
151
157
  # GITHUB_TOKEN via job-level packages:write permission — can create
152
158
  # new repo-owned packages on first push.
153
159
  if: steps.resolve.outputs.build == 'true'
154
- uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
160
+ uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
155
161
  with:
156
162
  registry: ghcr.io
157
163
  username: ${{ github.actor }}
@@ -159,7 +165,7 @@ jobs:
159
165
 
160
166
  - name: Set up Docker Buildx
161
167
  if: steps.resolve.outputs.build == 'true'
162
- uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
168
+ uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
163
169
 
164
170
  - name: Download build artifacts
165
171
  # The build-dist-* artifact carries both dist/ (binaries) and
@@ -213,7 +219,7 @@ jobs:
213
219
  pull-requests: write
214
220
  packages: write
215
221
  steps:
216
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
222
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
217
223
  with:
218
224
  # On push OR a from-head dispatch (issue #35), check out main HEAD
219
225
  # so the tag is created there. On a tag dispatch (retroactive
@@ -280,13 +286,13 @@ jobs:
280
286
 
281
287
  - name: Docker Hub login
282
288
  if: vars.DOCKERHUB_USERNAME != ''
283
- uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
289
+ uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
284
290
  with:
285
291
  username: ${{ secrets.DOCKERHUB_USERNAME }}
286
292
  password: ${{ secrets.DOCKERHUB_TOKEN }}
287
293
 
288
294
  - name: GHCR login
289
- uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
295
+ uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
290
296
  with:
291
297
  registry: ghcr.io
292
298
  username: ${{ github.actor }}
@@ -303,12 +309,12 @@ jobs:
303
309
 
304
310
  - name: Install Rust toolchain
305
311
  if: inputs.language == 'rust'
306
- uses: dtolnay/rust-toolchain@3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9 # master
312
+ uses: dtolnay/rust-toolchain@fa04a1451ff1842e2626ccb99004d0195b455a88 # master
307
313
  with:
308
314
  toolchain: ${{ inputs.rust-toolchain }}
309
315
 
310
316
  - name: Install uv
311
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
317
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
312
318
  with:
313
319
  enable-cache: false
314
320
 
@@ -47,18 +47,30 @@ concurrency:
47
47
  group: ${{ github.workflow }}-${{ inputs.tag || github.ref }}
48
48
  cancel-in-progress: true
49
49
 
50
+ # Least-privilege GITHUB_TOKEN default for every job (CodeQL
51
+ # actions/missing-workflow-permissions). Two jobs elevate: release-tail
52
+ # (passes write down to _release-tail.yml -- semantic-release commit/tag +
53
+ # GHCR) and plan (semantic-release push-access verify on a publish predict).
54
+ # commit-check / quality / test / build are read-only.
55
+ permissions:
56
+ contents: read
57
+
50
58
  jobs:
51
59
  plan:
52
60
  name: Plan
53
61
  if: github.event.pull_request.head.repo.fork != true
54
62
  runs-on: ubuntu-latest
63
+ # predict-version runs semantic-release, whose git plugin verifies push
64
+ # access (a `git push --dry-run`) on a publish predict -- needs write.
65
+ permissions:
66
+ contents: write
55
67
  outputs:
56
68
  run-checks: ${{ steps.predict.outputs.run-checks }}
57
69
  run-build: ${{ steps.predict.outputs.run-build }}
58
70
  will-publish: ${{ steps.predict.outputs.will-publish }}
59
71
  next-version: ${{ steps.predict.outputs.version }}
60
72
  steps:
61
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
73
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
62
74
  with:
63
75
  ref: ${{ inputs.tag || github.ref }}
64
76
  fetch-depth: 0 # full history -- semantic-release dry-run reads it
@@ -69,6 +81,7 @@ jobs:
69
81
  github-token: ${{ secrets.GITHUB_TOKEN }}
70
82
  from-head: ${{ inputs.from-head }}
71
83
  bump: ${{ inputs.bump }}
84
+ branch-build: ${{ vars.HYPERCI_BRANCH_BUILD }}
72
85
 
73
86
  commit-check:
74
87
  name: Commit messages
@@ -83,11 +96,11 @@ jobs:
83
96
  github.event_name == 'pull_request'
84
97
  runs-on: ubuntu-latest
85
98
  steps:
86
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
99
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
87
100
  with:
88
101
  fetch-depth: 0
89
102
  - name: Install uv
90
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
103
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
91
104
  with:
92
105
  enable-cache: true
93
106
  - name: Set up Python
@@ -101,7 +114,7 @@ jobs:
101
114
  name: Quality
102
115
  runs-on: ubuntu-latest
103
116
  steps:
104
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
117
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
105
118
  with:
106
119
  ref: ${{ inputs.tag || github.ref }}
107
120
  # Full history + tags: the interface gate diffs against the last
@@ -109,7 +122,7 @@ jobs:
109
122
  fetch-depth: 0
110
123
 
111
124
  - name: Install uv
112
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
125
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
113
126
  with:
114
127
  enable-cache: true
115
128
 
@@ -137,12 +150,12 @@ jobs:
137
150
  matrix:
138
151
  os: [ubuntu-latest, macos-latest]
139
152
  steps:
140
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
153
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
141
154
  with:
142
155
  ref: ${{ inputs.tag || github.ref }}
143
156
 
144
157
  - name: Install uv
145
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
158
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
146
159
  with:
147
160
  enable-cache: true
148
161
 
@@ -161,7 +174,7 @@ jobs:
161
174
  if: needs.plan.outputs.run-build == 'true'
162
175
  runs-on: ubuntu-latest
163
176
  steps:
164
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
177
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
165
178
  with:
166
179
  ref: ${{ inputs.tag || github.ref }}
167
180
 
@@ -189,7 +202,7 @@ jobs:
189
202
  fi
190
203
 
191
204
  - name: Install uv
192
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
205
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
193
206
  with:
194
207
  enable-cache: true
195
208
 
@@ -218,6 +231,14 @@ jobs:
218
231
  release-tail:
219
232
  name: Release tail
220
233
  needs: [plan, build]
234
+ # Elevated + passed to _release-tail.yml: its tag-and-publish job commits +
235
+ # tags (contents), pushes GHCR (packages) and runs the semantic-release GH
236
+ # plugin (issues + pull-requests). Capped by the caller's grant.
237
+ permissions:
238
+ contents: write
239
+ packages: write
240
+ issues: write
241
+ pull-requests: write
221
242
  # Local ref (dogfood): a change to the shared release tail is exercised
222
243
  # on hyperi-ci's own CI before any consumer pins it. The tail's own
223
244
  # tag-and-publish job is gated on will-publish == 'true', so a non-publish
@@ -59,6 +59,10 @@ on:
59
59
  type: string
60
60
  default: ""
61
61
  description: "Space-separated submodule paths to init after checkout (e.g. 'schemas'). Empty (default) inits nothing. The submodule must be reachable by the job token -- public, or a token with cross-repo read access."
62
+ branch-build:
63
+ type: string
64
+ default: ""
65
+ description: "'true' to run build + container on pull_request events (branch-mode). Also settable repo-wide via the HYPERCI_BRANCH_BUILD variable. Dev-image push is the separate publish.container.dev_push opt-in."
62
66
  secrets:
63
67
  JFROG_TOKEN:
64
68
  required: false
@@ -106,6 +110,18 @@ concurrency:
106
110
  env:
107
111
  HYPERCI_PUBLISH_TARGET: ${{ inputs.publish-target }}
108
112
  HYPERCI_INSTALL: uvx --no-cache --refresh hyperi-ci
113
+ # Rare edge-case escape hatch: set the HYPERCI_QUALITY_SKIP repo/org
114
+ # variable (e.g. "semgrep") to force-skip a quality tool whose false
115
+ # positive is halting CI, until the real fix lands. Empty when unset.
116
+ HYPERCI_QUALITY_SKIP: ${{ vars.HYPERCI_QUALITY_SKIP }}
117
+
118
+ # Least-privilege GITHUB_TOKEN default for every job (CodeQL
119
+ # actions/missing-workflow-permissions). Two jobs elevate: release-tail
120
+ # (passes write down to _release-tail.yml -- semantic-release commit/tag +
121
+ # GHCR) and plan (semantic-release push-access verify on a publish predict).
122
+ # commit-check / quality / test / build are read-only.
123
+ permissions:
124
+ contents: read
109
125
 
110
126
  jobs:
111
127
  # ---------------------------------------------------------------------------
@@ -116,6 +132,10 @@ jobs:
116
132
  name: Plan
117
133
  if: github.event.pull_request.head.repo.fork != true
118
134
  runs-on: ubuntu-latest
135
+ # predict-version runs semantic-release, whose git plugin verifies push
136
+ # access (a `git push --dry-run`) on a publish predict -- needs write.
137
+ permissions:
138
+ contents: write
119
139
  outputs:
120
140
  run-checks: ${{ steps.predict.outputs.run-checks }}
121
141
  run-build: ${{ steps.predict.outputs.run-build }}
@@ -126,7 +146,7 @@ jobs:
126
146
  - name: Beta notice
127
147
  run: echo "::warning title=Go CI is beta::The Go reusable workflow is less battle-tested than Rust/Python/TS — verify results carefully."
128
148
 
129
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
149
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
130
150
  with:
131
151
  ref: ${{ inputs.tag || github.ref }}
132
152
  fetch-depth: 0
@@ -138,17 +158,20 @@ jobs:
138
158
  github-token: ${{ secrets.GITHUB_TOKEN }}
139
159
  from-head: ${{ inputs.from-head }}
140
160
  bump: ${{ inputs.bump }}
161
+ branch-build: ${{ inputs.branch-build || vars.HYPERCI_BRANCH_BUILD }}
141
162
 
142
163
  - name: Generate build matrix
143
164
  # Go cross-compiles natively (GOOS/GOARCH) — same multi-arch
144
- # matrix shape as Rust on publish; single-arch on validate.
165
+ # matrix shape as Rust on publish; single-arch on validate AND
166
+ # branch-mode PR builds (arch breadth keys off will-publish,
167
+ # NOT run-build).
145
168
  id: matrix
146
169
  shell: bash
147
170
  run: |
148
171
  set -euo pipefail
149
172
  AMD64_RUNNER="${{ startsWith(github.head_ref || github.ref_name, 'renovate/') && (vars.GH_RUNNER_RENOVATE || 'ubuntu-latest') || (inputs.runner-mode || vars.GH_RUNNER_MODE) == 'free' && 'ubuntu-latest' || inputs.runner-build || vars.GH_RUNNER_GOLANG || vars.GH_RUNNER_DEFAULT || 'ubuntu-latest' }}"
150
173
  ARM64_RUNNER="${{ vars.GH_RUNNER_ARM64 || 'ubuntu-24.04-arm' }}"
151
- if [[ "${{ steps.predict.outputs.run-build }}" == "true" ]]; then
174
+ if [[ "${{ steps.predict.outputs.will-publish }}" == "true" ]]; then
152
175
  matrix='{"include":[{"goos":"linux","goarch":"amd64","runner":"'"$AMD64_RUNNER"'","os_arch":"linux-amd64"},{"goos":"linux","goarch":"arm64","runner":"'"$ARM64_RUNNER"'","os_arch":"linux-arm64"}]}'
153
176
  else
154
177
  matrix='{"include":[{"goos":"linux","goarch":"amd64","runner":"'"$AMD64_RUNNER"'","os_arch":"linux-amd64"}]}'
@@ -169,11 +192,11 @@ jobs:
169
192
  github.event_name == 'pull_request'
170
193
  runs-on: ubuntu-latest
171
194
  steps:
172
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
195
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
173
196
  with:
174
197
  fetch-depth: 0
175
198
  - name: Install uv
176
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
199
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
177
200
  with:
178
201
  enable-cache: false
179
202
  - name: Validate commit messages
@@ -187,18 +210,18 @@ jobs:
187
210
  steps:
188
211
  - name: Docker Hub login
189
212
  if: ${{ vars.DOCKERHUB_USERNAME != '' }}
190
- uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
213
+ uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
191
214
  with:
192
215
  username: ${{ secrets.DOCKERHUB_USERNAME }}
193
216
  password: ${{ secrets.DOCKERHUB_TOKEN }}
194
217
 
195
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
218
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
196
219
  with:
197
220
  ref: ${{ inputs.tag || github.ref }}
198
221
 
199
222
  - name: Set up Go
200
223
  if: ${{ !contains(runner.name, 'arc-runner') }}
201
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
224
+ uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0
202
225
  with:
203
226
  go-version-file: ${{ inputs.go-version-file }}
204
227
 
@@ -212,7 +235,7 @@ jobs:
212
235
 
213
236
  - name: Install uv
214
237
  if: ${{ !contains(runner.name, 'arc-runner') }}
215
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
238
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
216
239
  with:
217
240
  enable-cache: false
218
241
 
@@ -248,24 +271,24 @@ jobs:
248
271
  steps:
249
272
  - name: Docker Hub login
250
273
  if: ${{ vars.DOCKERHUB_USERNAME != '' }}
251
- uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
274
+ uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
252
275
  with:
253
276
  username: ${{ secrets.DOCKERHUB_USERNAME }}
254
277
  password: ${{ secrets.DOCKERHUB_TOKEN }}
255
278
 
256
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
279
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
257
280
  with:
258
281
  ref: ${{ inputs.tag || github.ref }}
259
282
 
260
283
  - name: Set up Go
261
284
  if: ${{ !contains(runner.name, 'arc-runner') }}
262
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
285
+ uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0
263
286
  with:
264
287
  go-version-file: ${{ inputs.go-version-file }}
265
288
 
266
289
  - name: Install uv
267
290
  if: ${{ !contains(runner.name, 'arc-runner') }}
268
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
291
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
269
292
  with:
270
293
  enable-cache: false
271
294
 
@@ -303,7 +326,7 @@ jobs:
303
326
  strategy:
304
327
  matrix: ${{ fromJson(needs.plan.outputs.build-matrix) }}
305
328
  steps:
306
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
329
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
307
330
  with:
308
331
  ref: ${{ inputs.tag || github.ref }}
309
332
 
@@ -329,13 +352,13 @@ jobs:
329
352
 
330
353
  - name: Set up Go
331
354
  if: ${{ !contains(runner.name, 'arc-runner') }}
332
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6.4.0
355
+ uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0
333
356
  with:
334
357
  go-version-file: ${{ inputs.go-version-file }}
335
358
 
336
359
  - name: Install uv
337
360
  if: ${{ !contains(runner.name, 'arc-runner') }}
338
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
361
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
339
362
  with:
340
363
  enable-cache: false
341
364
 
@@ -370,6 +393,14 @@ jobs:
370
393
  release-tail:
371
394
  name: Release tail
372
395
  needs: [plan, build]
396
+ # Elevated + passed to _release-tail.yml: its tag-and-publish job commits +
397
+ # tags (contents), pushes GHCR (packages) and runs the semantic-release GH
398
+ # plugin (issues + pull-requests). Capped by the caller's grant.
399
+ permissions:
400
+ contents: write
401
+ packages: write
402
+ issues: write
403
+ pull-requests: write
373
404
  uses: hyperi-io/hyperi-ci/.github/workflows/_release-tail.yml@main
374
405
  with:
375
406
  language: golang
@@ -56,6 +56,10 @@ on:
56
56
  type: string
57
57
  default: ""
58
58
  description: "Space-separated submodule paths to init after checkout (e.g. 'schemas'). Empty (default) inits nothing. The submodule must be reachable by the job token -- public, or a token with cross-repo read access."
59
+ branch-build:
60
+ type: string
61
+ default: ""
62
+ description: "'true' to run build + container on pull_request events (branch-mode). Also settable repo-wide via the HYPERCI_BRANCH_BUILD variable. Dev-image push is the separate publish.container.dev_push opt-in."
59
63
  secrets:
60
64
  JFROG_TOKEN:
61
65
  required: false
@@ -110,6 +114,18 @@ concurrency:
110
114
  env:
111
115
  HYPERCI_PUBLISH_TARGET: ${{ inputs.publish-target }}
112
116
  HYPERCI_INSTALL: uvx --no-cache --refresh hyperi-ci
117
+ # Rare edge-case escape hatch: set the HYPERCI_QUALITY_SKIP repo/org
118
+ # variable (e.g. "semgrep") to force-skip a quality tool whose false
119
+ # positive is halting CI, until the real fix lands. Empty when unset.
120
+ HYPERCI_QUALITY_SKIP: ${{ vars.HYPERCI_QUALITY_SKIP }}
121
+
122
+ # Least-privilege GITHUB_TOKEN default for every job (CodeQL
123
+ # actions/missing-workflow-permissions). Two jobs elevate: release-tail
124
+ # (passes write down to _release-tail.yml -- semantic-release commit/tag +
125
+ # GHCR) and plan (semantic-release push-access verify on a publish predict).
126
+ # commit-check / quality / test / build are read-only.
127
+ permissions:
128
+ contents: read
113
129
 
114
130
  jobs:
115
131
  # ---------------------------------------------------------------------------
@@ -121,13 +137,17 @@ jobs:
121
137
  name: Plan
122
138
  if: github.event.pull_request.head.repo.fork != true
123
139
  runs-on: ubuntu-latest
140
+ # predict-version runs semantic-release, whose git plugin verifies push
141
+ # access (a `git push --dry-run`) on a publish predict -- needs write.
142
+ permissions:
143
+ contents: write
124
144
  outputs:
125
145
  run-checks: ${{ steps.predict.outputs.run-checks }}
126
146
  run-build: ${{ steps.predict.outputs.run-build }}
127
147
  will-publish: ${{ steps.predict.outputs.will-publish }}
128
148
  next-version: ${{ steps.predict.outputs.version }}
129
149
  steps:
130
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
150
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
131
151
  with:
132
152
  ref: ${{ inputs.tag || github.ref }}
133
153
  fetch-depth: 0 # full history — semantic-release dry-run reads it
@@ -139,6 +159,7 @@ jobs:
139
159
  github-token: ${{ secrets.GITHUB_TOKEN }}
140
160
  from-head: ${{ inputs.from-head }}
141
161
  bump: ${{ inputs.bump }}
162
+ branch-build: ${{ inputs.branch-build || vars.HYPERCI_BRANCH_BUILD }}
142
163
 
143
164
  commit-check:
144
165
  name: Commit messages
@@ -154,11 +175,11 @@ jobs:
154
175
  github.event_name == 'pull_request'
155
176
  runs-on: ubuntu-latest
156
177
  steps:
157
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
178
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
158
179
  with:
159
180
  fetch-depth: 0
160
181
  - name: Install uv
161
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
182
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
162
183
  with:
163
184
  enable-cache: false
164
185
  - name: Validate commit messages
@@ -172,18 +193,18 @@ jobs:
172
193
  steps:
173
194
  - name: Docker Hub login
174
195
  if: ${{ vars.DOCKERHUB_USERNAME != '' }}
175
- uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
196
+ uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
176
197
  with:
177
198
  username: ${{ secrets.DOCKERHUB_USERNAME }}
178
199
  password: ${{ secrets.DOCKERHUB_TOKEN }}
179
200
 
180
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
201
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
181
202
  with:
182
203
  ref: ${{ inputs.tag || github.ref }}
183
204
 
184
205
  - name: Install uv
185
206
  if: ${{ !contains(runner.name, 'arc-runner') }}
186
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
207
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
187
208
  with:
188
209
  enable-cache: true
189
210
 
@@ -242,18 +263,18 @@ jobs:
242
263
  steps:
243
264
  - name: Docker Hub login
244
265
  if: ${{ vars.DOCKERHUB_USERNAME != '' }}
245
- uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
266
+ uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
246
267
  with:
247
268
  username: ${{ secrets.DOCKERHUB_USERNAME }}
248
269
  password: ${{ secrets.DOCKERHUB_TOKEN }}
249
270
 
250
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
271
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
251
272
  with:
252
273
  ref: ${{ inputs.tag || github.ref }}
253
274
 
254
275
  - name: Install uv
255
276
  if: ${{ !contains(runner.name, 'arc-runner') }}
256
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
277
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
257
278
  with:
258
279
  enable-cache: true
259
280
 
@@ -292,7 +313,7 @@ jobs:
292
313
  if: needs.plan.outputs.run-build == 'true'
293
314
  runs-on: ${{ startsWith(github.head_ref || github.ref_name, 'renovate/') && (vars.GH_RUNNER_RENOVATE || 'ubuntu-latest') || (inputs.runner-mode || vars.GH_RUNNER_MODE) == 'free' && 'ubuntu-latest' || inputs.runner-build || vars.GH_RUNNER_PYTHON || vars.GH_RUNNER_DEFAULT || 'ubuntu-latest' }}
294
315
  steps:
295
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
316
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
296
317
  with:
297
318
  ref: ${{ inputs.tag || github.ref }}
298
319
 
@@ -330,7 +351,7 @@ jobs:
330
351
 
331
352
  - name: Install uv
332
353
  if: ${{ !contains(runner.name, 'arc-runner') }}
333
- uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
354
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
334
355
  with:
335
356
  enable-cache: true
336
357
 
@@ -367,6 +388,14 @@ jobs:
367
388
  release-tail:
368
389
  name: Release tail
369
390
  needs: [plan, build]
391
+ # Elevated + passed to _release-tail.yml: its tag-and-publish job commits +
392
+ # tags (contents), pushes GHCR (packages) and runs the semantic-release GH
393
+ # plugin (issues + pull-requests). Capped by the caller's grant.
394
+ permissions:
395
+ contents: write
396
+ packages: write
397
+ issues: write
398
+ pull-requests: write
370
399
  uses: hyperi-io/hyperi-ci/.github/workflows/_release-tail.yml@main
371
400
  with:
372
401
  language: python