repomatic 6.25.1__tar.gz → 6.26.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 (150) hide show
  1. {repomatic-6.25.1 → repomatic-6.26.0}/PKG-INFO +4 -3
  2. {repomatic-6.25.1 → repomatic-6.26.0}/pyproject.toml +5 -5
  3. {repomatic-6.25.1 → repomatic-6.26.0}/readme.md +2 -1
  4. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/__init__.py +2 -2
  5. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/changelog.py +84 -0
  6. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/cli.py +48 -0
  7. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/config.py +79 -7
  8. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/_release-engine.yaml +37 -20
  9. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/action-publish-pypi.yaml +1 -1
  10. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/autofix.yaml +51 -51
  11. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/changelog.yaml +32 -26
  12. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/debug.yaml +3 -3
  13. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/docs.yaml +6 -6
  14. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/labels.yaml +13 -10
  15. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/lint.yaml +14 -14
  16. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/renovate.json5 +2 -2
  17. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/renovate.yaml +6 -6
  18. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-repomatic-changelog.md +7 -5
  19. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/tests.yaml +4 -4
  20. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/unsubscribe.yaml +2 -2
  21. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/init_project.py +185 -0
  22. {repomatic-6.25.1 → repomatic-6.26.0}/license +0 -0
  23. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/__main__.py +0 -0
  24. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/binary.py +0 -0
  25. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/broken_links.py +0 -0
  26. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/cache.py +0 -0
  27. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/checksums.py +0 -0
  28. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/__init__.py +0 -0
  29. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/agent-grunt-qa.md +0 -0
  30. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/agent-qa-engineer.md +0 -0
  31. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/agent-sphinx-docs.md +0 -0
  32. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/autolock.yaml +0 -0
  33. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/ISSUE_TEMPLATE/config.yml +0 -0
  34. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/ISSUE_TEMPLATE/new-link.yaml +0 -0
  35. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/code-of-conduct.md +0 -0
  36. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/contributing.md +0 -0
  37. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/contributing.zh.md +0 -0
  38. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/funding.yml +0 -0
  39. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/pull_request_template.md +0 -0
  40. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/awesome_template/__init__.py +0 -0
  41. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/awesome_template/license +0 -0
  42. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/bumpversion.toml +0 -0
  43. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/cancel-runs.yaml +0 -0
  44. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/codecov.yaml +0 -0
  45. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/labeller-content-based.yaml +0 -0
  46. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/labeller-file-based.yaml +0 -0
  47. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/labels.toml +0 -0
  48. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/lychee.toml +0 -0
  49. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/mdformat.toml +0 -0
  50. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/mypy.toml +0 -0
  51. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/pytest.toml +0 -0
  52. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/release.yaml +0 -0
  53. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/ruff.toml +0 -0
  54. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-av-false-positive.md +0 -0
  55. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-awesome-triage.md +0 -0
  56. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-babysit-ci.md +0 -0
  57. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-benchmark-update.md +0 -0
  58. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-brand-assets.md +0 -0
  59. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-file-bug-report.md +0 -0
  60. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-repomatic-audit.md +0 -0
  61. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-repomatic-deps.md +0 -0
  62. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-repomatic-init.md +0 -0
  63. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-repomatic-ship.md +0 -0
  64. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-repomatic-topics.md +0 -0
  65. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-sphinx-docs-sync.md +0 -0
  66. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-translation-sync.md +0 -0
  67. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/skill-upstream-audit.md +0 -0
  68. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/typos.toml +0 -0
  69. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/yamllint.yaml +0 -0
  70. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/data/zizmor.yaml +0 -0
  71. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/deps_graph.py +0 -0
  72. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/git_ops.py +0 -0
  73. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/__init__.py +0 -0
  74. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/actions.py +0 -0
  75. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/advisories.py +0 -0
  76. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/dev_release.py +0 -0
  77. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/gh.py +0 -0
  78. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/issue.py +0 -0
  79. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/matrix.py +0 -0
  80. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/pr.py +0 -0
  81. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/pr_body.py +0 -0
  82. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/release_sync.py +0 -0
  83. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/releases.py +0 -0
  84. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/status.py +0 -0
  85. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/token.py +0 -0
  86. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/unsubscribe.py +0 -0
  87. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/github/workflow_sync.py +0 -0
  88. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/images.py +0 -0
  89. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/lint_repo.py +0 -0
  90. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/mailmap.py +0 -0
  91. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/metadata.py +0 -0
  92. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/myst_converter.py +0 -0
  93. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/myst_docstrings.py +0 -0
  94. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/py.typed +0 -0
  95. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/pypi.py +0 -0
  96. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/pyproject.py +0 -0
  97. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/registry.py +0 -0
  98. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/release_prep.py +0 -0
  99. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/renovate.py +0 -0
  100. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/rst_to_myst.py +0 -0
  101. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/sponsor.py +0 -0
  102. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/__init__.py +0 -0
  103. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/available-admonition.md +0 -0
  104. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/broken-links-issue.md +0 -0
  105. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/bump-version.md +0 -0
  106. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/detect-squash-merge.md +0 -0
  107. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/development-warning.md +0 -0
  108. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/fix-changelog.md +0 -0
  109. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/fix-typos.md +0 -0
  110. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/fix-vulnerable-deps.md +0 -0
  111. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/format-images.md +0 -0
  112. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/format-json.md +0 -0
  113. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/format-markdown.md +0 -0
  114. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/format-pyproject.md +0 -0
  115. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/format-python.md +0 -0
  116. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/format-shell.md +0 -0
  117. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/generated-footer.md +0 -0
  118. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/github-releases.md +0 -0
  119. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/immutable-releases.md +0 -0
  120. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/pr-metadata.md.noformat +0 -0
  121. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/prepare-release.md +0 -0
  122. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/refresh-tip.md +0 -0
  123. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/release-notes.md +0 -0
  124. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/release-sync-report.md +0 -0
  125. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/renovate-migration.md +0 -0
  126. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/setup-guide-branch-ruleset.md +0 -0
  127. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/setup-guide-dependabot.md +0 -0
  128. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/setup-guide-fork-pr-approval.md +0 -0
  129. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/setup-guide-pages-source.md +0 -0
  130. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/setup-guide-pypi-trusted-publisher.md +0 -0
  131. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/setup-guide-token.md +0 -0
  132. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/setup-guide-verify.md +0 -0
  133. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/setup-guide-virustotal.md +0 -0
  134. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/setup-guide.md +0 -0
  135. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/sync-bumpversion.md +0 -0
  136. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/sync-gitignore.md +0 -0
  137. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/sync-mailmap.md +0 -0
  138. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/sync-repomatic.md +0 -0
  139. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/sync-uv-lock.md +0 -0
  140. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/unavailable-admonition.md +0 -0
  141. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/unsubscribe-phase1.md +0 -0
  142. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/unsubscribe-phase2.md +0 -0
  143. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/update-deps-graph.md +0 -0
  144. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/update-docs.md +0 -0
  145. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/templates/yanked-admonition.md +0 -0
  146. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/test_matrix.py +0 -0
  147. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/test_plan.py +0 -0
  148. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/tool_runner.py +0 -0
  149. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/uv.py +0 -0
  150. {repomatic-6.25.1 → repomatic-6.26.0}/repomatic/virustotal.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: repomatic
3
- Version: 6.25.1
3
+ Version: 6.26.0
4
4
  Summary: 🏭 Automate repository maintenance, releases, and CI/CD workflows
5
5
  Keywords: changelog-formatter,dependabot-alternative,github-actions,github-labels,github-workflow,gitignore,mailmap,mypy,nuitka,python-automation,release-automation,renovate,repository-automation,repository-management,reusable-workflows,software-factory,sphinx-doc,typo,uv,workflow-reusable
6
6
  Author: Kevin Deldycke
@@ -58,7 +58,7 @@ Requires-Dist: wcmatch>=10
58
58
  Requires-Python: >=3.10
59
59
  Project-URL: Changelog, https://github.com/kdeldycke/repomatic/blob/main/changelog.md
60
60
  Project-URL: Documentation, https://kdeldycke.github.io/repomatic
61
- Project-URL: Download, https://github.com/kdeldycke/repomatic/releases/tag/v6.25.1
61
+ Project-URL: Download, https://github.com/kdeldycke/repomatic/releases/tag/v6.26.0
62
62
  Project-URL: Funding, https://github.com/sponsors/kdeldycke
63
63
  Project-URL: Homepage, https://github.com/kdeldycke/repomatic
64
64
  Project-URL: Issues, https://github.com/kdeldycke/repomatic/issues
@@ -72,8 +72,9 @@ Description-Content-Type: text/markdown
72
72
  [![Last release](https://img.shields.io/pypi/v/repomatic.svg)](https://pypi.org/project/repomatic/)
73
73
  [![Python versions](https://img.shields.io/pypi/pyversions/repomatic.svg)](https://pypi.org/project/repomatic/)
74
74
  [![Downloads](https://static.pepy.tech/badge/repomatic/month)](https://pepy.tech/projects/repomatic)
75
- [![Unittests status](https://github.com/kdeldycke/repomatic/actions/workflows/tests.yaml/badge.svg?branch=main)](https://github.com/kdeldycke/repomatic/actions/workflows/tests.yaml?query=branch%3Amain)
75
+ [![Unittests status](https://img.shields.io/github/actions/workflow/status/kdeldycke/repomatic/tests.yaml?branch=main&label=%F0%9F%94%AC%20Tests)](https://github.com/kdeldycke/repomatic/actions/workflows/tests.yaml?query=branch%3Amain)
76
76
  [![Coverage status](https://codecov.io/gh/kdeldycke/repomatic/branch/main/graph/badge.svg)](https://app.codecov.io/gh/kdeldycke/repomatic)
77
+ [![Documentation status](https://img.shields.io/github/actions/workflow/status/kdeldycke/repomatic/docs.yaml?branch=main&label=%F0%9F%93%9A%20Docs)](https://github.com/kdeldycke/repomatic/actions/workflows/docs.yaml?query=branch%3Amain)
77
78
 
78
79
  A Python CLI and `pyproject.toml` configuration that let you **release Python packages multiple times a day with only 2-clicks**. Designed for `uv`-based Python projects, but usable for other projects too. The CLI operates through reusable GitHub Actions workflows as its CI delivery mechanism.
79
80
 
@@ -5,7 +5,7 @@ requires = [ "uv-build>=0.9" ]
5
5
  [project]
6
6
  # Docs: https://packaging.python.org/en/latest/guides/writing-pyproject-toml/
7
7
  name = "repomatic"
8
- version = "6.25.1"
8
+ version = "6.26.0"
9
9
  description = "🏭 Automate repository maintenance, releases, and CI/CD workflows"
10
10
  readme = "readme.md"
11
11
  keywords = [
@@ -123,7 +123,7 @@ repomatic = "repomatic.__main__:main"
123
123
  [project.urls]
124
124
  "Changelog" = "https://github.com/kdeldycke/repomatic/blob/main/changelog.md"
125
125
  "Documentation" = "https://kdeldycke.github.io/repomatic"
126
- "Download" = "https://github.com/kdeldycke/repomatic/releases/tag/v6.25.1"
126
+ "Download" = "https://github.com/kdeldycke/repomatic/releases/tag/v6.26.0"
127
127
  "Funding" = "https://github.com/sponsors/kdeldycke"
128
128
  "Homepage" = "https://github.com/kdeldycke/repomatic"
129
129
  "Issues" = "https://github.com/kdeldycke/repomatic/issues"
@@ -204,7 +204,7 @@ copyright = "Kevin Deldycke <kevin@deldycke.com> and contributors. Distributed u
204
204
  file-description = "🏭 Automate repository maintenance, releases, and CI/CD workflows"
205
205
  # Numeric only: Nuitka rejects PEP 440 .devN suffixes. Kept in sync with the
206
206
  # package version by the dedicated [tool.bumpversion] rule that strips the suffix.
207
- file-version = "6.25.1"
207
+ file-version = "6.26.0"
208
208
  include-data-dir = [
209
209
  "repomatic/data/awesome_template=repomatic/data/awesome_template",
210
210
  ]
@@ -222,7 +222,7 @@ include-package-data = [ "click_extra" ]
222
222
  linux-icon = "docs/assets/icon.png"
223
223
  macos-app-icon = "docs/assets/icon.icns"
224
224
  product-name = "Repomatic"
225
- product-version = "6.25.1"
225
+ product-version = "6.26.0"
226
226
  windows-icon-from-ico = "docs/assets/icon.ico"
227
227
 
228
228
  [tool.ruff]
@@ -306,7 +306,7 @@ run.source = [ "repomatic" ]
306
306
  report.precision = 2
307
307
 
308
308
  [tool.bumpversion]
309
- current_version = "6.25.1"
309
+ current_version = "6.26.0"
310
310
  allow_dirty = true
311
311
  ignore_missing_files = true
312
312
  # Parse versions with an optional .devN suffix (PEP 440).
@@ -5,8 +5,9 @@
5
5
  [![Last release](https://img.shields.io/pypi/v/repomatic.svg)](https://pypi.org/project/repomatic/)
6
6
  [![Python versions](https://img.shields.io/pypi/pyversions/repomatic.svg)](https://pypi.org/project/repomatic/)
7
7
  [![Downloads](https://static.pepy.tech/badge/repomatic/month)](https://pepy.tech/projects/repomatic)
8
- [![Unittests status](https://github.com/kdeldycke/repomatic/actions/workflows/tests.yaml/badge.svg?branch=main)](https://github.com/kdeldycke/repomatic/actions/workflows/tests.yaml?query=branch%3Amain)
8
+ [![Unittests status](https://img.shields.io/github/actions/workflow/status/kdeldycke/repomatic/tests.yaml?branch=main&label=%F0%9F%94%AC%20Tests)](https://github.com/kdeldycke/repomatic/actions/workflows/tests.yaml?query=branch%3Amain)
9
9
  [![Coverage status](https://codecov.io/gh/kdeldycke/repomatic/branch/main/graph/badge.svg)](https://app.codecov.io/gh/kdeldycke/repomatic)
10
+ [![Documentation status](https://img.shields.io/github/actions/workflow/status/kdeldycke/repomatic/docs.yaml?branch=main&label=%F0%9F%93%9A%20Docs)](https://github.com/kdeldycke/repomatic/actions/workflows/docs.yaml?query=branch%3Amain)
10
11
 
11
12
  A Python CLI and `pyproject.toml` configuration that let you **release Python packages multiple times a day with only 2-clicks**. Designed for `uv`-based Python projects, but usable for other projects too. The CLI operates through reusable GitHub Actions workflows as its CI delivery mechanism.
12
13
 
@@ -17,5 +17,5 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
- __version__ = "6.25.1"
21
- __git_tag_sha__ = "86620138002b34a18678953b6eb63d09cdc22ce6"
20
+ __version__ = "6.26.0"
21
+ __git_tag_sha__ = "9b9fa8a1d838c1f28bb9d0bb82fa67084b8a2ca7"
@@ -730,6 +730,84 @@ def build_unavailable_admonition(
730
730
  )
731
731
 
732
732
 
733
+ def split_changelog_bullets(changes: str) -> list[str]:
734
+ """Split a version section's change body into top-level bullet entries.
735
+
736
+ Each returned item is one entry: its `-` marker line plus any wrapped
737
+ continuation lines and indented sub-bullets, joined with newlines.
738
+ Blank lines and prose outside a bullet are dropped.
739
+
740
+ :param changes: The hand-written body of a version section, as captured
741
+ in {attr}`VersionElements.changes`.
742
+ :return: One string per top-level bullet, in document order.
743
+ """
744
+ bullets: list[str] = []
745
+ current: list[str] = []
746
+ for line in changes.splitlines():
747
+ if re.match(r"^- ", line):
748
+ if current:
749
+ bullets.append("\n".join(current))
750
+ current = [line]
751
+ elif current and (not line.strip() or line[:1] in {" ", "\t"}):
752
+ # Wrapped continuation, indented sub-bullet, or interior blank line.
753
+ current.append(line)
754
+ elif current:
755
+ # A non-indented, non-bullet line closes the current entry.
756
+ bullets.append("\n".join(current))
757
+ current = []
758
+ if current:
759
+ bullets.append("\n".join(current))
760
+ return bullets
761
+
762
+
763
+ def count_bullet_words(bullet: str) -> int:
764
+ """Count the words in a changelog bullet, ignoring list markers.
765
+
766
+ Leading `-`/`*` markers (on the entry and any nested sub-bullets) are
767
+ stripped so they do not inflate the count; everything else, including
768
+ inline code and link text, counts as written.
769
+ """
770
+ return len(re.sub(r"(?m)^\s*[-*]\s+", "", bullet).split())
771
+
772
+
773
+ def warn_on_long_bullets(changelog: Changelog, threshold: int) -> None:
774
+ """Warn about over-long bullets in the unreleased section, non-fatally.
775
+
776
+ A changelog entry is a release note, not a commit message: one short
777
+ sentence stating what changed (see `CLAUDE.md` § Changelog entry length).
778
+ Each unreleased bullet longer than `threshold` words emits a
779
+ {data}`logging.WARNING` and a GitHub Actions warning annotation, without
780
+ affecting the lint exit code.
781
+
782
+ Only the unreleased section is inspected. Released sections are immutable,
783
+ so re-flagging historical entries on every run would be noise.
784
+
785
+ :param changelog: The parsed changelog to inspect.
786
+ :param threshold: Word ceiling per bullet. `0` (or less) disables the check.
787
+ """
788
+ if threshold <= 0:
789
+ return
790
+ released = {version for version, _date in changelog.extract_all_releases()}
791
+ unreleased = changelog.extract_all_version_headings() - released
792
+ for version in sorted(unreleased, key=Version, reverse=True):
793
+ elements = changelog.decompose_version(version)
794
+ for index, bullet in enumerate(split_changelog_bullets(elements.changes), 1):
795
+ words = count_bullet_words(bullet)
796
+ if words > threshold:
797
+ logging.warning(
798
+ f"⚠ {version}: changelog entry {index} runs {words} words "
799
+ f"(over {threshold}). Tighten it to a one-sentence release "
800
+ f"note; move mechanism and rationale to the commit or PR."
801
+ )
802
+ emit_annotation(
803
+ AnnotationLevel.WARNING,
804
+ f"Changelog entry {index} for {version} runs {words} words, "
805
+ f"over the {threshold}-word guideline. A changelog entry is "
806
+ f"a release note, not a commit message: keep it to one short "
807
+ f"sentence (see CLAUDE.md, Changelog entry length).",
808
+ )
809
+
810
+
733
811
  def lint_changelog_dates(
734
812
  changelog_path: Path,
735
813
  package: str | None = None,
@@ -737,6 +815,7 @@ def lint_changelog_dates(
737
815
  fix: bool = False,
738
816
  pypi_package_history: Sequence[str] = (),
739
817
  abandoned_versions: Sequence[str] = (),
818
+ bullet_word_threshold: int = 0,
740
819
  ) -> int:
741
820
  """Verify that changelog release dates match canonical release dates.
742
821
 
@@ -787,6 +866,10 @@ def lint_changelog_dates(
787
866
  both the PyPI lookup and the git-tag fallback. Use for releases
788
867
  that were frozen but skipped per the "skip and move forward"
789
868
  practice (botched build, broken artifact).
869
+ :param bullet_word_threshold: Word count above which an unreleased-section
870
+ bullet triggers a non-fatal length warning (see
871
+ {func}`warn_on_long_bullets`). `0` disables the check. Never affects
872
+ the exit code.
790
873
  :return: `0` if all dates match or references were corrected in-place,
791
874
  `1` if any date mismatch or orphan is found without a fix being
792
875
  applied, `2` if the sanity gate refused a destructive rewrite
@@ -796,6 +879,7 @@ def lint_changelog_dates(
796
879
  """
797
880
  content = changelog_path.read_text(encoding="UTF-8")
798
881
  changelog = Changelog(content)
882
+ warn_on_long_bullets(changelog, bullet_word_threshold)
799
883
  releases = changelog.extract_all_releases()
800
884
 
801
885
  if not releases:
@@ -29,6 +29,7 @@ from collections import Counter
29
29
  from pathlib import Path
30
30
  from urllib.request import Request, urlopen
31
31
 
32
+ import tomlrt
32
33
  from boltons.iterutils import unique
33
34
  from click_extra import (
34
35
  UNPROCESSED,
@@ -2972,9 +2973,51 @@ def sync_labels(ctx: Context, repository: str | None) -> None:
2972
2973
  if label_file.is_file():
2973
2974
  _run_labelmaker(lm, "apply", str(label_file), repository)
2974
2975
 
2976
+ # Apply inline label definitions from `[tool.repomatic.labels.extra]`.
2977
+ inline_toml = _serialize_inline_labels(config.labels.extra)
2978
+ if inline_toml:
2979
+ with tempfile.TemporaryDirectory(prefix="repomatic-labels-") as tmpdir:
2980
+ inline_file = Path(tmpdir) / "inline.toml"
2981
+ inline_file.write_text(inline_toml, encoding="UTF-8")
2982
+ _run_labelmaker(lm, "apply", str(inline_file), repository)
2983
+
2975
2984
  echo("Labels synced.")
2976
2985
 
2977
2986
 
2987
+ def _serialize_inline_labels(entries: list[dict[str, str]]) -> str:
2988
+ """Serialize `[tool.repomatic.labels.extra]` entries to a labelmaker TOML config.
2989
+
2990
+ Each entry becomes a `[[profiles.default.labels]]` block under the `default`
2991
+ profile. Leading `#` on hex colors is stripped so the output matches
2992
+ labelmaker's convention. Entries missing a `name` are skipped with a warning:
2993
+ labelmaker rejects nameless labels and would abort the whole sync.
2994
+
2995
+ Returns an empty string when there are no valid entries, so the caller can
2996
+ skip writing a temp file and invoking labelmaker entirely.
2997
+ """
2998
+ labels: list[dict[str, str]] = []
2999
+ for entry in entries:
3000
+ name = entry.get("name", "").strip()
3001
+ if not name:
3002
+ logging.warning(
3003
+ "Skipping inline label without a `name`: %r.",
3004
+ entry,
3005
+ )
3006
+ continue
3007
+ label: dict[str, str] = {"name": name}
3008
+ if color := entry.get("color"):
3009
+ label["color"] = color.lstrip("#")
3010
+ if description := entry.get("description"):
3011
+ label["description"] = description
3012
+ labels.append(label)
3013
+
3014
+ if not labels:
3015
+ return ""
3016
+
3017
+ doc = tomlrt.Document({"profiles": {"default": {"labels": labels}}})
3018
+ return tomlrt.dumps(doc)
3019
+
3020
+
2978
3021
  def _run_labelmaker(labelmaker_path: Path, *args: str) -> None:
2979
3022
  """Run a `labelmaker` command.
2980
3023
 
@@ -3304,6 +3347,10 @@ def lint_changelog(
3304
3347
  "not found on PyPI" warnings for releases that were frozen but
3305
3348
  never published (skip-and-move-forward releases).
3306
3349
 
3350
+ Reads changelog.bullet-word-threshold from [tool.repomatic] to warn,
3351
+ non-fatally, about unreleased changelog bullets longer than that many
3352
+ words. A changelog entry is a release note, not a commit message.
3353
+
3307
3354
  \b
3308
3355
  Output symbols:
3309
3356
  ✓ Dates match
@@ -3349,6 +3396,7 @@ def lint_changelog(
3349
3396
  fix=fix,
3350
3397
  pypi_package_history=config.pypi_package_history,
3351
3398
  abandoned_versions=config.abandoned_versions,
3399
+ bullet_word_threshold=config.changelog_bullet_word_threshold,
3352
3400
  )
3353
3401
  ctx.exit(exit_code)
3354
3402
 
@@ -196,22 +196,65 @@ class GitignoreConfig:
196
196
  class LabelsConfig:
197
197
  """Nested schema for `[tool.repomatic.labels]`."""
198
198
 
199
- extra_content_rules: str = ""
200
- """Additional YAML rules appended to the content-based labeller configuration.
199
+ content_rules: list[dict[str, str | list[str]]] = field(default_factory=list)
200
+ """Structured per-label rules for the content-based labeller.
201
201
 
202
- Appended to the bundled `labeller-content-based.yaml` during export.
202
+ Each `[[tool.repomatic.labels.content-rules]]` entry has:
203
+
204
+ - `label` (required): label name to apply when any pattern matches.
205
+ - `patterns` (required): list of regex patterns evaluated against the issue
206
+ or PR title and body by `github/issue-labeller`.
207
+
208
+ Repeating the same `label` across entries merges their patterns. Serialized
209
+ to YAML at export time and appended to the bundled
210
+ `labeller-content-based.yaml`.
203
211
  """
204
212
 
205
- extra_file_rules: str = ""
206
- """Additional YAML rules appended to the file-based labeller configuration.
213
+ extra: list[dict[str, str]] = field(default_factory=list)
214
+ """Inline label definitions applied at sync time under the `default` profile.
215
+
216
+ Each entry is a mapping with `name`, `color`, and `description` keys,
217
+ matching `labelmaker`'s label specification. Entries are serialized into a
218
+ temporary TOML file as `[[profiles.default.labels]]` blocks and applied by
219
+ `labelmaker apply`. This avoids committing a lonely `extra-labels/*.toml`
220
+ file when the downstream project only needs the basic three fields.
207
221
 
208
- Appended to the bundled `labeller-file-based.yaml` during export.
222
+ For label sets that need `labelmaker`'s advanced features (`rename-from`,
223
+ multi-profile, multi-color), commit a hand-written file under
224
+ `extra-labels/` or download one via `extra-files` instead.
209
225
  """
210
226
 
211
227
  extra_files: list[str] = field(default_factory=list)
212
228
  """URLs of additional label definition files (JSON, JSON5, TOML, or YAML).
213
229
 
214
- Each URL is downloaded and applied separately by `labelmaker`.
230
+ Each URL is downloaded into `extra-labels/` and applied separately by
231
+ `labelmaker`. For inline definitions that need no external file, use
232
+ `extra` instead.
233
+ """
234
+
235
+ file_rules: list[dict[str, str | list[str]]] = field(default_factory=list)
236
+ """Structured per-label rules for the file-based labeller.
237
+
238
+ Each `[[tool.repomatic.labels.file-rules]]` entry defines one match group
239
+ for one label. Required key:
240
+
241
+ - `label`: label name to apply when this group's conditions match.
242
+
243
+ Optional matcher keys (all conditions in the same entry are AND'd):
244
+
245
+ - `any-glob-to-any-file`: any pattern matches any changed file.
246
+ - `any-glob-to-all-files`: any pattern matches every changed file.
247
+ - `all-globs-to-any-file`: every pattern matches any changed file.
248
+ - `all-globs-to-all-files`: every pattern matches every changed file.
249
+ - `head-branch`: regex patterns matched against the PR head branch.
250
+ - `base-branch`: regex patterns matched against the PR base branch.
251
+ - `any`: list of nested sub-groups, OR'd together.
252
+ - `all`: list of nested sub-groups, AND'd together.
253
+
254
+ Repeating the same `label` across entries OR's the resulting groups, the
255
+ same as listing multiple top-level groups under one label in
256
+ `actions/labeler`. Together with `any` / `all` wrappers this covers the
257
+ full `actions/labeler` v5+ schema.
215
258
  """
216
259
 
217
260
  sync: bool = True
@@ -455,6 +498,20 @@ class Config:
455
498
  )
456
499
  """Binary cache configuration."""
457
500
 
501
+ changelog_bullet_word_threshold: int = field(
502
+ default=40,
503
+ metadata={"click_extra.config_path": "changelog.bullet-word-threshold"},
504
+ )
505
+ """Word count above which `lint-changelog` warns about a changelog bullet.
506
+
507
+ A changelog entry is a release note, not a commit message: ideally one
508
+ short sentence stating what changed (see `CLAUDE.md` § Changelog entry
509
+ length). `lint-changelog` emits a non-fatal warning for every bullet in
510
+ the *unreleased* section longer than this many words, nudging verbose,
511
+ implementation-heavy entries back toward a user-facing summary. Released
512
+ sections are immutable and never flagged. Set to `0` to disable the check.
513
+ """
514
+
458
515
  changelog_location: str = field(
459
516
  default="./changelog.md",
460
517
  metadata={"click_extra.config_path": "changelog.location"},
@@ -589,6 +646,21 @@ class Config:
589
646
  `meta-package-manager` pointing to the same function).
590
647
  """
591
648
 
649
+ nuitka_extras: list[str] = field(
650
+ default_factory=list,
651
+ metadata={"click_extra.config_path": "nuitka.extras"},
652
+ )
653
+ """`[project.optional-dependencies]` extras to install before the Nuitka build.
654
+
655
+ List of extra names (like `["sbom"]`) to sync into the build venv before
656
+ invoking Nuitka. By default the binary build only sees the project's base
657
+ dependencies, which matches a bare `pip install <package>` and excludes
658
+ optional features. Listing an extra here calls `uv sync --frozen --extra
659
+ <name>` before the Nuitka build so the binary can bundle the optional
660
+ feature's third-party packages (paired with `--include-package` in
661
+ `[tool.nuitka]` for imports guarded behind `try/except`).
662
+ """
663
+
592
664
  nuitka_unstable_targets: list[str] = field(
593
665
  default_factory=list,
594
666
  metadata={"click_extra.config_path": "nuitka.unstable-targets"},
@@ -57,16 +57,16 @@ jobs:
57
57
  run: git branch --all
58
58
  - name: List all commits
59
59
  run: git log --decorate=full --oneline
60
- - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
60
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
61
61
  - name: Run repomatic metadata
62
62
  id: metadata
63
63
  run: >
64
- uvx --no-progress 'repomatic==6.25.1' metadata
64
+ uvx --no-progress 'repomatic==6.26.0' metadata
65
65
  --format github-json --output "$GITHUB_OUTPUT"
66
66
  new_commits_matrix release_commits_matrix build_targets nuitka_matrix
67
- is_python_project package_name current_version released_version
68
- release_notes release_notes_with_admonition skip_binary_build
69
- manpages_script manpages_asset_name
67
+ nuitka_extras is_python_project package_name current_version
68
+ released_version release_notes release_notes_with_admonition
69
+ skip_binary_build manpages_script manpages_asset_name
70
70
  - name: Check VirusTotal API key
71
71
  id: check-vt-key
72
72
  env:
@@ -101,9 +101,26 @@ jobs:
101
101
  - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
102
102
  with:
103
103
  ref: ${{ matrix.commit }}
104
- - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
104
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
105
105
  - name: Setup venv
106
106
  run: uv --no-progress venv --python 3.14
107
+ - name: Sync optional-dependencies for Nuitka build
108
+ # Install the [project.optional-dependencies] extras listed in
109
+ # [tool.repomatic] nuitka.extras into the build venv, so Nuitka can
110
+ # bundle their packages. See the nuitka_extras docstring in
111
+ # repomatic/config.py for the full rationale.
112
+ if: fromJSON(needs.metadata.outputs.metadata).nuitka_extras
113
+ env:
114
+ EXTRAS: ${{ fromJSON(needs.metadata.outputs.metadata).nuitka_extras }}
115
+ shell: bash
116
+ run: |
117
+ # EXTRAS is a space-separated list emitted by Metadata.format_github_value.
118
+ flags=""
119
+ for extra in ${EXTRAS}; do
120
+ flags="${flags} --extra ${extra}"
121
+ done
122
+ # shellcheck disable=SC2086
123
+ uv --no-progress sync --frozen ${flags}
107
124
  - name: Pre-bake build metadata
108
125
  if: contains(matrix.current_version, '.dev')
109
126
  run: uvx --no-progress 'click-extra==7.18.0' prebake all
@@ -125,7 +142,7 @@ jobs:
125
142
  # NUITKA_PYTHON_FLAGS holds the entry point's --python-flag (if any),
126
143
  # meant to word-split.
127
144
  # shellcheck disable=SC2086
128
- uvx --no-progress 'repomatic==6.25.1' run nuitka -- \
145
+ uvx --no-progress 'repomatic==6.26.0' run nuitka -- \
129
146
  ${NUITKA_PYTHON_FLAGS} \
130
147
  --output-filename="${BIN_NAME}" "${MODULE_PATH}"
131
148
  - name: Upload Nuitka crash report
@@ -159,7 +176,7 @@ jobs:
159
176
  BIN_NAME: ${{ matrix.bin_name }}
160
177
  shell: bash
161
178
  run: >
162
- uvx --no-progress 'repomatic==6.25.1'
179
+ uvx --no-progress 'repomatic==6.26.0'
163
180
  verify-binary --target "${TARGET}" --binary "${BIN_NAME}"
164
181
  - name: Upload binaries
165
182
  uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
@@ -234,14 +251,14 @@ jobs:
234
251
  DOWNLOAD_PATH: ${{ steps.artifacts.outputs.download-path }}
235
252
  BIN_NAME: ${{ matrix.bin_name }}
236
253
  run: chmod +x "${DOWNLOAD_PATH}/${BIN_NAME}"
237
- - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
254
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
238
255
  - name: Run test plan for binary
239
256
  env:
240
257
  DOWNLOAD_PATH: ${{ steps.artifacts.outputs.download-path }}
241
258
  BIN_NAME: ${{ matrix.bin_name }}
242
259
  shell: bash
243
260
  run: >
244
- uvx --no-progress 'repomatic==6.25.1' test-plan
261
+ uvx --no-progress 'repomatic==6.26.0' test-plan
245
262
  --binary "${DOWNLOAD_PATH}/${BIN_NAME}"
246
263
 
247
264
  create-tag:
@@ -262,7 +279,7 @@ jobs:
262
279
  # PAT required so tag pushes trigger downstream on.push.tags workflows.
263
280
  # See repomatic/git_ops.py module docstring.
264
281
  token: ${{ secrets.REPOMATIC_PAT || github.token }}
265
- - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
282
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
266
283
  - name: Create and push tag
267
284
  # Idempotent: skips if tag already exists instead of failing. This allows re-running
268
285
  # workflows interrupted after tag creation.
@@ -270,7 +287,7 @@ jobs:
270
287
  CURRENT_VERSION: ${{ matrix.current_version }}
271
288
  COMMIT: ${{ matrix.commit }}
272
289
  run: >
273
- uvx --no-progress 'repomatic==6.25.1' git-tag
290
+ uvx --no-progress 'repomatic==6.26.0' git-tag
274
291
  --tag "v${CURRENT_VERSION}"
275
292
  --commit "${COMMIT}"
276
293
  --skip-existing
@@ -294,7 +311,7 @@ jobs:
294
311
  - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
295
312
  with:
296
313
  ref: ${{ matrix.commit }}
297
- - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
314
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
298
315
  with:
299
316
  enable-cache: false
300
317
  - name: Download Python package
@@ -311,7 +328,7 @@ jobs:
311
328
  continue-on-error: true
312
329
  env:
313
330
  GH_TOKEN: ${{ secrets.REPOMATIC_PAT || github.token }}
314
- run: uvx --no-progress 'repomatic==6.25.1' sync-dev-release --live --delete
331
+ run: uvx --no-progress 'repomatic==6.26.0' sync-dev-release --live --delete
315
332
  - name: Create GitHub release draft
316
333
  # Idempotent: skips if release already exists (e.g. workflow re-run).
317
334
  env:
@@ -409,7 +426,7 @@ jobs:
409
426
  - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
410
427
  with:
411
428
  ref: ${{ matrix.commit }}
412
- - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
429
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
413
430
  with:
414
431
  enable-cache: false
415
432
  - name: Install project
@@ -461,7 +478,7 @@ jobs:
461
478
  - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
462
479
  with:
463
480
  ref: ${{ matrix.commit }}
464
- - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
481
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
465
482
  with:
466
483
  enable-cache: false
467
484
  - name: Download release binaries
@@ -480,7 +497,7 @@ jobs:
480
497
  VIRUSTOTAL_API_KEY: ${{ secrets.VIRUSTOTAL_API_KEY }}
481
498
  CURRENT_VERSION: ${{ matrix.current_version }}
482
499
  run: >
483
- uvx --no-progress 'repomatic==6.25.1' scan-virustotal
500
+ uvx --no-progress 'repomatic==6.26.0' scan-virustotal
484
501
  --tag "v${CURRENT_VERSION}"
485
502
  --repo "${{ github.repository }}"
486
503
  --binaries-dir ./binaries
@@ -490,7 +507,7 @@ jobs:
490
507
  VIRUSTOTAL_API_KEY: ${{ secrets.VIRUSTOTAL_API_KEY }}
491
508
  CURRENT_VERSION: ${{ matrix.current_version }}
492
509
  run: >
493
- uvx --no-progress 'repomatic==6.25.1' scan-virustotal
510
+ uvx --no-progress 'repomatic==6.26.0' scan-virustotal
494
511
  --tag "v${CURRENT_VERSION}"
495
512
  --repo "${{ github.repository }}"
496
513
  --poll
@@ -515,7 +532,7 @@ jobs:
515
532
  contents: write
516
533
  steps:
517
534
  - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
518
- - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
535
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
519
536
  - name: Download all build artifacts
520
537
  uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
521
538
  with:
@@ -525,5 +542,5 @@ jobs:
525
542
  env:
526
543
  GH_TOKEN: ${{ github.token }}
527
544
  run: >
528
- uvx --no-progress 'repomatic==6.25.1' sync-dev-release --live
545
+ uvx --no-progress 'repomatic==6.26.0' sync-dev-release --live
529
546
  --upload-assets release_assets
@@ -27,7 +27,7 @@ inputs:
27
27
  runs:
28
28
  using: composite
29
29
  steps:
30
- - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
30
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
31
31
  with:
32
32
  enable-cache: false
33
33