repomatic 7.4.1__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.1 → repomatic-7.5.0}/PKG-INFO +17 -6
  2. {repomatic-7.4.1 → repomatic-7.5.0}/pyproject.toml +10 -8
  3. {repomatic-7.4.1 → repomatic-7.5.0}/pyproject.toml.orig +16 -9
  4. {repomatic-7.4.1 → repomatic-7.5.0}/readme.md +15 -4
  5. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/__init__.py +2 -2
  6. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/binaries_page.py +5 -3
  7. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/broken_links.py +6 -20
  8. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/changelog.py +0 -3
  9. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/cli.py +439 -419
  10. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/config.py +183 -15
  11. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/_release-engine.yaml +151 -28
  12. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/action-publish-pypi.yaml +34 -0
  13. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/autofix.yaml +153 -106
  14. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/autolock.yaml +11 -0
  15. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/cancel-runs.yaml +13 -1
  16. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/changelog.yaml +62 -21
  17. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/debug.yaml +17 -2
  18. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/docs.yaml +30 -7
  19. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/labels.yaml +26 -5
  20. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/lint.yaml +45 -12
  21. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/release.yaml +11 -0
  22. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/ruff.toml +6 -3
  23. repomatic-7.4.1/repomatic/data/skill-av-false-positive.md → repomatic-7.5.0/repomatic/data/skills/av-false-positive/SKILL.md +2 -3
  24. repomatic-7.4.1/repomatic/data/skill-awesome-triage.md → repomatic-7.5.0/repomatic/data/skills/awesome-triage/SKILL.md +2 -3
  25. repomatic-7.4.1/repomatic/data/skill-babysit-ci.md → repomatic-7.5.0/repomatic/data/skills/babysit-ci/SKILL.md +21 -10
  26. repomatic-7.4.1/repomatic/data/skill-benchmark-update.md → repomatic-7.5.0/repomatic/data/skills/benchmark-update/SKILL.md +2 -3
  27. repomatic-7.4.1/repomatic/data/skill-brand-assets.md → repomatic-7.5.0/repomatic/data/skills/brand-assets/SKILL.md +1 -1
  28. repomatic-7.4.1/repomatic/data/skill-file-bug-report.md → repomatic-7.5.0/repomatic/data/skills/file-bug-report/SKILL.md +2 -2
  29. repomatic-7.4.1/repomatic/data/skill-repomatic-audit.md → repomatic-7.5.0/repomatic/data/skills/repomatic-audit/SKILL.md +2 -2
  30. repomatic-7.4.1/repomatic/data/skill-repomatic-changelog.md → repomatic-7.5.0/repomatic/data/skills/repomatic-changelog/SKILL.md +7 -5
  31. repomatic-7.4.1/repomatic/data/skill-repomatic-deps.md → repomatic-7.5.0/repomatic/data/skills/repomatic-deps/SKILL.md +3 -3
  32. repomatic-7.4.1/repomatic/data/skill-repomatic-init.md → repomatic-7.5.0/repomatic/data/skills/repomatic-init/SKILL.md +3 -3
  33. repomatic-7.4.1/repomatic/data/skill-repomatic-ship.md → repomatic-7.5.0/repomatic/data/skills/repomatic-ship/SKILL.md +33 -19
  34. repomatic-7.4.1/repomatic/data/skill-repomatic-topics.md → repomatic-7.5.0/repomatic/data/skills/repomatic-topics/SKILL.md +2 -3
  35. repomatic-7.4.1/repomatic/data/skill-sphinx-docs-sync.md → repomatic-7.5.0/repomatic/data/skills/sphinx-docs-sync/SKILL.md +2 -3
  36. repomatic-7.4.1/repomatic/data/skill-translation-sync.md → repomatic-7.5.0/repomatic/data/skills/translation-sync/SKILL.md +2 -3
  37. repomatic-7.4.1/repomatic/data/skill-upstream-audit.md → repomatic-7.5.0/repomatic/data/skills/upstream-audit/SKILL.md +2 -3
  38. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/tests.yaml +37 -3
  39. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/unsubscribe.yaml +13 -1
  40. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/uv.toml +4 -1
  41. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/dep_sources.py +92 -2
  42. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/docs.py +1 -1
  43. repomatic-7.5.0/repomatic/frontmatter.py +70 -0
  44. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/github/gh.py +31 -0
  45. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/github/issue.py +37 -6
  46. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/github/pr_body.py +19 -33
  47. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/github/release_sync.py +16 -16
  48. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/github/unsubscribe.py +40 -79
  49. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/github/workflow_sync.py +204 -67
  50. repomatic-7.5.0/repomatic/humanize.py +63 -0
  51. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/images.py +39 -16
  52. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/init_project.py +228 -91
  53. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/labels.py +50 -11
  54. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/lint_repo.py +61 -127
  55. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/metadata.py +38 -434
  56. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/prepare_release.py +79 -12
  57. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/pypi.py +41 -14
  58. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/registry.py +340 -283
  59. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/setup_guide.py +9 -23
  60. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/sync_ops.py +193 -59
  61. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/sync-tool-versions.md +1 -1
  62. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/tool_registry.py +276 -40
  63. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/tool_runner.py +186 -8
  64. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/uv.py +38 -9
  65. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/version_sync.py +138 -3
  66. {repomatic-7.4.1 → repomatic-7.5.0}/license +0 -0
  67. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/__main__.py +0 -0
  68. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/binary.py +0 -0
  69. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/bundle.py +0 -0
  70. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/cache.py +0 -0
  71. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/checksums.py +0 -0
  72. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/compat.py +0 -0
  73. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/__init__.py +0 -0
  74. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/agent-grunt-qa.md +0 -0
  75. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/agent-qa-engineer.md +0 -0
  76. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/agent-sphinx-docs.md +0 -0
  77. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/awesome_template/.github/ISSUE_TEMPLATE/config.yml +0 -0
  78. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/awesome_template/.github/ISSUE_TEMPLATE/new-link.yaml +0 -0
  79. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/awesome_template/.github/code-of-conduct.md +0 -0
  80. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/awesome_template/.github/contributing.md +0 -0
  81. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/awesome_template/.github/contributing.zh.md +0 -0
  82. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/awesome_template/.github/funding.yml +0 -0
  83. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/awesome_template/.github/pull_request_template.md +0 -0
  84. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/awesome_template/__init__.py +0 -0
  85. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/awesome_template/license +0 -0
  86. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/bumpversion.toml +0 -0
  87. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/codecov.yaml +0 -0
  88. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/labeller-content-based.yaml +0 -0
  89. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/labeller-file-based.yaml +0 -0
  90. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/labels.toml +0 -0
  91. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/lychee.toml +0 -0
  92. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/mdformat.toml +0 -0
  93. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/mypy.toml +0 -0
  94. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/pytest.toml +0 -0
  95. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/typos.toml +0 -0
  96. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/yamllint.yaml +0 -0
  97. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/data/zizmor.yaml +0 -0
  98. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/dep_graph.py +0 -0
  99. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/dep_report.py +0 -0
  100. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/git_ops.py +0 -0
  101. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/github/__init__.py +0 -0
  102. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/github/actions.py +0 -0
  103. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/github/dev_release.py +0 -0
  104. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/github/matrix.py +0 -0
  105. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/github/releases.py +0 -0
  106. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/github/sponsor.py +0 -0
  107. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/github/status.py +0 -0
  108. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/github/token.py +0 -0
  109. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/gitignore.py +0 -0
  110. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/http.py +0 -0
  111. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/mailmap.py +0 -0
  112. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/matrix_axes.py +0 -0
  113. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/npm.py +0 -0
  114. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/py.typed +0 -0
  115. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/pyproject.py +0 -0
  116. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/__init__.py +0 -0
  117. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/available-admonition.md +0 -0
  118. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/broken-links-issue.md +0 -0
  119. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/bump-version.md +0 -0
  120. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/detect-squash-merge.md +0 -0
  121. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/development-warning.md +0 -0
  122. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/fix-changelog.md +0 -0
  123. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/fix-typos.md +0 -0
  124. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/fix-vulnerable-deps.md +0 -0
  125. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/format-images.md +0 -0
  126. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/format-json.md +0 -0
  127. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/format-markdown.md +0 -0
  128. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/format-pyproject.md +0 -0
  129. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/format-python.md +0 -0
  130. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/format-shell.md +0 -0
  131. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/generated-footer.md +0 -0
  132. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/github-releases.md +0 -0
  133. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/immutable-releases.md +0 -0
  134. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/pr-metadata.md.noformat +0 -0
  135. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/prepare-release.md.noformat +0 -0
  136. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/refresh-tip.md +0 -0
  137. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/release-notes.md +0 -0
  138. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/release-sync-report.md +0 -0
  139. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/setup-guide-branch-ruleset.md +0 -0
  140. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/setup-guide-dependabot.md +0 -0
  141. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/setup-guide-fork-pr-approval.md +0 -0
  142. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/setup-guide-notifications-pat.md +0 -0
  143. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/setup-guide-pages-source.md +0 -0
  144. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/setup-guide-pypi-trusted-publisher.md +0 -0
  145. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/setup-guide-sha-pinning-required.md +0 -0
  146. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/setup-guide-token.md +0 -0
  147. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/setup-guide-verify.md +0 -0
  148. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/setup-guide-virustotal.md +0 -0
  149. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/setup-guide.md +0 -0
  150. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/sync-action-pins.md +0 -0
  151. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/sync-bumpversion.md +0 -0
  152. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/sync-dep-sources.md +0 -0
  153. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/sync-gitignore.md +0 -0
  154. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/sync-mailmap.md +0 -0
  155. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/sync-repomatic.md +0 -0
  156. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/sync-uv-lock.md +0 -0
  157. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/sync-workflow-pins.md +0 -0
  158. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/unavailable-admonition.md +0 -0
  159. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/unsubscribe-phase1.md +0 -0
  160. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/unsubscribe-phase2.md +0 -0
  161. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/update-dep-graph.md +0 -0
  162. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/update-docs.md +0 -0
  163. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/templates/yanked-admonition.md +0 -0
  164. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/tool_runner_page.py +0 -0
  165. {repomatic-7.4.1 → repomatic-7.5.0}/repomatic/virustotal.py +0 -0
  166. {repomatic-7.4.1 → 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.1
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.1
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
 
@@ -4,7 +4,7 @@ requires = ["uv-build>=0.8"]
4
4
 
5
5
  [project]
6
6
  name = "repomatic"
7
- version = "7.4.1"
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.1"
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"
@@ -138,8 +138,6 @@ exclude-newer = "1 week"
138
138
  requires-python = ">= 3.14"
139
139
 
140
140
  [tool.uv.exclude-newer-package]
141
- click-extra = "2026-08-02T00:00:00Z"
142
- extra-platforms = "2026-07-28T00:00:00Z"
143
141
  repomatic = "0 day"
144
142
 
145
143
  [tool.uv.build-backend]
@@ -148,14 +146,17 @@ module-root = ""
148
146
  [tool.nuitka]
149
147
  copyright = "Kevin Deldycke <kevin@deldycke.com> and contributors. Distributed under GPL-2.0-or-later license."
150
148
  file-description = "🏭 Automate repository maintenance, releases, and CI/CD workflows"
151
- file-version = "7.4.1"
152
- 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
+ ]
153
154
  include-data-files = ["repomatic/templates/*.md=repomatic/templates/"]
154
155
  include-package-data = ["click_extra"]
155
156
  linux-icon = "docs/assets/icon.png"
156
157
  macos-app-icon = "docs/assets/icon.icns"
157
158
  product-name = "Repomatic"
158
- product-version = "7.4.1"
159
+ product-version = "7.5.0"
159
160
  windows-icon-from-ico = "docs/assets/icon.ico"
160
161
 
161
162
  [tool.ruff]
@@ -163,6 +164,7 @@ preview = true
163
164
  fix = true
164
165
  unsafe-fixes = false
165
166
  show-fixes = true
167
+ output-prefer-rule-codes = true
166
168
 
167
169
  [tool.ruff.format]
168
170
  docstring-code-format = true
@@ -245,7 +247,7 @@ source = ["repomatic"]
245
247
  precision = 2
246
248
 
247
249
  [tool.bumpversion]
248
- current_version = "7.4.1"
250
+ current_version = "7.5.0"
249
251
  parse = '(?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)(\.dev(?P<dev>\d+))?'
250
252
  serialize = [
251
253
  "{major}.{minor}.{patch}.dev{dev}",
@@ -12,7 +12,7 @@ requires = [ "uv-build>=0.8" ]
12
12
  [project]
13
13
  # Docs: https://packaging.python.org/en/latest/guides/writing-pyproject-toml/
14
14
  name = "repomatic"
15
- version = "7.4.1"
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.1"
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"
@@ -223,9 +223,12 @@ typing = [
223
223
  required-version = ">=0.11.15"
224
224
  # Docs group requires Python >= 3.14 for recent MyST-Parser and click-extra features.
225
225
  dependency-groups.docs = { requires-python = ">= 3.14" }
226
- # Cooldown period: 7-day buffer before using newly released packages.
227
- # Relative dates are fine here: uv 0.11.8+ writes a sentinel timestamp to
228
- # 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.
229
232
  exclude-newer = "1 week"
230
233
  # Per-package cooldown control. A fixed date holds a package at the version
231
234
  # available then (the day after it shipped), so `uv lock --upgrade` keeps that
@@ -234,7 +237,7 @@ exclude-newer = "1 week"
234
237
  # `exclude-newer`, returning the package to the normal cooldown. repomatic is
235
238
  # pinned to git main (no PyPI release to freeze), so it keeps a permanent
236
239
  # "0 day" span.
237
- 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" }
238
241
  # Package is at root level, not in "./src/".
239
242
  build-backend.module-root = ""
240
243
 
@@ -247,9 +250,10 @@ copyright = "Kevin Deldycke <kevin@deldycke.com> and contributors. Distributed u
247
250
  file-description = "🏭 Automate repository maintenance, releases, and CI/CD workflows"
248
251
  # Numeric only: Nuitka rejects PEP 440 .devN suffixes. Kept in sync with the
249
252
  # package version by the dedicated [tool.bumpversion] rule that strips the suffix.
250
- file-version = "7.4.1"
253
+ file-version = "7.5.0"
251
254
  include-data-dir = [
252
255
  "repomatic/data/awesome_template=repomatic/data/awesome_template",
256
+ "repomatic/data/skills=repomatic/data/skills",
253
257
  ]
254
258
  include-data-files = [
255
259
  "repomatic/templates/*.md=repomatic/templates/",
@@ -265,7 +269,7 @@ include-package-data = [ "click_extra" ]
265
269
  linux-icon = "docs/assets/icon.png"
266
270
  macos-app-icon = "docs/assets/icon.icns"
267
271
  product-name = "Repomatic"
268
- product-version = "7.4.1"
272
+ product-version = "7.5.0"
269
273
  windows-icon-from-ico = "docs/assets/icon.ico"
270
274
 
271
275
  [tool.ruff]
@@ -299,6 +303,9 @@ lint.isort.combine-as-imports = true
299
303
  # this would simplify a fix or enable a new diagnostic.
300
304
  # https://docs.astral.sh/ruff/settings/#lint_future-annotations
301
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
302
309
 
303
310
  [tool.typos]
304
311
  default.extend-identifiers = { Github = "GitHub", IOS = "iOS", Javascript = "JavaScript", MacOS = "macOS", PNGs = "PNGs", PyPi = "PyPI", Typescript = "TypeScript" }
@@ -387,7 +394,7 @@ run.source = [ "repomatic" ]
387
394
  report.precision = 2
388
395
 
389
396
  [tool.bumpversion]
390
- current_version = "7.4.1"
397
+ current_version = "7.5.0"
391
398
  # Parse versions with an optional .devN suffix (PEP 440).
392
399
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)(\\.dev(?P<dev>\\d+))?"
393
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.1"
21
- __git_tag_sha__ = "f3fd0341a6ffbe9f948e78e3270ca30faf2b2459"
20
+ __version__ = "7.5.0"
21
+ __git_tag_sha__ = "ef51d27ea435bf5368112791288130134bd02142"
@@ -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.
@@ -418,8 +418,10 @@ def render_binaries_csv(
418
418
  # they stay clickable with their label.
419
419
  writer.writerow((
420
420
  f"[`{version}` {{octicon}}`link-external`]({release_url})",
421
- f"[{{octicon}}`download` `{_platform_target(asset.name)}`]"
422
- f"({asset.download_url})",
421
+ (
422
+ f"[{{octicon}}`download` `{_platform_target(asset.name)}`]"
423
+ f"({asset.download_url})"
424
+ ),
423
425
  release.date,
424
426
  vt_cell,
425
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