repomatic 7.4.0__tar.gz → 7.5.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 (166) hide show
  1. {repomatic-7.4.0 → repomatic-7.5.0}/PKG-INFO +17 -6
  2. {repomatic-7.4.0 → repomatic-7.5.0}/pyproject.toml +13 -10
  3. {repomatic-7.4.0 → repomatic-7.5.0}/pyproject.toml.orig +22 -11
  4. {repomatic-7.4.0 → repomatic-7.5.0}/readme.md +15 -4
  5. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/__init__.py +2 -2
  6. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/binaries_page.py +9 -14
  7. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/broken_links.py +6 -20
  8. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/changelog.py +0 -3
  9. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/cli.py +460 -419
  10. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/config.py +183 -15
  11. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/_release-engine.yaml +151 -28
  12. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/action-publish-pypi.yaml +34 -0
  13. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/agent-sphinx-docs.md +28 -12
  14. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/autofix.yaml +153 -106
  15. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/autolock.yaml +11 -0
  16. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/cancel-runs.yaml +13 -1
  17. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/changelog.yaml +65 -21
  18. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/debug.yaml +17 -2
  19. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/docs.yaml +30 -7
  20. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/labels.yaml +26 -5
  21. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/lint.yaml +45 -12
  22. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/release.yaml +11 -0
  23. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/ruff.toml +6 -3
  24. repomatic-7.4.0/repomatic/data/skill-av-false-positive.md → repomatic-7.5.0/repomatic/data/skills/av-false-positive/SKILL.md +2 -3
  25. repomatic-7.4.0/repomatic/data/skill-awesome-triage.md → repomatic-7.5.0/repomatic/data/skills/awesome-triage/SKILL.md +2 -3
  26. repomatic-7.4.0/repomatic/data/skill-babysit-ci.md → repomatic-7.5.0/repomatic/data/skills/babysit-ci/SKILL.md +21 -10
  27. repomatic-7.4.0/repomatic/data/skill-benchmark-update.md → repomatic-7.5.0/repomatic/data/skills/benchmark-update/SKILL.md +2 -3
  28. repomatic-7.4.0/repomatic/data/skill-brand-assets.md → repomatic-7.5.0/repomatic/data/skills/brand-assets/SKILL.md +1 -1
  29. repomatic-7.4.0/repomatic/data/skill-file-bug-report.md → repomatic-7.5.0/repomatic/data/skills/file-bug-report/SKILL.md +2 -2
  30. repomatic-7.4.0/repomatic/data/skill-repomatic-audit.md → repomatic-7.5.0/repomatic/data/skills/repomatic-audit/SKILL.md +2 -2
  31. repomatic-7.4.0/repomatic/data/skill-repomatic-changelog.md → repomatic-7.5.0/repomatic/data/skills/repomatic-changelog/SKILL.md +7 -5
  32. repomatic-7.4.0/repomatic/data/skill-repomatic-deps.md → repomatic-7.5.0/repomatic/data/skills/repomatic-deps/SKILL.md +3 -3
  33. repomatic-7.4.0/repomatic/data/skill-repomatic-init.md → repomatic-7.5.0/repomatic/data/skills/repomatic-init/SKILL.md +3 -3
  34. repomatic-7.4.0/repomatic/data/skill-repomatic-ship.md → repomatic-7.5.0/repomatic/data/skills/repomatic-ship/SKILL.md +35 -20
  35. repomatic-7.4.0/repomatic/data/skill-repomatic-topics.md → repomatic-7.5.0/repomatic/data/skills/repomatic-topics/SKILL.md +2 -3
  36. repomatic-7.4.0/repomatic/data/skill-sphinx-docs-sync.md → repomatic-7.5.0/repomatic/data/skills/sphinx-docs-sync/SKILL.md +2 -3
  37. repomatic-7.4.0/repomatic/data/skill-translation-sync.md → repomatic-7.5.0/repomatic/data/skills/translation-sync/SKILL.md +2 -3
  38. repomatic-7.4.0/repomatic/data/skill-upstream-audit.md → repomatic-7.5.0/repomatic/data/skills/upstream-audit/SKILL.md +2 -3
  39. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/tests.yaml +43 -4
  40. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/unsubscribe.yaml +13 -1
  41. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/uv.toml +5 -2
  42. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/dep_sources.py +92 -2
  43. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/docs.py +1 -1
  44. repomatic-7.5.0/repomatic/frontmatter.py +70 -0
  45. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/gh.py +31 -0
  46. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/issue.py +37 -6
  47. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/pr_body.py +66 -33
  48. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/release_sync.py +16 -16
  49. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/releases.py +69 -0
  50. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/unsubscribe.py +40 -79
  51. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/workflow_sync.py +204 -67
  52. repomatic-7.5.0/repomatic/humanize.py +63 -0
  53. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/images.py +39 -16
  54. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/init_project.py +228 -91
  55. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/labels.py +50 -11
  56. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/lint_repo.py +61 -127
  57. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/metadata.py +38 -434
  58. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/prepare_release.py +79 -12
  59. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/pypi.py +41 -14
  60. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/registry.py +340 -283
  61. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/setup_guide.py +9 -23
  62. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/sync_ops.py +193 -59
  63. repomatic-7.4.0/repomatic/templates/prepare-release.md → repomatic-7.5.0/repomatic/templates/prepare-release.md.noformat +3 -7
  64. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/sync-tool-versions.md +1 -1
  65. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/tool_registry.py +276 -40
  66. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/tool_runner.py +186 -8
  67. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/uv.py +38 -9
  68. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/version_sync.py +138 -3
  69. {repomatic-7.4.0 → repomatic-7.5.0}/license +0 -0
  70. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/__main__.py +0 -0
  71. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/binary.py +0 -0
  72. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/bundle.py +0 -0
  73. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/cache.py +0 -0
  74. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/checksums.py +0 -0
  75. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/compat.py +0 -0
  76. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/__init__.py +0 -0
  77. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/agent-grunt-qa.md +0 -0
  78. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/agent-qa-engineer.md +0 -0
  79. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/awesome_template/.github/ISSUE_TEMPLATE/config.yml +0 -0
  80. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/awesome_template/.github/ISSUE_TEMPLATE/new-link.yaml +0 -0
  81. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/awesome_template/.github/code-of-conduct.md +0 -0
  82. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/awesome_template/.github/contributing.md +0 -0
  83. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/awesome_template/.github/contributing.zh.md +0 -0
  84. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/awesome_template/.github/funding.yml +0 -0
  85. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/awesome_template/.github/pull_request_template.md +0 -0
  86. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/awesome_template/__init__.py +0 -0
  87. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/awesome_template/license +0 -0
  88. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/bumpversion.toml +0 -0
  89. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/codecov.yaml +0 -0
  90. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/labeller-content-based.yaml +0 -0
  91. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/labeller-file-based.yaml +0 -0
  92. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/labels.toml +0 -0
  93. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/lychee.toml +0 -0
  94. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/mdformat.toml +0 -0
  95. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/mypy.toml +0 -0
  96. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/pytest.toml +0 -0
  97. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/typos.toml +0 -0
  98. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/yamllint.yaml +0 -0
  99. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/data/zizmor.yaml +0 -0
  100. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/dep_graph.py +0 -0
  101. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/dep_report.py +0 -0
  102. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/git_ops.py +0 -0
  103. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/__init__.py +0 -0
  104. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/actions.py +0 -0
  105. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/dev_release.py +0 -0
  106. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/matrix.py +0 -0
  107. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/sponsor.py +0 -0
  108. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/status.py +0 -0
  109. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/github/token.py +0 -0
  110. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/gitignore.py +0 -0
  111. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/http.py +0 -0
  112. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/mailmap.py +0 -0
  113. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/matrix_axes.py +0 -0
  114. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/npm.py +0 -0
  115. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/py.typed +0 -0
  116. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/pyproject.py +0 -0
  117. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/__init__.py +0 -0
  118. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/available-admonition.md +0 -0
  119. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/broken-links-issue.md +0 -0
  120. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/bump-version.md +0 -0
  121. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/detect-squash-merge.md +0 -0
  122. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/development-warning.md +0 -0
  123. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/fix-changelog.md +0 -0
  124. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/fix-typos.md +0 -0
  125. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/fix-vulnerable-deps.md +0 -0
  126. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/format-images.md +0 -0
  127. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/format-json.md +0 -0
  128. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/format-markdown.md +0 -0
  129. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/format-pyproject.md +0 -0
  130. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/format-python.md +0 -0
  131. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/format-shell.md +0 -0
  132. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/generated-footer.md +0 -0
  133. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/github-releases.md +0 -0
  134. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/immutable-releases.md +0 -0
  135. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/pr-metadata.md.noformat +0 -0
  136. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/refresh-tip.md +0 -0
  137. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/release-notes.md +0 -0
  138. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/release-sync-report.md +0 -0
  139. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide-branch-ruleset.md +0 -0
  140. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide-dependabot.md +0 -0
  141. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide-fork-pr-approval.md +0 -0
  142. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide-notifications-pat.md +0 -0
  143. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide-pages-source.md +0 -0
  144. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide-pypi-trusted-publisher.md +0 -0
  145. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide-sha-pinning-required.md +0 -0
  146. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide-token.md +0 -0
  147. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide-verify.md +0 -0
  148. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide-virustotal.md +0 -0
  149. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/setup-guide.md +0 -0
  150. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/sync-action-pins.md +0 -0
  151. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/sync-bumpversion.md +0 -0
  152. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/sync-dep-sources.md +0 -0
  153. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/sync-gitignore.md +0 -0
  154. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/sync-mailmap.md +0 -0
  155. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/sync-repomatic.md +0 -0
  156. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/sync-uv-lock.md +0 -0
  157. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/sync-workflow-pins.md +0 -0
  158. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/unavailable-admonition.md +0 -0
  159. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/unsubscribe-phase1.md +0 -0
  160. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/unsubscribe-phase2.md +0 -0
  161. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/update-dep-graph.md +0 -0
  162. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/update-docs.md +0 -0
  163. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/templates/yanked-admonition.md +0 -0
  164. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/tool_runner_page.py +0 -0
  165. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/virustotal.py +0 -0
  166. {repomatic-7.4.0 → repomatic-7.5.0}/repomatic/vulnerable_deps.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: repomatic
3
- Version: 7.4.0
3
+ Version: 7.5.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,repository-automation,repository-management,reusable-workflows,software-factory,sphinx-doc,typo,uv,workflow-reusable
6
6
  Author: Kevin Deldycke
@@ -59,7 +59,7 @@ Requires-Dist: wcmatch>=10
59
59
  Requires-Python: >=3.10
60
60
  Project-URL: Changelog, https://github.com/kdeldycke/repomatic/blob/main/changelog.md
61
61
  Project-URL: Documentation, https://kdeldycke.github.io/repomatic
62
- Project-URL: Download, https://github.com/kdeldycke/repomatic/releases/tag/v7.4.0
62
+ Project-URL: Download, https://github.com/kdeldycke/repomatic/releases/tag/v7.5.0
63
63
  Project-URL: Funding, https://github.com/sponsors/kdeldycke
64
64
  Project-URL: Homepage, https://github.com/kdeldycke/repomatic
65
65
  Project-URL: Issues, https://github.com/kdeldycke/repomatic/issues
@@ -77,7 +77,7 @@ Description-Content-Type: text/markdown
77
77
  [![Coverage status](https://codecov.io/gh/kdeldycke/repomatic/branch/main/graph/badge.svg)](https://app.codecov.io/gh/kdeldycke/repomatic)
78
78
  [![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)
79
79
 
80
- 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
+ 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. Every step is a CLI command: reusable GitHub Actions workflows are only the trigger, so the same automation runs on your machine.
81
81
 
82
82
  **Maintainer-in-the-loop**: nothing is done behind your back. A PR or issue is created every time a change is proposed or action is needed.
83
83
 
@@ -99,8 +99,10 @@ A Python CLI and `pyproject.toml` configuration that let you **release Python pa
99
99
 
100
100
  ## Why repomatic
101
101
 
102
+ repomatic does for the release process what ruff did for linting and uv did for packaging: replace a stack of single-purpose tools with one.
103
+
102
104
  - [18 third-party GitHub Actions replaced](https://kdeldycke.github.io/repomatic/security.html#third-party-action-minimization) by internal CLI commands and SHA-256-verified binary downloads, keeping the supply chain attack surface minimal
103
- - [8 Python linters and formatters](https://kdeldycke.github.io/repomatic/security.html#ruff-consolidation) (pylint, black, isort, pyupgrade, pydocstyle, pycln, docformatter, blacken-docs) consolidated into ruff
105
+ - [10 Python linters and formatters](https://kdeldycke.github.io/repomatic/security.html#ruff-consolidation) (pylint, pydocstyle, pycln, pyupgrade, isort, black, docformatter, mdformat-black, blacken-docs, mdformat-ruff) consolidated into ruff
104
106
  - [5 packaging and install tools](https://kdeldycke.github.io/repomatic/security.html#uv-consolidation) (poetry, build, twine, check-wheel-contents, pip-audit) consolidated into uv
105
107
  - All `uses:` references [pinned to full commit SHAs](https://kdeldycke.github.io/repomatic/security.html#supply-chain-security) with stabilization windows before adopting new versions, managed entirely by self-hosted sync jobs
106
108
  - [SLSA provenance attestations](https://kdeldycke.github.io/repomatic/security.html#supply-chain-security) on every release artifact (wheels and compiled binaries)
@@ -110,7 +112,8 @@ A Python CLI and `pyproject.toml` configuration that let you **release Python pa
110
112
  - Workflow security linting with [`zizmor`](https://kdeldycke.github.io/repomatic/workflows.html#github-workflows-lint-yaml-jobs) on every push to catch dangerous triggers and excessive permissions
111
113
  - Credential scanning with [`gitleaks`](https://kdeldycke.github.io/repomatic/workflows.html#github-workflows-lint-yaml-jobs) to prevent secret leakage
112
114
  - Single [`pyproject.toml` configuration](https://kdeldycke.github.io/repomatic/configuration.html): no extra dotfiles, no JSON configs, no YAML presets to maintain
113
- - [15+ code quality tools](https://kdeldycke.github.io/repomatic/tool-runner.html) (ruff, mypy, biome, typos, mdformat, shfmt, yamllint, actionlint, lychee, oxipng, jpegoptim, pyproject-fmt, labelmaker, gitleaks, zizmor) managed through one `repomatic run <tool>` interface with automatic installation and platform-specific binary caching
115
+ - The CLI itself [ships as standalone binaries](https://kdeldycke.github.io/repomatic/install.html#executables) (Linux / macOS / Windows, x86_64 / arm64): no Python environment needed to run it
116
+ - [15+ code quality tools](https://kdeldycke.github.io/repomatic/tool-runner.html) (ruff, mypy, biome, typos, mdformat, shfmt, yamllint, actionlint, lychee, oxipng, pyproject-fmt, labelmaker, gitleaks, zizmor) managed through one `repomatic run <tool>` interface with automatic installation and platform-specific binary caching
114
117
 
115
118
  ## Quick start
116
119
 
@@ -124,6 +127,13 @@ $ git push
124
127
 
125
128
  Works for new and existing repositories. Managed files are always regenerated to the latest version; `changelog.md` is never overwritten. Push, and the workflows guide you through remaining setup via issues and PRs.
126
129
 
130
+ The workflows only call CLI commands, so every automated step can also be run and previewed locally:
131
+
132
+ ```shell-session
133
+ $ uvx -- repomatic sync-deps --dry-run
134
+ $ uvx -- repomatic run ruff -- check
135
+ ```
136
+
127
137
  See `repomatic init --help` for available components and options.
128
138
 
129
139
  ## Documentation
@@ -133,10 +143,11 @@ See the **[full documentation](https://kdeldycke.github.io/repomatic/)** for:
133
143
  - [Installation methods and executables](https://kdeldycke.github.io/repomatic/install.html)
134
144
  - [`[tool.repomatic]` configuration reference](https://kdeldycke.github.io/repomatic/configuration.html)
135
145
  - [CLI parameters](https://kdeldycke.github.io/repomatic/cli.html)
136
- - [Reusable workflow reference](https://kdeldycke.github.io/repomatic/workflows.html) (all 13 workflows with job descriptions)
146
+ - [Reusable workflow reference](https://kdeldycke.github.io/repomatic/workflows.html) (all 14 workflows with job descriptions)
137
147
  - [Security practices and token setup](https://kdeldycke.github.io/repomatic/security.html)
138
148
  - [Claude Code skills](https://kdeldycke.github.io/repomatic/skills.html)
139
149
  - [API reference](https://kdeldycke.github.io/repomatic/repomatic.html)
150
+ - [Project history](https://kdeldycke.github.io/repomatic/history.html)
140
151
 
141
152
  ## Used in
142
153
 
@@ -1,10 +1,10 @@
1
1
  [build-system]
2
2
  build-backend = "uv_build"
3
- requires = ["uv-build>=0.12"]
3
+ requires = ["uv-build>=0.8"]
4
4
 
5
5
  [project]
6
6
  name = "repomatic"
7
- version = "7.4.0"
7
+ version = "7.5.0"
8
8
  description = "🏭 Automate repository maintenance, releases, and CI/CD workflows"
9
9
  readme = "readme.md"
10
10
  keywords = [
@@ -92,7 +92,7 @@ email = "kevin@deldycke.com"
92
92
  [project.urls]
93
93
  Changelog = "https://github.com/kdeldycke/repomatic/blob/main/changelog.md"
94
94
  Documentation = "https://kdeldycke.github.io/repomatic"
95
- Download = "https://github.com/kdeldycke/repomatic/releases/tag/v7.4.0"
95
+ Download = "https://github.com/kdeldycke/repomatic/releases/tag/v7.5.0"
96
96
  Funding = "https://github.com/sponsors/kdeldycke"
97
97
  Homepage = "https://github.com/kdeldycke/repomatic"
98
98
  Issues = "https://github.com/kdeldycke/repomatic/issues"
@@ -119,6 +119,7 @@ docs = [
119
119
  "sphinx-copybutton>=0.5.2",
120
120
  "sphinx-datatables>=1",
121
121
  "sphinx-design>=0.6",
122
+ "sphinxcontrib-jquery>=4",
122
123
  "sphinxcontrib-mermaid>=1.2.3",
123
124
  "sphinxext-opengraph>=0.13",
124
125
  ]
@@ -130,15 +131,13 @@ typing = [
130
131
  ]
131
132
 
132
133
  [tool.uv]
133
- required-version = ">=0.12"
134
+ required-version = ">=0.11.15"
134
135
  exclude-newer = "1 week"
135
136
 
136
137
  [tool.uv.dependency-groups.docs]
137
138
  requires-python = ">= 3.14"
138
139
 
139
140
  [tool.uv.exclude-newer-package]
140
- click-extra = "2026-08-02T00:00:00Z"
141
- extra-platforms = "2026-07-28T00:00:00Z"
142
141
  repomatic = "0 day"
143
142
 
144
143
  [tool.uv.build-backend]
@@ -147,14 +146,17 @@ module-root = ""
147
146
  [tool.nuitka]
148
147
  copyright = "Kevin Deldycke <kevin@deldycke.com> and contributors. Distributed under GPL-2.0-or-later license."
149
148
  file-description = "🏭 Automate repository maintenance, releases, and CI/CD workflows"
150
- file-version = "7.4.0"
151
- include-data-dir = ["repomatic/data/awesome_template=repomatic/data/awesome_template"]
149
+ file-version = "7.5.0"
150
+ include-data-dir = [
151
+ "repomatic/data/awesome_template=repomatic/data/awesome_template",
152
+ "repomatic/data/skills=repomatic/data/skills",
153
+ ]
152
154
  include-data-files = ["repomatic/templates/*.md=repomatic/templates/"]
153
155
  include-package-data = ["click_extra"]
154
156
  linux-icon = "docs/assets/icon.png"
155
157
  macos-app-icon = "docs/assets/icon.icns"
156
158
  product-name = "Repomatic"
157
- product-version = "7.4.0"
159
+ product-version = "7.5.0"
158
160
  windows-icon-from-ico = "docs/assets/icon.ico"
159
161
 
160
162
  [tool.ruff]
@@ -162,6 +164,7 @@ preview = true
162
164
  fix = true
163
165
  unsafe-fixes = false
164
166
  show-fixes = true
167
+ output-prefer-rule-codes = true
165
168
 
166
169
  [tool.ruff.format]
167
170
  docstring-code-format = true
@@ -244,7 +247,7 @@ source = ["repomatic"]
244
247
  precision = 2
245
248
 
246
249
  [tool.bumpversion]
247
- current_version = "7.4.0"
250
+ current_version = "7.5.0"
248
251
  parse = '(?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)(\.dev(?P<dev>\d+))?'
249
252
  serialize = [
250
253
  "{major}.{minor}.{patch}.dev{dev}",
@@ -7,12 +7,12 @@ build-backend = "uv_build"
7
7
  # repomatic runs across the ecosystem, where uv versions drift between projects,
8
8
  # and a hard ceiling risks a chicken-and-egg deadlock when one project's uv
9
9
  # moves ahead of repomatic's next release.
10
- requires = [ "uv-build>=0.12" ]
10
+ requires = [ "uv-build>=0.8" ]
11
11
 
12
12
  [project]
13
13
  # Docs: https://packaging.python.org/en/latest/guides/writing-pyproject-toml/
14
14
  name = "repomatic"
15
- version = "7.4.0"
15
+ version = "7.5.0"
16
16
  description = "🏭 Automate repository maintenance, releases, and CI/CD workflows"
17
17
  readme = "readme.md"
18
18
  keywords = [
@@ -145,7 +145,7 @@ dependencies = [
145
145
  ]
146
146
  urls.Changelog = "https://github.com/kdeldycke/repomatic/blob/main/changelog.md"
147
147
  urls.Documentation = "https://kdeldycke.github.io/repomatic"
148
- urls.Download = "https://github.com/kdeldycke/repomatic/releases/tag/v7.4.0"
148
+ urls.Download = "https://github.com/kdeldycke/repomatic/releases/tag/v7.5.0"
149
149
  urls.Funding = "https://github.com/sponsors/kdeldycke"
150
150
  urls.Homepage = "https://github.com/kdeldycke/repomatic"
151
151
  urls.Issues = "https://github.com/kdeldycke/repomatic/issues"
@@ -190,6 +190,10 @@ docs = [
190
190
  "sphinx-datatables>=1",
191
191
  # sphinx-design 0.6 introduced the current directive syntax for cards, grids, and tabs.
192
192
  "sphinx-design>=0.6",
193
+ # sphinxcontrib-jquery is loaded explicitly in docs/conf.py (sphinx-datatables
194
+ # activates it too late to register jquery.js on its own); declare it so the
195
+ # build never relies on it arriving only transitively via sphinx-datatables.
196
+ "sphinxcontrib-jquery>=4",
193
197
  # sphinxcontrib-mermaid 1.2.3 fixed mermaid_d3_zoom configuration support.
194
198
  "sphinxcontrib-mermaid>=1.2.3",
195
199
  # sphinxext-opengraph 0.13 stabilized OpenGraph metadata generation for Sphinx 8+.
@@ -216,12 +220,15 @@ typing = [
216
220
  # self-updates). uv.lock stays stable across minors because sync-uv-lock
217
221
  # discards a re-lock that only re-spells equivalent markers (see
218
222
  # repomatic.uv.sync_uv_lock).
219
- required-version = ">=0.12"
223
+ required-version = ">=0.11.15"
220
224
  # Docs group requires Python >= 3.14 for recent MyST-Parser and click-extra features.
221
225
  dependency-groups.docs = { requires-python = ">= 3.14" }
222
- # Cooldown period: 7-day buffer before using newly released packages.
223
- # Relative dates are fine here: uv 0.11.8+ writes a sentinel timestamp to
224
- # uv.lock for relative spans, so re-resolving never produces churn.
226
+ # Cooldown period before using newly released packages. Kept equal to
227
+ # `[tool.repomatic] minimum-release-age`: that value gates the `uvx` installs
228
+ # every workflow runs, and a wider window here would lock a version those
229
+ # installs refuse to resolve. Relative dates are fine: uv 0.11.8+ writes a
230
+ # sentinel timestamp to uv.lock for relative spans, so re-resolving never
231
+ # produces churn.
225
232
  exclude-newer = "1 week"
226
233
  # Per-package cooldown control. A fixed date holds a package at the version
227
234
  # available then (the day after it shipped), so `uv lock --upgrade` keeps that
@@ -230,7 +237,7 @@ exclude-newer = "1 week"
230
237
  # `exclude-newer`, returning the package to the normal cooldown. repomatic is
231
238
  # pinned to git main (no PyPI release to freeze), so it keeps a permanent
232
239
  # "0 day" span.
233
- exclude-newer-package = { click-extra = "2026-08-02T00:00:00Z", extra-platforms = "2026-07-28T00:00:00Z", repomatic = "0 day" }
240
+ exclude-newer-package = { repomatic = "0 day" }
234
241
  # Package is at root level, not in "./src/".
235
242
  build-backend.module-root = ""
236
243
 
@@ -243,9 +250,10 @@ copyright = "Kevin Deldycke <kevin@deldycke.com> and contributors. Distributed u
243
250
  file-description = "🏭 Automate repository maintenance, releases, and CI/CD workflows"
244
251
  # Numeric only: Nuitka rejects PEP 440 .devN suffixes. Kept in sync with the
245
252
  # package version by the dedicated [tool.bumpversion] rule that strips the suffix.
246
- file-version = "7.4.0"
253
+ file-version = "7.5.0"
247
254
  include-data-dir = [
248
255
  "repomatic/data/awesome_template=repomatic/data/awesome_template",
256
+ "repomatic/data/skills=repomatic/data/skills",
249
257
  ]
250
258
  include-data-files = [
251
259
  "repomatic/templates/*.md=repomatic/templates/",
@@ -261,7 +269,7 @@ include-package-data = [ "click_extra" ]
261
269
  linux-icon = "docs/assets/icon.png"
262
270
  macos-app-icon = "docs/assets/icon.icns"
263
271
  product-name = "Repomatic"
264
- product-version = "7.4.0"
272
+ product-version = "7.5.0"
265
273
  windows-icon-from-ico = "docs/assets/icon.ico"
266
274
 
267
275
  [tool.ruff]
@@ -295,6 +303,9 @@ lint.isort.combine-as-imports = true
295
303
  # this would simplify a fix or enable a new diagnostic.
296
304
  # https://docs.astral.sh/ruff/settings/#lint_future-annotations
297
305
  lint.future-annotations = true
306
+ # Report rule codes, not the human-readable names preview mode defaults to.
307
+ # See the bundled repomatic/data/ruff.toml for the rationale.
308
+ output-prefer-rule-codes = true
298
309
 
299
310
  [tool.typos]
300
311
  default.extend-identifiers = { Github = "GitHub", IOS = "iOS", Javascript = "JavaScript", MacOS = "macOS", PNGs = "PNGs", PyPi = "PyPI", Typescript = "TypeScript" }
@@ -383,7 +394,7 @@ run.source = [ "repomatic" ]
383
394
  report.precision = 2
384
395
 
385
396
  [tool.bumpversion]
386
- current_version = "7.4.0"
397
+ current_version = "7.5.0"
387
398
  # Parse versions with an optional .devN suffix (PEP 440).
388
399
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)(\\.dev(?P<dev>\\d+))?"
389
400
  serialize = [
@@ -9,7 +9,7 @@
9
9
  [![Coverage status](https://codecov.io/gh/kdeldycke/repomatic/branch/main/graph/badge.svg)](https://app.codecov.io/gh/kdeldycke/repomatic)
10
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)
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
+ 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. Every step is a CLI command: reusable GitHub Actions workflows are only the trigger, so the same automation runs on your machine.
13
13
 
14
14
  **Maintainer-in-the-loop**: nothing is done behind your back. A PR or issue is created every time a change is proposed or action is needed.
15
15
 
@@ -31,8 +31,10 @@ A Python CLI and `pyproject.toml` configuration that let you **release Python pa
31
31
 
32
32
  ## Why repomatic
33
33
 
34
+ repomatic does for the release process what ruff did for linting and uv did for packaging: replace a stack of single-purpose tools with one.
35
+
34
36
  - [18 third-party GitHub Actions replaced](https://kdeldycke.github.io/repomatic/security.html#third-party-action-minimization) by internal CLI commands and SHA-256-verified binary downloads, keeping the supply chain attack surface minimal
35
- - [8 Python linters and formatters](https://kdeldycke.github.io/repomatic/security.html#ruff-consolidation) (pylint, black, isort, pyupgrade, pydocstyle, pycln, docformatter, blacken-docs) consolidated into ruff
37
+ - [10 Python linters and formatters](https://kdeldycke.github.io/repomatic/security.html#ruff-consolidation) (pylint, pydocstyle, pycln, pyupgrade, isort, black, docformatter, mdformat-black, blacken-docs, mdformat-ruff) consolidated into ruff
36
38
  - [5 packaging and install tools](https://kdeldycke.github.io/repomatic/security.html#uv-consolidation) (poetry, build, twine, check-wheel-contents, pip-audit) consolidated into uv
37
39
  - All `uses:` references [pinned to full commit SHAs](https://kdeldycke.github.io/repomatic/security.html#supply-chain-security) with stabilization windows before adopting new versions, managed entirely by self-hosted sync jobs
38
40
  - [SLSA provenance attestations](https://kdeldycke.github.io/repomatic/security.html#supply-chain-security) on every release artifact (wheels and compiled binaries)
@@ -42,7 +44,8 @@ A Python CLI and `pyproject.toml` configuration that let you **release Python pa
42
44
  - Workflow security linting with [`zizmor`](https://kdeldycke.github.io/repomatic/workflows.html#github-workflows-lint-yaml-jobs) on every push to catch dangerous triggers and excessive permissions
43
45
  - Credential scanning with [`gitleaks`](https://kdeldycke.github.io/repomatic/workflows.html#github-workflows-lint-yaml-jobs) to prevent secret leakage
44
46
  - Single [`pyproject.toml` configuration](https://kdeldycke.github.io/repomatic/configuration.html): no extra dotfiles, no JSON configs, no YAML presets to maintain
45
- - [15+ code quality tools](https://kdeldycke.github.io/repomatic/tool-runner.html) (ruff, mypy, biome, typos, mdformat, shfmt, yamllint, actionlint, lychee, oxipng, jpegoptim, pyproject-fmt, labelmaker, gitleaks, zizmor) managed through one `repomatic run <tool>` interface with automatic installation and platform-specific binary caching
47
+ - The CLI itself [ships as standalone binaries](https://kdeldycke.github.io/repomatic/install.html#executables) (Linux / macOS / Windows, x86_64 / arm64): no Python environment needed to run it
48
+ - [15+ code quality tools](https://kdeldycke.github.io/repomatic/tool-runner.html) (ruff, mypy, biome, typos, mdformat, shfmt, yamllint, actionlint, lychee, oxipng, pyproject-fmt, labelmaker, gitleaks, zizmor) managed through one `repomatic run <tool>` interface with automatic installation and platform-specific binary caching
46
49
 
47
50
  ## Quick start
48
51
 
@@ -56,6 +59,13 @@ $ git push
56
59
 
57
60
  Works for new and existing repositories. Managed files are always regenerated to the latest version; `changelog.md` is never overwritten. Push, and the workflows guide you through remaining setup via issues and PRs.
58
61
 
62
+ The workflows only call CLI commands, so every automated step can also be run and previewed locally:
63
+
64
+ ```shell-session
65
+ $ uvx -- repomatic sync-deps --dry-run
66
+ $ uvx -- repomatic run ruff -- check
67
+ ```
68
+
59
69
  See `repomatic init --help` for available components and options.
60
70
 
61
71
  ## Documentation
@@ -65,10 +75,11 @@ See the **[full documentation](https://kdeldycke.github.io/repomatic/)** for:
65
75
  - [Installation methods and executables](https://kdeldycke.github.io/repomatic/install.html)
66
76
  - [`[tool.repomatic]` configuration reference](https://kdeldycke.github.io/repomatic/configuration.html)
67
77
  - [CLI parameters](https://kdeldycke.github.io/repomatic/cli.html)
68
- - [Reusable workflow reference](https://kdeldycke.github.io/repomatic/workflows.html) (all 13 workflows with job descriptions)
78
+ - [Reusable workflow reference](https://kdeldycke.github.io/repomatic/workflows.html) (all 14 workflows with job descriptions)
69
79
  - [Security practices and token setup](https://kdeldycke.github.io/repomatic/security.html)
70
80
  - [Claude Code skills](https://kdeldycke.github.io/repomatic/skills.html)
71
81
  - [API reference](https://kdeldycke.github.io/repomatic/repomatic.html)
82
+ - [Project history](https://kdeldycke.github.io/repomatic/history.html)
72
83
 
73
84
  ## Used in
74
85
 
@@ -17,5 +17,5 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
- __version__ = "7.4.0"
21
- __git_tag_sha__ = "730a6caca5226f9b3c80c238504310c5dad86993"
20
+ __version__ = "7.5.0"
21
+ __git_tag_sha__ = "ef51d27ea435bf5368112791288130134bd02142"
@@ -56,9 +56,9 @@ import logging
56
56
  from pathlib import Path
57
57
 
58
58
  from click_extra.blocks import replace_region
59
- from packaging.version import InvalidVersion, Version
60
59
 
61
60
  from .binary import NUITKA_BUILD_TARGETS
61
+ from .github.releases import parse_release_version
62
62
  from .virustotal import VIRUSTOTAL_GUI_URL
63
63
 
64
64
  TYPE_CHECKING = False
@@ -160,7 +160,7 @@ The table is searchable and sortable on the documentation site; the raw data liv
160
160
  """
161
161
  """Initial page content, used when the page does not exist yet.
162
162
 
163
- The `{repo_url}` placeholder is substituted with `str.replace` (not
163
+ The ``{repo_url}`` placeholder is substituted with `str.replace` (not
164
164
  `str.format`, which would choke on the csv-table directive's braces).
165
165
  Everything outside the marker pair is written once and never touched again:
166
166
  repositories can reword the prose without fighting the generator.
@@ -182,14 +182,6 @@ def _platform_target(name: str) -> str:
182
182
  return name
183
183
 
184
184
 
185
- def _release_version(tag: str) -> Version | None:
186
- """Parse a release tag as a version, or `None` for foreign tag schemes."""
187
- try:
188
- return Version(tag.removeprefix("v"))
189
- except InvalidVersion:
190
- return None
191
-
192
-
193
185
  def _binary_assets(release: ReleaseWithAssets) -> list[ReleaseAsset]:
194
186
  """Return the release's compiled binaries, sorted by filename.
195
187
 
@@ -261,7 +253,7 @@ def render_chart_section(records: Sequence[ScanRecord]) -> str:
261
253
 
262
254
  points = []
263
255
  for tag, (date, flagged, total) in per_tag.items():
264
- version = _release_version(tag)
256
+ version = parse_release_version(tag)
265
257
  if version is None:
266
258
  continue
267
259
  if total:
@@ -383,7 +375,8 @@ def render_binaries_csv(
383
375
  versioned = [
384
376
  (version, release)
385
377
  for release in releases
386
- if not release.draft and (version := _release_version(release.tag)) is not None
378
+ if not release.draft
379
+ and (version := parse_release_version(release.tag)) is not None
387
380
  ]
388
381
  versioned.sort(key=lambda pair: pair[0], reverse=True)
389
382
 
@@ -425,8 +418,10 @@ def render_binaries_csv(
425
418
  # they stay clickable with their label.
426
419
  writer.writerow((
427
420
  f"[`{version}` {{octicon}}`link-external`]({release_url})",
428
- f"[{{octicon}}`download` `{_platform_target(asset.name)}`]"
429
- f"({asset.download_url})",
421
+ (
422
+ f"[{{octicon}}`download` `{_platform_target(asset.name)}`]"
423
+ f"({asset.download_url})"
424
+ ),
430
425
  release.date,
431
426
  vt_cell,
432
427
  ))
@@ -28,7 +28,6 @@ from __future__ import annotations
28
28
 
29
29
  import json
30
30
  import logging
31
- import tempfile
32
31
  from dataclasses import dataclass
33
32
  from itertools import groupby
34
33
  from operator import attrgetter
@@ -333,22 +332,9 @@ def manage_combined_broken_links_issue(
333
332
  sphinx_section=sphinx_section,
334
333
  )
335
334
 
336
- # Write combined body to a temporary file.
337
- with tempfile.NamedTemporaryFile(
338
- mode="w",
339
- suffix=".md",
340
- delete=False,
341
- encoding="UTF-8",
342
- ) as tmp:
343
- tmp.write(body)
344
- body_file = Path(tmp.name)
345
-
346
- try:
347
- manage_issue_lifecycle(
348
- has_issues=has_broken_links,
349
- body_file=body_file,
350
- labels=[get_label(repo_name)],
351
- title=ISSUE_TITLE,
352
- )
353
- finally:
354
- body_file.unlink(missing_ok=True)
335
+ manage_issue_lifecycle(
336
+ has_issues=has_broken_links,
337
+ body=body,
338
+ labels=[get_label(repo_name)],
339
+ title=ISSUE_TITLE,
340
+ )
@@ -144,9 +144,6 @@ CHANGELOG_HEADER = "# Changelog\n"
144
144
  SECTION_START = "##"
145
145
  """Markdown heading level for changelog version sections."""
146
146
 
147
- DATE_PATTERN = re.compile(r"\d{4}\-\d{2}\-\d{2}")
148
- """Pattern matching release dates in YYYY-MM-DD format."""
149
-
150
147
  VERSION_COMPARE_PATTERN = re.compile(r"v(\d+\.\d+\.\d+)\.\.\.v(\d+\.\d+\.\d+)")
151
148
  """Pattern matching GitHub comparison URLs like `v1.0.0...v1.0.1`."""
152
149