repomatic 6.25.0__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.0 → repomatic-6.26.0}/PKG-INFO +4 -4
  2. {repomatic-6.25.0 → repomatic-6.26.0}/pyproject.toml +5 -18
  3. {repomatic-6.25.0 → repomatic-6.26.0}/readme.md +2 -1
  4. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/__init__.py +2 -2
  5. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/changelog.py +84 -0
  6. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/cli.py +48 -0
  7. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/config.py +79 -7
  8. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/_release-engine.yaml +37 -28
  9. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/action-publish-pypi.yaml +1 -1
  10. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/autofix.yaml +51 -59
  11. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/changelog.yaml +32 -34
  12. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/debug.yaml +3 -11
  13. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/docs.yaml +6 -14
  14. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/labels.yaml +13 -18
  15. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/lint.yaml +14 -22
  16. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/renovate.json5 +2 -2
  17. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/renovate.yaml +8 -20
  18. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-repomatic-changelog.md +7 -5
  19. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-repomatic-ship.md +1 -1
  20. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/tests.yaml +4 -21
  21. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/unsubscribe.yaml +2 -10
  22. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/init_project.py +185 -0
  23. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/metadata.py +28 -10
  24. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/release_prep.py +12 -7
  25. {repomatic-6.25.0 → repomatic-6.26.0}/license +0 -0
  26. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/__main__.py +0 -0
  27. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/binary.py +0 -0
  28. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/broken_links.py +0 -0
  29. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/cache.py +0 -0
  30. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/checksums.py +0 -0
  31. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/__init__.py +0 -0
  32. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/agent-grunt-qa.md +0 -0
  33. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/agent-qa-engineer.md +0 -0
  34. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/agent-sphinx-docs.md +0 -0
  35. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/autolock.yaml +0 -0
  36. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/ISSUE_TEMPLATE/config.yml +0 -0
  37. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/ISSUE_TEMPLATE/new-link.yaml +0 -0
  38. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/code-of-conduct.md +0 -0
  39. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/contributing.md +0 -0
  40. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/contributing.zh.md +0 -0
  41. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/funding.yml +0 -0
  42. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/awesome_template/.github/pull_request_template.md +0 -0
  43. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/awesome_template/__init__.py +0 -0
  44. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/awesome_template/license +0 -0
  45. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/bumpversion.toml +0 -0
  46. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/cancel-runs.yaml +0 -0
  47. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/codecov.yaml +0 -0
  48. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/labeller-content-based.yaml +0 -0
  49. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/labeller-file-based.yaml +0 -0
  50. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/labels.toml +0 -0
  51. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/lychee.toml +0 -0
  52. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/mdformat.toml +0 -0
  53. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/mypy.toml +0 -0
  54. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/pytest.toml +0 -0
  55. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/release.yaml +0 -0
  56. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/ruff.toml +0 -0
  57. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-av-false-positive.md +0 -0
  58. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-awesome-triage.md +0 -0
  59. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-babysit-ci.md +0 -0
  60. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-benchmark-update.md +0 -0
  61. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-brand-assets.md +0 -0
  62. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-file-bug-report.md +0 -0
  63. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-repomatic-audit.md +0 -0
  64. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-repomatic-deps.md +0 -0
  65. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-repomatic-init.md +0 -0
  66. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-repomatic-topics.md +0 -0
  67. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-sphinx-docs-sync.md +0 -0
  68. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-translation-sync.md +0 -0
  69. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/skill-upstream-audit.md +0 -0
  70. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/typos.toml +0 -0
  71. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/yamllint.yaml +0 -0
  72. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/data/zizmor.yaml +0 -0
  73. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/deps_graph.py +0 -0
  74. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/git_ops.py +0 -0
  75. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/__init__.py +0 -0
  76. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/actions.py +0 -0
  77. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/advisories.py +0 -0
  78. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/dev_release.py +0 -0
  79. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/gh.py +0 -0
  80. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/issue.py +0 -0
  81. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/matrix.py +0 -0
  82. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/pr.py +0 -0
  83. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/pr_body.py +0 -0
  84. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/release_sync.py +0 -0
  85. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/releases.py +0 -0
  86. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/status.py +0 -0
  87. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/token.py +0 -0
  88. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/unsubscribe.py +0 -0
  89. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/github/workflow_sync.py +0 -0
  90. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/images.py +0 -0
  91. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/lint_repo.py +0 -0
  92. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/mailmap.py +0 -0
  93. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/myst_converter.py +0 -0
  94. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/myst_docstrings.py +0 -0
  95. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/py.typed +0 -0
  96. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/pypi.py +0 -0
  97. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/pyproject.py +0 -0
  98. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/registry.py +0 -0
  99. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/renovate.py +0 -0
  100. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/rst_to_myst.py +0 -0
  101. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/sponsor.py +0 -0
  102. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/__init__.py +0 -0
  103. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/available-admonition.md +0 -0
  104. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/broken-links-issue.md +0 -0
  105. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/bump-version.md +0 -0
  106. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/detect-squash-merge.md +0 -0
  107. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/development-warning.md +0 -0
  108. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/fix-changelog.md +0 -0
  109. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/fix-typos.md +0 -0
  110. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/fix-vulnerable-deps.md +0 -0
  111. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/format-images.md +0 -0
  112. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/format-json.md +0 -0
  113. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/format-markdown.md +0 -0
  114. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/format-pyproject.md +0 -0
  115. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/format-python.md +0 -0
  116. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/format-shell.md +0 -0
  117. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/generated-footer.md +0 -0
  118. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/github-releases.md +0 -0
  119. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/immutable-releases.md +0 -0
  120. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/pr-metadata.md.noformat +0 -0
  121. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/prepare-release.md +0 -0
  122. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/refresh-tip.md +0 -0
  123. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/release-notes.md +0 -0
  124. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/release-sync-report.md +0 -0
  125. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/renovate-migration.md +0 -0
  126. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/setup-guide-branch-ruleset.md +0 -0
  127. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/setup-guide-dependabot.md +0 -0
  128. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/setup-guide-fork-pr-approval.md +0 -0
  129. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/setup-guide-pages-source.md +0 -0
  130. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/setup-guide-pypi-trusted-publisher.md +0 -0
  131. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/setup-guide-token.md +0 -0
  132. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/setup-guide-verify.md +0 -0
  133. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/setup-guide-virustotal.md +0 -0
  134. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/setup-guide.md +0 -0
  135. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/sync-bumpversion.md +0 -0
  136. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/sync-gitignore.md +0 -0
  137. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/sync-mailmap.md +0 -0
  138. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/sync-repomatic.md +0 -0
  139. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/sync-uv-lock.md +0 -0
  140. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/unavailable-admonition.md +0 -0
  141. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/unsubscribe-phase1.md +0 -0
  142. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/unsubscribe-phase2.md +0 -0
  143. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/update-deps-graph.md +0 -0
  144. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/update-docs.md +0 -0
  145. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/templates/yanked-admonition.md +0 -0
  146. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/test_matrix.py +0 -0
  147. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/test_plan.py +0 -0
  148. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/tool_runner.py +0 -0
  149. {repomatic-6.25.0 → repomatic-6.26.0}/repomatic/uv.py +0 -0
  150. {repomatic-6.25.0 → 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.0
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
@@ -45,7 +45,6 @@ Classifier: Topic :: Utilities
45
45
  Classifier: Typing :: Typed
46
46
  Requires-Dist: backports-strenum>=1 ; python_full_version < '3.11'
47
47
  Requires-Dist: boltons>=25
48
- Requires-Dist: bump-my-version>=1.2.6
49
48
  Requires-Dist: click-extra>=7.19
50
49
  Requires-Dist: extra-platforms>=12.0.2
51
50
  Requires-Dist: packaging>=17
@@ -59,7 +58,7 @@ Requires-Dist: wcmatch>=10
59
58
  Requires-Python: >=3.10
60
59
  Project-URL: Changelog, https://github.com/kdeldycke/repomatic/blob/main/changelog.md
61
60
  Project-URL: Documentation, https://kdeldycke.github.io/repomatic
62
- Project-URL: Download, https://github.com/kdeldycke/repomatic/releases/tag/v6.25.0
61
+ Project-URL: Download, https://github.com/kdeldycke/repomatic/releases/tag/v6.26.0
63
62
  Project-URL: Funding, https://github.com/sponsors/kdeldycke
64
63
  Project-URL: Homepage, https://github.com/kdeldycke/repomatic
65
64
  Project-URL: Issues, https://github.com/kdeldycke/repomatic/issues
@@ -73,8 +72,9 @@ Description-Content-Type: text/markdown
73
72
  [![Last release](https://img.shields.io/pypi/v/repomatic.svg)](https://pypi.org/project/repomatic/)
74
73
  [![Python versions](https://img.shields.io/pypi/pyversions/repomatic.svg)](https://pypi.org/project/repomatic/)
75
74
  [![Downloads](https://static.pepy.tech/badge/repomatic/month)](https://pepy.tech/projects/repomatic)
76
- [![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)
77
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)
78
78
 
79
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.
80
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.0"
8
+ version = "6.26.0"
9
9
  description = "🏭 Automate repository maintenance, releases, and CI/CD workflows"
10
10
  readme = "readme.md"
11
11
  keywords = [
@@ -79,9 +79,6 @@ dependencies = [
79
79
  "backports-strenum>=1; python_version<'3.11'",
80
80
  # boltons 25.0.0 dropped Python 3.9, matching our requires-python >= 3.10.
81
81
  "boltons>=25",
82
- # bumpversion.config.files.find_config_file() and bumpversion.show.resolve_name()
83
- # stabilized in 1.x; 1.2.6 fixes Click compatibility affecting our CLI integration.
84
- "bump-my-version>=1.2.6",
85
82
  # Click Extra 7.19.0 ships the `click-extra man --output-dir DIR SCRIPT` CLI
86
83
  # the release engine's manpages job shells out to.
87
84
  "click-extra>=7.19",
@@ -126,7 +123,7 @@ repomatic = "repomatic.__main__:main"
126
123
  [project.urls]
127
124
  "Changelog" = "https://github.com/kdeldycke/repomatic/blob/main/changelog.md"
128
125
  "Documentation" = "https://kdeldycke.github.io/repomatic"
129
- "Download" = "https://github.com/kdeldycke/repomatic/releases/tag/v6.25.0"
126
+ "Download" = "https://github.com/kdeldycke/repomatic/releases/tag/v6.26.0"
130
127
  "Funding" = "https://github.com/sponsors/kdeldycke"
131
128
  "Homepage" = "https://github.com/kdeldycke/repomatic"
132
129
  "Issues" = "https://github.com/kdeldycke/repomatic/issues"
@@ -185,16 +182,6 @@ typing = [
185
182
  [tool.uv]
186
183
  # Docs group requires Python >= 3.14 for recent MyST-Parser and click-extra features.
187
184
  dependency-groups.docs = { requires-python = ">= 3.14" }
188
- # bump-my-version 1.3.0 caps click at <8.4, which conflicts with click-extra
189
- # 7.19.0's click>=8.4.1 floor. Override the cap until upstream relaxes it
190
- # (callowayproject/bump-my-version#382 was the last bump, to <8.4). We only
191
- # import bump-my-version's config-loading helpers (get_configuration,
192
- # find_config_file, resolve_name), none of which touch click 8.4-sensitive
193
- # Sentinel handling, so the override is safe in practice.
194
- # NOTE: [tool.uv] override-dependencies is NOT read by `uvx --from .`
195
- # (tool invocations are isolated from project settings). Workflows propagate
196
- # this override via UV_OVERRIDE=uv-overrides.txt. See uv-overrides.txt.
197
- override-dependencies = [ "click>=8.4.1" ]
198
185
  # Cooldown period: 7-day buffer before using newly released packages.
199
186
  # Relative dates are fine here: uv 0.11.8+ writes a sentinel timestamp to
200
187
  # uv.lock for relative spans, so re-resolving never produces churn.
@@ -217,7 +204,7 @@ copyright = "Kevin Deldycke <kevin@deldycke.com> and contributors. Distributed u
217
204
  file-description = "🏭 Automate repository maintenance, releases, and CI/CD workflows"
218
205
  # Numeric only: Nuitka rejects PEP 440 .devN suffixes. Kept in sync with the
219
206
  # package version by the dedicated [tool.bumpversion] rule that strips the suffix.
220
- file-version = "6.25.0"
207
+ file-version = "6.26.0"
221
208
  include-data-dir = [
222
209
  "repomatic/data/awesome_template=repomatic/data/awesome_template",
223
210
  ]
@@ -235,7 +222,7 @@ include-package-data = [ "click_extra" ]
235
222
  linux-icon = "docs/assets/icon.png"
236
223
  macos-app-icon = "docs/assets/icon.icns"
237
224
  product-name = "Repomatic"
238
- product-version = "6.25.0"
225
+ product-version = "6.26.0"
239
226
  windows-icon-from-ico = "docs/assets/icon.ico"
240
227
 
241
228
  [tool.ruff]
@@ -319,7 +306,7 @@ run.source = [ "repomatic" ]
319
306
  report.precision = 2
320
307
 
321
308
  [tool.bumpversion]
322
- current_version = "6.25.0"
309
+ current_version = "6.26.0"
323
310
  allow_dirty = true
324
311
  ignore_missing_files = true
325
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.0"
21
- __git_tag_sha__ = "892e5b0a3889b2bc3591f4b6669802599c85e988"
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"},
@@ -22,14 +22,6 @@ name: 🚀 Build & release
22
22
 
23
23
  permissions: {}
24
24
 
25
- env:
26
- # bump-my-version caps click at <8.4; click-extra>=7.18 requires >=8.4.1.
27
- # [tool.uv] override-dependencies is not read by uvx --from ., so propagate
28
- # the override via UV_OVERRIDE. The override is safe: we only import
29
- # bump-my-version's config-loading helpers, none of which touch Click 8.4-
30
- # sensitive code. See uv-overrides.txt for the full rationale.
31
- UV_OVERRIDE: uv-overrides.txt
32
-
33
25
  concurrency:
34
26
  # Release commits get a unique SHA-based group so they can never be cancelled.
35
27
  # See repomatic/github/actions.py for rationale.
@@ -65,16 +57,16 @@ jobs:
65
57
  run: git branch --all
66
58
  - name: List all commits
67
59
  run: git log --decorate=full --oneline
68
- - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
60
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
69
61
  - name: Run repomatic metadata
70
62
  id: metadata
71
63
  run: >
72
- uvx --no-progress 'repomatic==6.25.0' metadata
64
+ uvx --no-progress 'repomatic==6.26.0' metadata
73
65
  --format github-json --output "$GITHUB_OUTPUT"
74
66
  new_commits_matrix release_commits_matrix build_targets nuitka_matrix
75
- is_python_project package_name current_version released_version
76
- release_notes release_notes_with_admonition skip_binary_build
77
- 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
78
70
  - name: Check VirusTotal API key
79
71
  id: check-vt-key
80
72
  env:
@@ -109,9 +101,26 @@ jobs:
109
101
  - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
110
102
  with:
111
103
  ref: ${{ matrix.commit }}
112
- - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
104
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
113
105
  - name: Setup venv
114
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}
115
124
  - name: Pre-bake build metadata
116
125
  if: contains(matrix.current_version, '.dev')
117
126
  run: uvx --no-progress 'click-extra==7.18.0' prebake all
@@ -133,7 +142,7 @@ jobs:
133
142
  # NUITKA_PYTHON_FLAGS holds the entry point's --python-flag (if any),
134
143
  # meant to word-split.
135
144
  # shellcheck disable=SC2086
136
- uvx --no-progress 'repomatic==6.25.0' run nuitka -- \
145
+ uvx --no-progress 'repomatic==6.26.0' run nuitka -- \
137
146
  ${NUITKA_PYTHON_FLAGS} \
138
147
  --output-filename="${BIN_NAME}" "${MODULE_PATH}"
139
148
  - name: Upload Nuitka crash report
@@ -167,7 +176,7 @@ jobs:
167
176
  BIN_NAME: ${{ matrix.bin_name }}
168
177
  shell: bash
169
178
  run: >
170
- uvx --no-progress 'repomatic==6.25.0'
179
+ uvx --no-progress 'repomatic==6.26.0'
171
180
  verify-binary --target "${TARGET}" --binary "${BIN_NAME}"
172
181
  - name: Upload binaries
173
182
  uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
@@ -242,14 +251,14 @@ jobs:
242
251
  DOWNLOAD_PATH: ${{ steps.artifacts.outputs.download-path }}
243
252
  BIN_NAME: ${{ matrix.bin_name }}
244
253
  run: chmod +x "${DOWNLOAD_PATH}/${BIN_NAME}"
245
- - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
254
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
246
255
  - name: Run test plan for binary
247
256
  env:
248
257
  DOWNLOAD_PATH: ${{ steps.artifacts.outputs.download-path }}
249
258
  BIN_NAME: ${{ matrix.bin_name }}
250
259
  shell: bash
251
260
  run: >
252
- uvx --no-progress 'repomatic==6.25.0' test-plan
261
+ uvx --no-progress 'repomatic==6.26.0' test-plan
253
262
  --binary "${DOWNLOAD_PATH}/${BIN_NAME}"
254
263
 
255
264
  create-tag:
@@ -270,7 +279,7 @@ jobs:
270
279
  # PAT required so tag pushes trigger downstream on.push.tags workflows.
271
280
  # See repomatic/git_ops.py module docstring.
272
281
  token: ${{ secrets.REPOMATIC_PAT || github.token }}
273
- - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
282
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
274
283
  - name: Create and push tag
275
284
  # Idempotent: skips if tag already exists instead of failing. This allows re-running
276
285
  # workflows interrupted after tag creation.
@@ -278,7 +287,7 @@ jobs:
278
287
  CURRENT_VERSION: ${{ matrix.current_version }}
279
288
  COMMIT: ${{ matrix.commit }}
280
289
  run: >
281
- uvx --no-progress 'repomatic==6.25.0' git-tag
290
+ uvx --no-progress 'repomatic==6.26.0' git-tag
282
291
  --tag "v${CURRENT_VERSION}"
283
292
  --commit "${COMMIT}"
284
293
  --skip-existing
@@ -302,7 +311,7 @@ jobs:
302
311
  - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
303
312
  with:
304
313
  ref: ${{ matrix.commit }}
305
- - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
314
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
306
315
  with:
307
316
  enable-cache: false
308
317
  - name: Download Python package
@@ -319,7 +328,7 @@ jobs:
319
328
  continue-on-error: true
320
329
  env:
321
330
  GH_TOKEN: ${{ secrets.REPOMATIC_PAT || github.token }}
322
- run: uvx --no-progress 'repomatic==6.25.0' sync-dev-release --live --delete
331
+ run: uvx --no-progress 'repomatic==6.26.0' sync-dev-release --live --delete
323
332
  - name: Create GitHub release draft
324
333
  # Idempotent: skips if release already exists (e.g. workflow re-run).
325
334
  env:
@@ -417,7 +426,7 @@ jobs:
417
426
  - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
418
427
  with:
419
428
  ref: ${{ matrix.commit }}
420
- - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
429
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
421
430
  with:
422
431
  enable-cache: false
423
432
  - name: Install project
@@ -469,7 +478,7 @@ jobs:
469
478
  - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
470
479
  with:
471
480
  ref: ${{ matrix.commit }}
472
- - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
481
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
473
482
  with:
474
483
  enable-cache: false
475
484
  - name: Download release binaries
@@ -488,7 +497,7 @@ jobs:
488
497
  VIRUSTOTAL_API_KEY: ${{ secrets.VIRUSTOTAL_API_KEY }}
489
498
  CURRENT_VERSION: ${{ matrix.current_version }}
490
499
  run: >
491
- uvx --no-progress 'repomatic==6.25.0' scan-virustotal
500
+ uvx --no-progress 'repomatic==6.26.0' scan-virustotal
492
501
  --tag "v${CURRENT_VERSION}"
493
502
  --repo "${{ github.repository }}"
494
503
  --binaries-dir ./binaries
@@ -498,7 +507,7 @@ jobs:
498
507
  VIRUSTOTAL_API_KEY: ${{ secrets.VIRUSTOTAL_API_KEY }}
499
508
  CURRENT_VERSION: ${{ matrix.current_version }}
500
509
  run: >
501
- uvx --no-progress 'repomatic==6.25.0' scan-virustotal
510
+ uvx --no-progress 'repomatic==6.26.0' scan-virustotal
502
511
  --tag "v${CURRENT_VERSION}"
503
512
  --repo "${{ github.repository }}"
504
513
  --poll
@@ -523,7 +532,7 @@ jobs:
523
532
  contents: write
524
533
  steps:
525
534
  - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
526
- - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
535
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
527
536
  - name: Download all build artifacts
528
537
  uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
529
538
  with:
@@ -533,5 +542,5 @@ jobs:
533
542
  env:
534
543
  GH_TOKEN: ${{ github.token }}
535
544
  run: >
536
- uvx --no-progress 'repomatic==6.25.0' sync-dev-release --live
545
+ uvx --no-progress 'repomatic==6.26.0' sync-dev-release --live
537
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