repomatic 7.16.2__tar.gz → 7.16.3__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 (571) hide show
  1. {repomatic-7.16.2 → repomatic-7.16.3}/.claude/.claude-plugin/plugin.json +1 -1
  2. {repomatic-7.16.2 → repomatic-7.16.3}/.claude/agents/qa-engineer.md +1 -0
  3. {repomatic-7.16.2 → repomatic-7.16.3}/.claude/agents/sphinx-docs.md +6 -3
  4. {repomatic-7.16.2 → repomatic-7.16.3}/.claude/skills/awesome-triage/SKILL.md +1 -1
  5. {repomatic-7.16.2/repomatic/data → repomatic-7.16.3/.claude}/skills/babysit-ci/SKILL.md +4 -0
  6. {repomatic-7.16.2/repomatic/data → repomatic-7.16.3/.claude}/skills/file-bug-report/SKILL.md +26 -0
  7. {repomatic-7.16.2/repomatic/data → repomatic-7.16.3/.claude}/skills/repomatic-audit/SKILL.md +1 -1
  8. {repomatic-7.16.2/repomatic/data → repomatic-7.16.3/.claude}/skills/repomatic-ship/SKILL.md +7 -4
  9. {repomatic-7.16.2/repomatic/data → repomatic-7.16.3/.claude}/skills/sphinx-docs-sync/SKILL.md +1 -1
  10. {repomatic-7.16.2 → repomatic-7.16.3}/.claude-plugin/marketplace.json +2 -2
  11. {repomatic-7.16.2 → repomatic-7.16.3}/.github/actions/publish-pypi/action.yaml +2 -2
  12. {repomatic-7.16.2 → repomatic-7.16.3}/.github/workflows/_release-build.yaml +13 -13
  13. {repomatic-7.16.2 → repomatic-7.16.3}/.github/workflows/_release-engine.yaml +48 -56
  14. {repomatic-7.16.2/repomatic/data → repomatic-7.16.3/.github/workflows}/autofix.yaml +78 -78
  15. {repomatic-7.16.2/repomatic/data → repomatic-7.16.3/.github/workflows}/autolock.yaml +4 -4
  16. {repomatic-7.16.2/repomatic/data → repomatic-7.16.3/.github/workflows}/cancel-runs.yaml +4 -4
  17. {repomatic-7.16.2/repomatic/data → repomatic-7.16.3/.github/workflows}/changelog.yaml +24 -24
  18. {repomatic-7.16.2 → repomatic-7.16.3}/.github/workflows/debug.yaml +7 -7
  19. {repomatic-7.16.2 → repomatic-7.16.3}/.github/workflows/docs.yaml +18 -18
  20. {repomatic-7.16.2/repomatic/data → repomatic-7.16.3/.github/workflows}/labels.yaml +13 -13
  21. {repomatic-7.16.2/repomatic/data → repomatic-7.16.3/.github/workflows}/lint.yaml +26 -26
  22. {repomatic-7.16.2/repomatic/data → repomatic-7.16.3/.github/workflows}/metrics.yaml +5 -5
  23. {repomatic-7.16.2/repomatic/data → repomatic-7.16.3/.github/workflows}/release.yaml +4 -4
  24. {repomatic-7.16.2 → repomatic-7.16.3}/.github/workflows/self-maintenance.yaml +5 -5
  25. {repomatic-7.16.2 → repomatic-7.16.3}/.github/workflows/tests.yaml +13 -11
  26. {repomatic-7.16.2/repomatic/data → repomatic-7.16.3/.github/workflows}/unsubscribe.yaml +4 -4
  27. {repomatic-7.16.2 → repomatic-7.16.3}/.gitignore +3 -0
  28. {repomatic-7.16.2 → repomatic-7.16.3}/PKG-INFO +3 -3
  29. {repomatic-7.16.2 → repomatic-7.16.3}/changelog.md +39 -0
  30. {repomatic-7.16.2 → repomatic-7.16.3}/claude.md +46 -2
  31. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/binaries.csv +6 -0
  32. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/config-snippet-screen.svg +2 -2
  33. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/dependencies.mmd +30 -6
  34. repomatic-7.16.3/docs/assets/help-dark-screen.svg +31 -0
  35. repomatic-7.16.3/docs/assets/help-light-screen.svg +31 -0
  36. repomatic-7.16.3/docs/assets/matrix-grid-screen.svg +27 -0
  37. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/metrics.csv +1698 -1674
  38. repomatic-7.16.3/docs/assets/star-history-compared.svg +102 -0
  39. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/star-history.svg +13 -13
  40. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/virustotal-scans.csv +6 -0
  41. {repomatic-7.16.2 → repomatic-7.16.3}/docs/binaries.md +1 -1
  42. {repomatic-7.16.2 → repomatic-7.16.3}/docs/claude-code-plugin.md +22 -4
  43. {repomatic-7.16.2 → repomatic-7.16.3}/docs/conf.py +7 -4
  44. {repomatic-7.16.2 → repomatic-7.16.3}/docs/configuration.md +3 -1
  45. repomatic-7.16.3/docs/contributing.md +7 -0
  46. {repomatic-7.16.2 → repomatic-7.16.3}/docs/docs_update.py +3 -1
  47. {repomatic-7.16.2 → repomatic-7.16.3}/docs/install.md +14 -14
  48. {repomatic-7.16.2 → repomatic-7.16.3}/docs/operation-contracts.md +4 -4
  49. {repomatic-7.16.2 → repomatic-7.16.3}/docs/security.md +1 -1
  50. {repomatic-7.16.2 → repomatic-7.16.3}/docs/test-matrix.md +8 -8
  51. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.md +1 -0
  52. repomatic-7.16.3/docs/tests.test_plugin_update_detection.md +8 -0
  53. {repomatic-7.16.2 → repomatic-7.16.3}/docs/upstream-development.md +4 -4
  54. {repomatic-7.16.2 → repomatic-7.16.3}/docs/workflows.md +14 -8
  55. {repomatic-7.16.2 → repomatic-7.16.3}/pyproject.toml +6 -6
  56. {repomatic-7.16.2 → repomatic-7.16.3}/pyproject.toml.orig +22 -19
  57. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/__init__.py +2 -2
  58. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/changelog.py +17 -14
  59. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/cli/release.py +34 -1
  60. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/config.py +10 -7
  61. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/_release-engine.yaml +48 -56
  62. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/action-publish-pypi.yaml +2 -2
  63. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/agent-qa-engineer.md +1 -0
  64. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/agent-sphinx-docs.md +6 -3
  65. {repomatic-7.16.2/.github/workflows → repomatic-7.16.3/repomatic/data}/autofix.yaml +78 -78
  66. {repomatic-7.16.2/.github/workflows → repomatic-7.16.3/repomatic/data}/autolock.yaml +4 -4
  67. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/awesome_template/.github/contributing.md +2 -0
  68. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/awesome_template/.github/contributing.zh.md +2 -0
  69. {repomatic-7.16.2/.github/workflows → repomatic-7.16.3/repomatic/data}/cancel-runs.yaml +4 -4
  70. {repomatic-7.16.2/.github/workflows → repomatic-7.16.3/repomatic/data}/changelog.yaml +24 -24
  71. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/debug.yaml +7 -7
  72. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/docs.yaml +18 -18
  73. {repomatic-7.16.2/.github/workflows → repomatic-7.16.3/repomatic/data}/labels.yaml +13 -13
  74. {repomatic-7.16.2/.github/workflows → repomatic-7.16.3/repomatic/data}/lint.yaml +26 -26
  75. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/lychee.toml +5 -0
  76. {repomatic-7.16.2/.github/workflows → repomatic-7.16.3/repomatic/data}/metrics.yaml +5 -5
  77. {repomatic-7.16.2/.github/workflows → repomatic-7.16.3/repomatic/data}/release.yaml +4 -4
  78. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/skills/awesome-triage/SKILL.md +1 -1
  79. {repomatic-7.16.2/.claude → repomatic-7.16.3/repomatic/data}/skills/babysit-ci/SKILL.md +4 -0
  80. {repomatic-7.16.2/.claude → repomatic-7.16.3/repomatic/data}/skills/file-bug-report/SKILL.md +26 -0
  81. {repomatic-7.16.2/.claude → repomatic-7.16.3/repomatic/data}/skills/repomatic-audit/SKILL.md +1 -1
  82. {repomatic-7.16.2/.claude → repomatic-7.16.3/repomatic/data}/skills/repomatic-ship/SKILL.md +7 -4
  83. {repomatic-7.16.2/.claude → repomatic-7.16.3/repomatic/data}/skills/sphinx-docs-sync/SKILL.md +1 -1
  84. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/tests.yaml +13 -11
  85. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/typos.toml +1 -1
  86. {repomatic-7.16.2/.github/workflows → repomatic-7.16.3/repomatic/data}/unsubscribe.yaml +4 -4
  87. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/uv.toml +1 -1
  88. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/zizmor.yaml +2 -1
  89. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/deps/dep_sources.py +7 -5
  90. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/deps/uv.py +1 -1
  91. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/docs.py +113 -1
  92. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/git_ops.py +3 -3
  93. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/github/actions.py +1 -2
  94. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/github/dev_release.py +1 -1
  95. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/github/gh.py +3 -4
  96. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/github/workflow_sync.py +13 -4
  97. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/init_project.py +2 -5
  98. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/labels.py +11 -1
  99. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/lint_repo.py +261 -10
  100. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/matrix_axes.py +9 -13
  101. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/metric_chart.py +9 -2
  102. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/metrics.py +22 -5
  103. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/registry.py +26 -0
  104. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/release/prepare_release.py +12 -3
  105. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/release/version_sync.py +1 -1
  106. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/release/virustotal.py +56 -1
  107. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/runner_images.py +2 -2
  108. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/site_anchors.py +21 -6
  109. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/tooling/plugin.py +12 -7
  110. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/tooling/tool_registry.py +24 -24
  111. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/tooling/tool_runner.py +15 -5
  112. {repomatic-7.16.2 → repomatic-7.16.3}/tests/conftest.py +66 -0
  113. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_changelog.py +30 -3
  114. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_claude_assets.py +165 -29
  115. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_docs.py +127 -2
  116. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_init_project.py +30 -14
  117. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_labels.py +42 -0
  118. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_lint_repo.py +234 -1
  119. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_metadata.py +1 -0
  120. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_metrics.py +5 -2
  121. repomatic-7.16.3/tests/test_plugin_update_detection.py +218 -0
  122. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_pr_body.py +2 -24
  123. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_prepare_release.py +1 -2
  124. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_site_anchors.py +7 -5
  125. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_skills.py +4 -1
  126. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_suite_hygiene.py +2 -3
  127. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_tool_runner.py +26 -0
  128. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_virustotal.py +107 -0
  129. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_workflows.py +19 -3
  130. {repomatic-7.16.2 → repomatic-7.16.3}/uv.lock +604 -553
  131. repomatic-7.16.2/docs/assets/help-dark-screen.svg +0 -31
  132. repomatic-7.16.2/docs/assets/help-light-screen.svg +0 -31
  133. repomatic-7.16.2/docs/assets/matrix-grid-screen.svg +0 -27
  134. repomatic-7.16.2/docs/assets/star-history-compared.svg +0 -102
  135. repomatic-7.16.2/docs/contributing.md +0 -7
  136. {repomatic-7.16.2 → repomatic-7.16.3}/.claude/agents/grunt-qa.md +0 -0
  137. {repomatic-7.16.2 → repomatic-7.16.3}/.claude/skills/av-false-positive/SKILL.md +0 -0
  138. {repomatic-7.16.2 → repomatic-7.16.3}/.claude/skills/benchmark-update/SKILL.md +0 -0
  139. {repomatic-7.16.2 → repomatic-7.16.3}/.claude/skills/brand-assets/SKILL.md +0 -0
  140. {repomatic-7.16.2 → repomatic-7.16.3}/.claude/skills/github-housekeeping/SKILL.md +0 -0
  141. {repomatic-7.16.2 → repomatic-7.16.3}/.claude/skills/probe-workflow/SKILL.md +0 -0
  142. {repomatic-7.16.2 → repomatic-7.16.3}/.claude/skills/repomatic-changelog/SKILL.md +0 -0
  143. {repomatic-7.16.2 → repomatic-7.16.3}/.claude/skills/repomatic-deps/SKILL.md +0 -0
  144. {repomatic-7.16.2 → repomatic-7.16.3}/.claude/skills/repomatic-init/SKILL.md +0 -0
  145. {repomatic-7.16.2 → repomatic-7.16.3}/.claude/skills/repomatic-test-matrix/SKILL.md +0 -0
  146. {repomatic-7.16.2 → repomatic-7.16.3}/.claude/skills/repomatic-topics/SKILL.md +0 -0
  147. {repomatic-7.16.2 → repomatic-7.16.3}/.claude/skills/repomatic-upgrade/SKILL.md +0 -0
  148. {repomatic-7.16.2 → repomatic-7.16.3}/.claude/skills/translation-sync/SKILL.md +0 -0
  149. {repomatic-7.16.2 → repomatic-7.16.3}/.claude/skills/upstream-audit/SKILL.md +0 -0
  150. {repomatic-7.16.2 → repomatic-7.16.3}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  151. {repomatic-7.16.2 → repomatic-7.16.3}/.github/code-of-conduct.md +0 -0
  152. {repomatic-7.16.2 → repomatic-7.16.3}/.github/funding.yml +0 -0
  153. {repomatic-7.16.2 → repomatic-7.16.3}/.mailmap +0 -0
  154. {repomatic-7.16.2 → repomatic-7.16.3}/docs/404.html +0 -0
  155. {repomatic-7.16.2 → repomatic-7.16.3}/docs/_redirects +0 -0
  156. {repomatic-7.16.2 → repomatic-7.16.3}/docs/_static/custom.css +0 -0
  157. {repomatic-7.16.2 → repomatic-7.16.3}/docs/agent-skills.md +0 -0
  158. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/banner-social-dark.png +0 -0
  159. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/banner-social-light.png +0 -0
  160. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/banner-social.svg +0 -0
  161. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/desktop-autosync-warning.png +0 -0
  162. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/desktop-plugin-agents.png +0 -0
  163. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/desktop-plugin-contents.png +0 -0
  164. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/desktop-plugin-skills.png +0 -0
  165. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/favicon.svg +0 -0
  166. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/icon.icns +0 -0
  167. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/icon.ico +0 -0
  168. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/icon.png +0 -0
  169. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/logo-banner-dark.png +0 -0
  170. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/logo-banner-light.png +0 -0
  171. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/logo-banner.svg +0 -0
  172. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/logo-square-dark.png +0 -0
  173. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/logo-square-light.png +0 -0
  174. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/logo-square.svg +0 -0
  175. {repomatic-7.16.2 → repomatic-7.16.3}/docs/assets/sync-deps-trail-screen.svg +0 -0
  176. {repomatic-7.16.2 → repomatic-7.16.3}/docs/benchmark.md +0 -0
  177. {repomatic-7.16.2 → repomatic-7.16.3}/docs/changelog-archive.md +0 -0
  178. {repomatic-7.16.2 → repomatic-7.16.3}/docs/changelog.md +0 -0
  179. {repomatic-7.16.2 → repomatic-7.16.3}/docs/cli.md +0 -0
  180. {repomatic-7.16.2 → repomatic-7.16.3}/docs/cloudflare.md +0 -0
  181. {repomatic-7.16.2 → repomatic-7.16.3}/docs/code-of-conduct.md +0 -0
  182. {repomatic-7.16.2 → repomatic-7.16.3}/docs/commit-messages.md +0 -0
  183. {repomatic-7.16.2 → repomatic-7.16.3}/docs/dependencies.md +0 -0
  184. {repomatic-7.16.2 → repomatic-7.16.3}/docs/history.md +0 -0
  185. {repomatic-7.16.2 → repomatic-7.16.3}/docs/index.md +0 -0
  186. {repomatic-7.16.2 → repomatic-7.16.3}/docs/license.md +0 -0
  187. {repomatic-7.16.2 → repomatic-7.16.3}/docs/man.md +0 -0
  188. {repomatic-7.16.2 → repomatic-7.16.3}/docs/nuitka.md +0 -0
  189. {repomatic-7.16.2 → repomatic-7.16.3}/docs/packaging.md +0 -0
  190. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.awesome_toc.md +0 -0
  191. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.broken_links.md +0 -0
  192. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.cache.md +0 -0
  193. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.changelog.md +0 -0
  194. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.cli.github.md +0 -0
  195. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.cli.lint.md +0 -0
  196. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.cli.main.md +0 -0
  197. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.cli.md +0 -0
  198. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.cli.release.md +0 -0
  199. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.cli.sample.md +0 -0
  200. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.cli.setup.md +0 -0
  201. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.cli.sync.md +0 -0
  202. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.cloudflare.md +0 -0
  203. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.compat.md +0 -0
  204. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.config.md +0 -0
  205. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.data.awesome_template.md +0 -0
  206. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.data.md +0 -0
  207. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.deps.dep_graph.md +0 -0
  208. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.deps.dep_policy.md +0 -0
  209. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.deps.dep_report.md +0 -0
  210. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.deps.dep_sources.md +0 -0
  211. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.deps.md +0 -0
  212. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.deps.uv.md +0 -0
  213. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.deps.vulnerable_deps.md +0 -0
  214. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.docs.md +0 -0
  215. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.file_inventory.md +0 -0
  216. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.file_ops.md +0 -0
  217. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.forge.md +0 -0
  218. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.frontmatter.md +0 -0
  219. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.git_ops.md +0 -0
  220. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.github.actions.md +0 -0
  221. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.github.ci_status.md +0 -0
  222. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.github.dev_release.md +0 -0
  223. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.github.gh.md +0 -0
  224. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.github.issue.md +0 -0
  225. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.github.job_timings.md +0 -0
  226. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.github.matrix.md +0 -0
  227. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.github.md +0 -0
  228. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.github.pr.md +0 -0
  229. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.github.pr_body.md +0 -0
  230. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.github.release_sync.md +0 -0
  231. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.github.releases.md +0 -0
  232. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.github.sponsor.md +0 -0
  233. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.github.status.md +0 -0
  234. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.github.token.md +0 -0
  235. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.github.unsubscribe.md +0 -0
  236. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.github.workflow_sync.md +0 -0
  237. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.gitignore.md +0 -0
  238. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.hashing.md +0 -0
  239. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.http.md +0 -0
  240. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.humanize.md +0 -0
  241. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.images.md +0 -0
  242. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.init_project.md +0 -0
  243. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.labels.md +0 -0
  244. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.lint_repo.md +0 -0
  245. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.mailmap.md +0 -0
  246. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.matrix_axes.md +0 -0
  247. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.md +0 -0
  248. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.metadata.core.md +0 -0
  249. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.metadata.env.md +0 -0
  250. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.metadata.git.md +0 -0
  251. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.metadata.matrix.md +0 -0
  252. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.metadata.md +0 -0
  253. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.metadata.project.md +0 -0
  254. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.metric_chart.md +0 -0
  255. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.metrics.md +0 -0
  256. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.npm.md +0 -0
  257. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.pages_redirects.md +0 -0
  258. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.pypi.md +0 -0
  259. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.pyproject.md +0 -0
  260. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.registry.md +0 -0
  261. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.release.attestation.md +0 -0
  262. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.release.binaries_page.md +0 -0
  263. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.release.binary.md +0 -0
  264. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.release.checksums.md +0 -0
  265. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.release.md +0 -0
  266. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.release.prepare_release.md +0 -0
  267. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.release.version_sync.md +0 -0
  268. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.release.virustotal.md +0 -0
  269. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.runner_catalog.md +0 -0
  270. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.runner_images.md +0 -0
  271. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.setup_guide.md +0 -0
  272. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.site_anchors.md +0 -0
  273. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.sync_ops.md +0 -0
  274. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.tabular.md +0 -0
  275. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.templates.md +0 -0
  276. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.tooling.bundle.md +0 -0
  277. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.tooling.md +0 -0
  278. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.tooling.plugin.md +0 -0
  279. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.tooling.tool_registry.md +0 -0
  280. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.tooling.tool_runner.md +0 -0
  281. {repomatic-7.16.2 → repomatic-7.16.3}/docs/repomatic.versions.md +0 -0
  282. {repomatic-7.16.2 → repomatic-7.16.3}/docs/robots.txt +0 -0
  283. {repomatic-7.16.2 → repomatic-7.16.3}/docs/subagents.md +0 -0
  284. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.conftest.md +0 -0
  285. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_actions.md +0 -0
  286. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_attestation.md +0 -0
  287. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_awesome_template.md +0 -0
  288. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_awesome_toc.md +0 -0
  289. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_binaries_page.md +0 -0
  290. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_binary.md +0 -0
  291. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_broken_links.md +0 -0
  292. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_cache.md +0 -0
  293. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_changelog.md +0 -0
  294. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_checksums.md +0 -0
  295. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_ci_status.md +0 -0
  296. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_claude_assets.md +0 -0
  297. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_cloudflare.md +0 -0
  298. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_config.md +0 -0
  299. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_dep_graph.md +0 -0
  300. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_dep_policy.md +0 -0
  301. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_dep_report.md +0 -0
  302. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_dep_sources.md +0 -0
  303. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_dev_release.md +0 -0
  304. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_docs.md +0 -0
  305. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_docstrings.md +0 -0
  306. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_forge.md +0 -0
  307. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_frontmatter.md +0 -0
  308. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_gh.md +0 -0
  309. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_git_ops.md +0 -0
  310. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_gitignore.md +0 -0
  311. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_hashing.md +0 -0
  312. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_help.md +0 -0
  313. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_http.md +0 -0
  314. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_humanize.md +0 -0
  315. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_images.md +0 -0
  316. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_imports.md +0 -0
  317. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_init_project.md +0 -0
  318. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_issue.md +0 -0
  319. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_job_timings.md +0 -0
  320. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_labels.md +0 -0
  321. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_lint_repo.md +0 -0
  322. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_mailmap.md +0 -0
  323. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_matrix.md +0 -0
  324. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_metadata.md +0 -0
  325. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_metrics.md +0 -0
  326. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_npm.md +0 -0
  327. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_pages_redirects.md +0 -0
  328. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_platform_keys.md +0 -0
  329. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_plugin.md +0 -0
  330. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_pr.md +0 -0
  331. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_pr_body.md +0 -0
  332. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_prepare_release.md +0 -0
  333. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_pypi.md +0 -0
  334. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_pyproject.md +0 -0
  335. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_readme.md +0 -0
  336. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_release_sync.md +0 -0
  337. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_releases.md +0 -0
  338. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_runner_catalog.md +0 -0
  339. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_runner_sync.md +0 -0
  340. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_setup_guide.md +0 -0
  341. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_site_anchors.md +0 -0
  342. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_skills.md +0 -0
  343. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_sphinx_crossrefs.md +0 -0
  344. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_status.md +0 -0
  345. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_suite_hygiene.md +0 -0
  346. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_sync_ops.md +0 -0
  347. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_tabular.md +0 -0
  348. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_todolist.md +0 -0
  349. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_tool_runner.md +0 -0
  350. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_unsubscribe.md +0 -0
  351. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_uv.md +0 -0
  352. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_version_sync.md +0 -0
  353. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_versions.md +0 -0
  354. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_virustotal.md +0 -0
  355. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_vulnerable_deps.md +0 -0
  356. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_workflow_sync.md +0 -0
  357. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tests.test_workflows.md +0 -0
  358. {repomatic-7.16.2 → repomatic-7.16.3}/docs/todolist.md +0 -0
  359. {repomatic-7.16.2 → repomatic-7.16.3}/docs/tool-runner.md +0 -0
  360. {repomatic-7.16.2 → repomatic-7.16.3}/license +0 -0
  361. {repomatic-7.16.2 → repomatic-7.16.3}/readme.md +0 -0
  362. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/__main__.py +0 -0
  363. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/awesome_toc.py +0 -0
  364. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/broken_links.py +0 -0
  365. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/cache.py +0 -0
  366. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/cli/__init__.py +0 -0
  367. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/cli/github.py +0 -0
  368. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/cli/lint.py +0 -0
  369. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/cli/main.py +0 -0
  370. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/cli/sample.py +0 -0
  371. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/cli/setup.py +0 -0
  372. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/cli/sync.py +0 -0
  373. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/cloudflare.py +0 -0
  374. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/compat.py +0 -0
  375. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/__init__.py +0 -0
  376. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/actionlint.yaml +0 -0
  377. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/agent-grunt-qa.md +0 -0
  378. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/awesome_template/.github/ISSUE_TEMPLATE/config.yml +0 -0
  379. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/awesome_template/.github/ISSUE_TEMPLATE/new-link.yaml +0 -0
  380. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/awesome_template/.github/code-of-conduct.md +0 -0
  381. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/awesome_template/.github/funding.yml +0 -0
  382. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/awesome_template/.github/pull_request_template.md +0 -0
  383. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/awesome_template/__init__.py +0 -0
  384. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/awesome_template/license +0 -0
  385. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/bumpversion.toml +0 -0
  386. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/coverage.toml +0 -0
  387. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/labels.toml +0 -0
  388. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/mdformat.toml +0 -0
  389. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/mypy.toml +0 -0
  390. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/pytest.toml +0 -0
  391. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/ruff.toml +0 -0
  392. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/skills/av-false-positive/SKILL.md +0 -0
  393. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/skills/benchmark-update/SKILL.md +0 -0
  394. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/skills/brand-assets/SKILL.md +0 -0
  395. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/skills/github-housekeeping/SKILL.md +0 -0
  396. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/skills/probe-workflow/SKILL.md +0 -0
  397. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/skills/repomatic-changelog/SKILL.md +0 -0
  398. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/skills/repomatic-deps/SKILL.md +0 -0
  399. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/skills/repomatic-init/SKILL.md +0 -0
  400. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/skills/repomatic-test-matrix/SKILL.md +0 -0
  401. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/skills/repomatic-topics/SKILL.md +0 -0
  402. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/skills/repomatic-upgrade/SKILL.md +0 -0
  403. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/skills/translation-sync/SKILL.md +0 -0
  404. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/skills/upstream-audit/SKILL.md +0 -0
  405. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/vt-trend-chart.js +0 -0
  406. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/data/yamllint.yaml +0 -0
  407. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/deps/__init__.py +0 -0
  408. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/deps/dep_graph.py +0 -0
  409. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/deps/dep_policy.py +0 -0
  410. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/deps/dep_report.py +0 -0
  411. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/deps/vulnerable_deps.py +0 -0
  412. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/file_inventory.py +0 -0
  413. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/file_ops.py +0 -0
  414. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/forge.py +0 -0
  415. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/frontmatter.py +0 -0
  416. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/github/__init__.py +0 -0
  417. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/github/ci_status.py +0 -0
  418. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/github/issue.py +0 -0
  419. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/github/job_timings.py +0 -0
  420. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/github/matrix.py +0 -0
  421. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/github/pr.py +0 -0
  422. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/github/pr_body.py +0 -0
  423. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/github/release_sync.py +0 -0
  424. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/github/releases.py +0 -0
  425. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/github/sponsor.py +0 -0
  426. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/github/status.py +0 -0
  427. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/github/token.py +0 -0
  428. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/github/unsubscribe.py +0 -0
  429. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/gitignore.py +0 -0
  430. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/hashing.py +0 -0
  431. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/http.py +0 -0
  432. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/humanize.py +0 -0
  433. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/images.py +0 -0
  434. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/mailmap.py +0 -0
  435. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/metadata/__init__.py +0 -0
  436. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/metadata/core.py +0 -0
  437. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/metadata/env.py +0 -0
  438. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/metadata/git.py +0 -0
  439. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/metadata/matrix.py +0 -0
  440. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/metadata/project.py +0 -0
  441. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/npm.py +0 -0
  442. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/pages_redirects.py +0 -0
  443. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/py.typed +0 -0
  444. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/pypi.py +0 -0
  445. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/pyproject.py +0 -0
  446. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/release/__init__.py +0 -0
  447. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/release/attestation.py +0 -0
  448. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/release/binaries_page.py +0 -0
  449. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/release/binary.py +0 -0
  450. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/release/checksums.py +0 -0
  451. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/runner_catalog.py +0 -0
  452. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/setup_guide.py +0 -0
  453. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/sync_ops.py +0 -0
  454. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/tabular.py +0 -0
  455. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/__init__.py +0 -0
  456. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/available-admonition.md +0 -0
  457. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/broken-links-issue.md +0 -0
  458. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/bump-version.md +0 -0
  459. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/detect-squash-merge.md +0 -0
  460. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/development-warning.md +0 -0
  461. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/fix-changelog.md +0 -0
  462. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/fix-typos.md +0 -0
  463. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/fix-vulnerable-deps.md +0 -0
  464. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/format-images.md +0 -0
  465. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/format-json.md +0 -0
  466. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/format-markdown.md +0 -0
  467. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/format-pyproject.md +0 -0
  468. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/format-python.md +0 -0
  469. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/format-shell.md +0 -0
  470. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/generated-footer.md +0 -0
  471. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/github-releases.md +0 -0
  472. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/immutable-releases.md +0 -0
  473. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/pr-metadata.md.noformat +0 -0
  474. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/prepare-release.md.noformat +0 -0
  475. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/refresh-tip.md +0 -0
  476. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/release-notes.md +0 -0
  477. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/release-sync-report.md +0 -0
  478. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/sample-metrics.md +0 -0
  479. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/scan-virustotal.md +0 -0
  480. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/setup-guide-branch-ruleset.md +0 -0
  481. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/setup-guide-cloudflare-pages.md +0 -0
  482. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/setup-guide-dependabot.md +0 -0
  483. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/setup-guide-fork-pr-approval.md +0 -0
  484. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/setup-guide-notifications-pat.md +0 -0
  485. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/setup-guide-pages-source.md +0 -0
  486. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/setup-guide-pypi-trusted-publisher.md +0 -0
  487. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/setup-guide-sha-pinning-required.md +0 -0
  488. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/setup-guide-token.md +0 -0
  489. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/setup-guide-verify.md +0 -0
  490. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/setup-guide-virustotal.md +0 -0
  491. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/setup-guide.md +0 -0
  492. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/sync-action-pins.md +0 -0
  493. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/sync-bumpversion.md +0 -0
  494. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/sync-dep-sources.md +0 -0
  495. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/sync-gitignore.md +0 -0
  496. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/sync-mailmap.md +0 -0
  497. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/sync-repomatic-upgrade.md +0 -0
  498. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/sync-repomatic.md +0 -0
  499. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/sync-runner-images.md +0 -0
  500. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/sync-tool-versions.md +0 -0
  501. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/sync-uv-lock.md +0 -0
  502. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/sync-workflow-pins.md +0 -0
  503. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/unavailable-admonition.md +0 -0
  504. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/unsubscribe-phase1.md +0 -0
  505. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/unsubscribe-phase2.md +0 -0
  506. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/update-dep-graph.md +0 -0
  507. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/update-docs.md +0 -0
  508. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/upgrade-invite.md +0 -0
  509. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/templates/yanked-admonition.md +0 -0
  510. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/tooling/__init__.py +0 -0
  511. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/tooling/bundle.py +0 -0
  512. {repomatic-7.16.2 → repomatic-7.16.3}/repomatic/versions.py +0 -0
  513. {repomatic-7.16.2 → repomatic-7.16.3}/tests/__init__.py +0 -0
  514. {repomatic-7.16.2 → repomatic-7.16.3}/tests/cli-test-suite.toml +0 -0
  515. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_actions.py +0 -0
  516. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_attestation.py +0 -0
  517. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_awesome_template.py +0 -0
  518. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_awesome_toc.py +0 -0
  519. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_binaries_page.py +0 -0
  520. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_binary.py +0 -0
  521. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_broken_links.py +0 -0
  522. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_cache.py +0 -0
  523. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_checksums.py +0 -0
  524. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_ci_status.py +0 -0
  525. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_cloudflare.py +0 -0
  526. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_config.py +0 -0
  527. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_dep_graph.py +0 -0
  528. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_dep_policy.py +0 -0
  529. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_dep_report.py +0 -0
  530. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_dep_sources.py +0 -0
  531. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_dev_release.py +0 -0
  532. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_docstrings.py +0 -0
  533. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_forge.py +0 -0
  534. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_frontmatter.py +0 -0
  535. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_gh.py +0 -0
  536. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_git_ops.py +0 -0
  537. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_gitignore.py +0 -0
  538. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_hashing.py +0 -0
  539. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_help.py +0 -0
  540. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_http.py +0 -0
  541. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_humanize.py +0 -0
  542. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_images.py +0 -0
  543. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_imports.py +0 -0
  544. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_issue.py +0 -0
  545. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_job_timings.py +0 -0
  546. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_mailmap.py +0 -0
  547. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_matrix.py +0 -0
  548. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_npm.py +0 -0
  549. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_pages_redirects.py +0 -0
  550. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_platform_keys.py +0 -0
  551. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_plugin.py +0 -0
  552. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_pr.py +0 -0
  553. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_pypi.py +0 -0
  554. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_pyproject.py +0 -0
  555. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_readme.py +0 -0
  556. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_release_sync.py +0 -0
  557. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_releases.py +0 -0
  558. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_runner_catalog.py +0 -0
  559. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_runner_sync.py +0 -0
  560. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_setup_guide.py +0 -0
  561. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_sphinx_crossrefs.py +0 -0
  562. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_status.py +0 -0
  563. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_sync_ops.py +0 -0
  564. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_tabular.py +0 -0
  565. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_todolist.py +0 -0
  566. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_unsubscribe.py +0 -0
  567. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_uv.py +0 -0
  568. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_version_sync.py +0 -0
  569. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_versions.py +0 -0
  570. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_vulnerable_deps.py +0 -0
  571. {repomatic-7.16.2 → repomatic-7.16.3}/tests/test_workflow_sync.py +0 -0
@@ -20,5 +20,5 @@
20
20
  "license": "GPL-2.0-or-later",
21
21
  "name": "repomatic",
22
22
  "repository": "https://github.com/kdeldycke/repomatic",
23
- "version": "7.16.2"
23
+ "version": "7.16.3"
24
24
  }
@@ -42,6 +42,7 @@ Question overly verbose prose in `CLAUDE.md` and `.claude/agents/*.md`:
42
42
  - Redundant examples or restated rules — cut them
43
43
  - **Discoverable content** — cut it. Structural inventories, code examples copied from source files, and general programming knowledge do not belong in `CLAUDE.md`.
44
44
  - **Misplaced knowledge** — move it to the audience that owns it. Lengthy "why" explanations in YAML workflows belong in Python docstrings; YAML gets a brief "what" + pointer. End-user setup details belong in `setup-guide.md`, not `readme.md`.
45
+ - **Code-anchored rules** — move them beside the code. A rule in `CLAUDE.md` whose subject is one function, test, workflow, setting or page belongs in that docstring or comment, where it cannot drift unseen. Compare the two first: delete the rule when the code already states it, and read the code when they disagree. `CLAUDE.md` keeps a one-line pointer.
45
46
 
46
47
  Prefer mechanical enforcement over prose. If a rule can be a test, autofix job, or lint check — implement it instead of writing it down.
47
48
 
@@ -267,6 +267,7 @@ Cross-references that survive renames:
267
267
 
268
268
  - Always cross-reference external projects through `intersphinx_mapping` and a `{role}` ref, not a bare URL. A renamed function in click-extra surfaces as a Sphinx build error; a bare URL silently 404s in the rendered HTML.
269
269
  - For headings, prefer the auto-generated docutils anchor (e.g., `### option.name` → `option-name`). Add an explicit `(my-anchor)=` only when the natural anchor isn't unique or the target isn't a heading.
270
+ - **Qualify a reference that sits in a base-class docstring.** autodoc repeats the docstring of a base-class attribute on each subclass that overrides the attribute. A short `` {attr}`name` `` then resolves against the subclass, and fails for a member the subclass does not define itself. Write the full dotted target.
270
271
 
271
272
  ## Inline syntax highlighting in prose
272
273
 
@@ -590,7 +591,7 @@ Agent tooling toctree, in this order. Drop the whole block when the project ship
590
591
 
591
592
  Maintainer-facing pages, and when a project carries one:
592
593
 
593
- 01. `contributing` — Setup, dev loop, code-style pointers (or `{include} ../contributing.md` if the root file already exists).
594
+ 01. `contributing` — Setup, dev loop, code-style pointers (or `{include} ../contributing.md` if the root file already exists). The one home of developer setup: `readme.md` and `claude.md` link to it.
594
595
  02. `commit-messages` — Only when automation reads or writes the project's commit subjects, which makes the subject a shared namespace rather than free text: the reserved-prefix rules, who else parses a message, and how to write a subject and body.
595
596
  03. `upstream-development` — Project-internal release process. Mark `(upstream maintainers only)` in the page heading so readers know this is not for consumers.
596
597
  04. `operation-contracts` — Optional, for projects with formal automated-operation contracts.
@@ -762,6 +763,8 @@ Default-pruning rule:
762
763
  - If you keep a setting that *looks* default for documentation purposes, add a one-line comment explaining why ("explicit so future readers see we considered it").
763
764
  - On every Sphinx or extension upgrade, run `sphinx-build -W -b html docs docs/_build/html`. Treat every `RemovedInSphinxX.YWarning`, `DeprecationWarning`, and `application.ExtensionError` as cleanup work, not noise. Fix them in the same PR as the upgrade.
764
765
  - **Match the deployed builder, which is not always `html`.** `[tool.repomatic] sphinx.builder` is what the Docs workflow passes to `sphinx-build -b`, and a project serving extension-less URLs sets it to `dirhtml` (`page/index.html` instead of `page.html`). Read it before assuming a local `-b html` reproduces CI. The builder is chosen on the command line, so it is the one Sphinx setting `conf.py` cannot carry: never "fix" its absence there.
766
+ - **A warning count only covers the pages that build re-read.** Sphinx reuses cached doctrees, so an incremental rebuild reports the warnings of the changed pages alone, and reading that number against a cold build's count shows a drop nothing caused. A `conf.py` edit invalidates the whole cache, which is why the build right after one reports many more. Build into a clean `_build/` before comparing two counts.
767
+ - **Compare two builds only when both hold the same dependency groups.** autodoc imports each module it documents. A build that lacks one group fails those imports, like the test group for a `tests` API page, and each reference into such a module then reports as unresolved. Build the baseline from an export of `HEAD` and the candidate from the working tree, both with `uv run --isolated --frozen --all-extras --all-groups`: neither touches the shared virtual environment.
765
768
  - Periodically diff against a fresh `sphinx-quickstart` output in a tmpdir to spot defaults that have shifted under you.
766
769
  - Drop conditional import shims once the project's minimum Python no longer needs them. The `try: import tomllib / except: import tomli` pattern is dead code on `requires-python = ">=3.11"`. Same for any `if sys.version_info < (3, X):` branch where `X` is now below the floor. The deps group should lose the corresponding fallback dependency in the same PR.
767
770
  - Always pass `encoding="utf-8"` to `Path.read_text()` calls in `conf.py`. Bare `read_text()` picks up the locale, which on minimal CI runners has bitten many projects.
@@ -856,7 +859,7 @@ When you receive a new "rule" about how to write or maintain docs, ask where it
856
859
  - A pattern only the upstream package itself uses (e.g., `docs/docs_update.py` internals, release-only artifacts) → `docs/upstream-development.md`.
857
860
  - A pattern downstream Sphinx repos benefit from → this agent definition.
858
861
 
859
- Don't restate `claude.md` rules here. Reference the section instead.
862
+ State a rule that belongs here inline, never as a pointer to a `claude.md` section. This file ships to repositories that do not receive repomatic's `claude.md`.
860
863
 
861
864
  When a user-driven instruction explicitly conflicts with a `claude.md` or global tropes rule (e.g., the install.md compatibility-matrix range labels use a `→` arrow, which conflicts with the global `Unicode Decoration` anti-pattern), the explicit instruction takes precedence. Note the conflict in your reply so the user can confirm or override, but apply the instruction.
862
865
 
@@ -881,7 +884,7 @@ Watch for these every pass:
881
884
  - A `{toctree}` that outgrew the ~12-entry threshold and is still flat, or a captioned section left holding a single entry after pages moved around it. See § Grouping pages into sidebar sections.
882
885
  - An `automodule` block on a narrative page, repeating what the module's own API page already documents. Every such pair costs a duplicate object description per member and buries the guide's message; see § Guide pages carry the prose, API pages carry the API.
883
886
  - Stale `.rst` files in `docs/` left over from package renames or earlier `sphinx-apidoc` runs that reference modules or packages no longer in the source tree. They build silently (autodoc skips missing modules with a warning, not an error) but pollute search results and the modindex. Sweep with `git status` after `update-docs`; delete orphans in the same PR.
884
- - A `## Development` section in `readme.md` that should have been removed when the project added a `claude.md`. Once `claude.md` exists, the developer-facing setup goes there; keeping a duplicated section in the readme creates two places to update.
887
+ - Developer setup held in `readme.md` (a `## Development` section) or in `claude.md`. Setup, dev loop and test commands belong on the `contributing` page of the roster, where a contributor looks for them. `claude.md` loads into every agent session, so it keeps conventions and links to that page. A second copy creates two places to update.
885
888
  - A `dependencies.md` page whose embedded Mermaid graph hasn't been regenerated since the last `uv lock` change. The graph stays in sync only if `repomatic update-dep-graph` is wired into a workflow job; manual regeneration drifts. Upstream that job lives in `_release-engine.yaml` and fires on release commits only, so a graph lagging `pyproject.toml` mid-cycle is expected rather than drift.
886
889
  - `pyproject.toml` declaring a docs dependency that's no longer imported by `conf.py` (or vice-versa: importing one not declared). The mismatch passes Sphinx but trips a fresh `uv sync --group docs` run on a CI runner.
887
890
  - `click_extra.sphinx.myst_docstrings` listed in `extensions` without `click-extra[sphinx]` declared in `[dependency-groups] docs`. Builds work on the maintainer's machine if the package is installed globally, then break in CI.
@@ -151,7 +151,7 @@ When drafting a rejection or request-for-changes comment:
151
151
 
152
152
  For issues reporting broken links (typically automated by the lychee link checker):
153
153
 
154
- - **403 from Medium/Substack**: Bot-blocking responses, not genuine dead links. Ignore unless the content is confirmed gone.
154
+ - **403 from a crawler-blocked domain** (Medium, Substack): not a dead link when a browser still gets the full article. Keep the URL and add the domain to `[tool.lychee] exclude` in `pyproject.toml`, per `contributing.md` § URL. The `[tool.lychee]` template that repomatic syncs already excludes `medium.com`.
155
155
  - **404 confirmed dead**: Replace with archive.org/archive.ph/sci-hub.st per `contributing.md` § URL. Replacing a broken URL is maintenance; removing the entry is a curation decision.
156
156
  - **Archived GitHub repos**: Check for forks or reboots. If none exist and the section has other entries covering the same ground, the entry can be removed. Leave the door open for re-inclusion if the project revives.
157
157
 
@@ -102,6 +102,8 @@ After fixing (step 5-7), the loop restarts from the top: push, run all three cha
102
102
 
103
103
  It reads every workflow a push can start (derived from `.github/workflows/`, so its list is wider than the five above), reports each one's latest run, and names the failing jobs that actually gate a merge. Three traps it settles, so no hand-rolled `jq` has to: a run's own `status` lags its jobs (every monitored workflow can read `queued` while a dozen jobs have already finished, which is indistinguishable from the runner-cap saturation a busy account genuinely hits); a `continue-on-error` probe that crashed hides inside a `success` run conclusion; and a run whose `conclusion` is `failure` with *no* failed job is a workflow-level error (an invalid `strategy.matrix` expression, malformed YAML, a missing secret) with no job log to read, which the command flags rather than letting you write off a persistently-red workflow as a known artifact.
104
104
 
105
+ `ci-status` reads the same endpoints as the `gh api` calls above, and it has printed a stale table the same way: re-read a surprising red or green once before acting on it.
106
+
105
107
  Run state *does* gate the run-scoped log read (step 4): `gh run view --log-failed` refuses to answer until the parent run reaches a terminal state. A completed job's own log is readable at once.
106
108
 
107
109
  **A queue is not a hang, and elapsed time alone cannot tell them apart.** A long stall invites the theory that some run is stuck and that cancelling it would free the pool, which is a conclusion worth reaching only on evidence, because acting on it destroys work that was progressing fine. Two readings settle it, and neither is the elapsed clock. Get a **baseline** from that workflow's recent successful runs (`gh run list --workflow <wf> --repo <owner/repo> --status success --json createdAt,updatedAt`): a suite whose normal duration is two hours is not hung at ninety minutes. Then read **per-job `completedAt` timestamps** (`gh run view <id> --json jobs`) rather than an aggregate: a flat count of `in_progress` jobs is not evidence of a stall, since jobs finish and others start into the freed slots, holding the count steady while real progress continues. Watch for the self-contradiction that exposes the mistake, a report that the count "dropped from 11 to 9" *and* that nothing has changed. Two smaller traps live here too: `gh` reports a pending job's `conclusion` as `""`, not `null`, so a `select(.conclusion == null)` filter silently matches nothing and reads as "no pending jobs"; and jobs queue against the runner pool their `runs-on` names, so a stall confined to macOS cells says nothing about Linux capacity. **Never cancel another repository's run to free slots without the maintainer's explicit go-ahead**, and never ask for that go-ahead on a diagnosis you have not backed with a baseline and timestamps.
@@ -284,6 +286,8 @@ Not all CI failures are code bugs:
284
286
 
285
287
  For infrastructure, re-run the failed jobs (`gh run rerun <RUN_ID> --failed`) and continue polling; never modify code to work around transient infra. **A release run is the exception**: when an orchestrator like `/repomatic-ship` spawned this loop, a flake surfaced here is debt owed under that skill's genuinely-green goal, so a red whose defect lives in the repository (the wall-clock budget above, a tolerated-exit set that needs widening) gets fixed at the source instead. "Transient infra" then names the trigger, not the remedy. A red with no repo-side defect at all, like a runner OOM or a PyPI 503, is still a re-run.
286
288
 
289
+ **`--failed` also re-runs the jobs skipped behind a failure.** Each failed or cancelled job re-runs with every job that `needs:` it, skipped ones included. So one rerun restores the whole chain: never re-run the whole workflow to reach a skipped dependent.
290
+
287
291
  <a id="github-api-rate-limit-exhaustion"></a>
288
292
 
289
293
  ### GitHub API rate-limit exhaustion
@@ -157,6 +157,8 @@ Search with multiple keyword variations (error messages, function names, symptom
157
157
 
158
158
  If a matching open issue exists, report it to the user and stop. If a matching closed issue exists, mention it in the report with a link and explain why this is a new occurrence (different version, different context, regression).
159
159
 
160
+ A matching issue closed for lack of a reproducer is not a dead end: cite it, because that closure is part of the record, and supply what it lacked.
161
+
160
162
  ### 3. Gather evidence
161
163
 
162
164
  Collect the actual error output, environment details, and reproduction steps from the current conversation context, CI logs, or local files. Always include:
@@ -178,6 +180,29 @@ Maintainers can diagnose faster when they can see the original context themselve
178
180
 
179
181
  Ask yourself: "Can the maintainer click a link and immediately see what I'm describing?" If yes, include the link. If the context is private, quote the relevant snippet inline instead.
180
182
 
183
+ #### Observations, not conclusions
184
+
185
+ The maintainer of the code is the authority on it. Hand over observations they can verify in one click, and leave the diagnosis to them:
186
+
187
+ - **Link every factual claim to the exact line that proves it.** A claim drawn from a CI log links the log line (see § GitHub Actions log anchors below); a claim that exists only in an uploaded artifact links the artifact, since no log line proves it.
188
+ - **Check a claim about the upstream tool against its source or manual before writing it.** Memory is not a source. Where a code comment in the tool says it better, quote the comment verbatim and link it.
189
+ - **Date a behavior by the commit that added it, not by the release note that announced it.** Release notes list what is worth reading about now, not what shipped now: `git tag --contains {sha} | sort -V | head -1` names the first release that carried the commit.
190
+ - **Report what varied, where, and the link to it, then stop.** Leave the diagnosis, its implications for CI or users, and the next step to the maintainer, who reaches them faster from the facts than from a summary of them.
191
+ - **Give every failing reproducer a passing control beside it.** Without a near-identical case that passes, red cannot be told apart from a broken harness, a missing dependency or a mistake in the reproducer. Assert the control too, and have the job report the test as void when the control breaks.
192
+ - **Freeze the reproducer's vocabulary once the prose quotes it.** Renaming a log line, an artifact or a path that the report quotes forces a rerun, then a repoint of every link and quoted phrase.
193
+ - **Re-read the draft before handing anyone steps to reproduce.** Give only the steps the draft records as reproducible, and flag a symptom seen only once as a one-off.
194
+
195
+ #### GitHub Actions log anchors
196
+
197
+ A `…/actions/runs/{run}/job/{job}#step:{N}:{line}` link follows non-obvious numbering, verified against live runs:
198
+
199
+ - **Fetch the raw log** with `gh api repos/{owner}/{repo}/actions/jobs/{id}/logs --allow-escape-sequences`. Without the flag, `gh` refuses the escape sequences and writes an empty file. The job's numeric ID is `id` in `gh api repos/{owner}/{repo}/actions/runs/{run}/jobs`, and `databaseId` in `gh run view {run} --json jobs`, which has no `id` field: reading `.id` there returns `null`.
200
+ - **The step number counts "Set up job" as 1**, so a workflow's sixth step is `step:7`.
201
+ - **Read that number from the API, never by counting log sections.** The raw log omits a skipped step while the fragment still counts it, so one `if:`-guarded step shifts every anchor below it by one, and only on the runs where it was skipped. `gh api repos/{owner}/{repo}/actions/jobs/{id}` returns `steps[].number` and `steps[].conclusion`: line the non-skipped steps up against the log's `##[group]Run ` markers in order, then take the number off the step. Its `name` is also the cheapest check that an anchor landed where intended.
202
+ - **The line number starts at the step's `##[group]Run …` marker**, which is line 1, and includes the echoed script plus the `shell:`/`env:` preamble before any output.
203
+ - **Strip the leading timestamp** (`^\S+Z `) from each raw line before counting or matching.
204
+ - **Anchors rot on every rerun.** Any change in a job's output shifts every line below it, and a tool printing one extra banner line moves anchors nobody touched. After a rerun, repoint every anchor programmatically and re-resolve each one against the new logs to confirm it still lands on the intended line; never trust the arithmetic.
205
+
181
206
  ### 4. Select the right template
182
207
 
183
208
  Based on step 1d, pick the correct template:
@@ -227,6 +252,7 @@ What happens instead, with exact error output in code blocks.
227
252
  - Use first-person singular ("I", "my") per user conventions.
228
253
  - Include exact error messages in code blocks, not paraphrases.
229
254
  - If multiple distinct failures exist, group them under numbered sub-sections but keep them in one report if they share a root cause. File separate issues if root causes differ.
255
+ - File a second finding as its own issue, cross-referenced, never by broadening the first one's title. The title must still name the fix that closes it.
230
256
  - Keep reproduction steps minimal: strip everything not needed to trigger the bug.
231
257
  - Link to CI runs or logs when available.
232
258
  - Do not speculate about fixes unless the root cause is clear from the evidence.
@@ -26,7 +26,7 @@ Before flagging an issue, verify that the gap isn't **deliberate** or covered by
26
26
 
27
27
  - **`[tool.repomatic] exclude` is authoritative.** Files listed there (like `workflows/changelog.yaml` or `labels`) are intentionally absent on disk. Do **not** report them as MISSING.
28
28
  - **Bundled defaults applied at runtime.** Some config is materialized from the bundled template at runtime when the file is absent, so no on-disk copy is needed. **Absence of these files is not a problem**: it is the intended state when the user is happy with the bundled policy. Only flag DRIFT if the user wants to deviate from it. Exactly five tools carry such a fallback, the ones whose `ToolSpec` sets `default_config` in `repomatic/tooling/tool_registry.py`: `actionlint`, `mdformat`, `ruff`, `yamllint` and `zizmor`.
29
- - **A `[tool.X]` section is never a candidate for deletion.** The inverse of the rule above, and the more expensive mistake. Every other tool has no `default_config`, so its resolution chain has no level 3 to fall back on: `lychee`, `typos`, `mypy`, `pytest`, `coverage`, `bumpversion` and `uv` are *deployed* into `pyproject.toml` by `repomatic init`, and that section is the only config the tool will ever see. Deleting it does not restore inheritance from a bundled default, it drops the tool to level 4 and runs it bare, silently discarding every rule the section held. Read the tool's `default_config` before proposing a section be dropped "to inherit upstream updates". A deployed section that has gone stale is fixed by re-running `repomatic init`, which resyncs the components marked `SyncMode.ONGOING` in `repomatic/registry.py`.
29
+ - **A `[tool.X]` section is never a candidate for deletion.** The inverse of the rule above, and the more expensive mistake. Every other tool has no `default_config`, so its resolution chain has no level 3 to fall back on: `lychee`, `typos`, `mypy`, `pytest`, `coverage`, `bumpversion` and `uv` are *deployed* into `pyproject.toml` by `repomatic init`, and that section is the only config the tool will ever see. Deleting it does not restore inheritance from a bundled default, it drops the tool to level 4 and runs it bare, silently discarding every rule the section held. Read the tool's `default_config` before proposing a section be dropped "to inherit upstream updates". Re-running `repomatic init` fixes a stale section only for the components marked `SyncMode.ONGOING` in `repomatic/registry.py` (`lychee`, `typos`, `bumpversion`, `uv`). It never revisits a `mypy`, `pytest` or `coverage` section after the first write: `lint-repo` warns on each bundled template entry such a section lacks, to copy by hand or decline on purpose.
30
30
  - **Generator artifacts vs user error.** When local thin-callers diverge from upstream (e.g., extra `workflow_dispatch:`, missing `paths:`), the cause may be the **upstream generator**, not downstream tampering. Inspect `repomatic/github/workflow_sync.py` (`generate_thin_caller`, `_adapt_trigger_paths`, `generate_workflow_header`) before recommending the user re-run `repomatic init` to "fix" something `init` itself produced.
31
31
  - **Project-level `claude.md` may live under a sub-directory.** `[tool.repomatic] subagents.location` and `skills.location` indicate a project where `.claude/` is not at the root (e.g., dotfiles repos with `dotfiles/.claude/CLAUDE.md`). Search the configured location, not just `./CLAUDE.md`.
32
32
 
@@ -36,7 +36,7 @@ The sweep agents (step 1) and the babysitter (step 6) all follow these rules. Re
36
36
  - **Expand `<cmd>` before it reaches a spawn prompt.** `<cmd>` is this document's placeholder, not a shell command, and a prompt that carries it verbatim (or half-expanded) hands the agent something that cannot run. The trap is `run <tool>`: the tool registry supplies most of them, so dropping the `repomatic run` prefix does not merely drift from the pinned version, it fails outright — a spawn brief that expands `<cmd> run mypy --` into `uv run --frozen -- mypy --` dies on `Failed to spawn: mypy`, since mypy is not a project dependency. Write the invocation out in full (`uv run repomatic run mypy --`) and let the agent report back if it does not resolve.
37
37
  - **Trust the tree, not the report.** A mid-run message to a busy agent is delivery without receipt: it can land after the agent composed its final report and be silently dropped. After tasking a running agent, confirm the tree reflects the request (`git diff` the target file) before moving on. Read fresh every time rather than reusing an earlier capture — an edit can land in the gap between two checks, and a stale capture then reports a live fix as still missing. Grep for the *absence* of the old text (`grep -c '<old phrase>' <file>` returning `0`) instead of eyeballing a diff: an empty match is unambiguous where a diff read mid-scroll is not.
38
38
  - **Never let one lane wait on another lane's edit.** Messages cross: an agent can ask a sibling for a change while you reassign that file, then wait on an edit nobody will make. Name one owner per file in the same message to both agents, and when an agent reports it is blocked on another lane, make the edit yourself and tell it the edit landed. The archetype: one agent armed a watcher for a docs fix that the other had been told to leave alone, and the release sat idle until the orchestrator applied it.
39
- - **Never revert the shared working tree.** The agents share one tree, so disjoint lanes do not make them race-free: no agent may run a working-tree-reverting git command (`checkout`, `restore`, `stash`, `reset`, `clean`), which silently discards the *other* agents' uncommitted edits. For full isolation instead, spawn with `isolation: "worktree"` and merge on join: disjoint files won't conflict.
39
+ - **Never revert the shared working tree.** The agents share one tree, so disjoint lanes do not make them race-free: no agent may run a working-tree-reverting git command (`checkout`, `restore`, `stash`, `reset`, `clean`), which silently discards the *other* agents' uncommitted edits. The rule binds investigation as much as correction, and investigation is where it gets broken: an agent comparing its file against the committed state reaches for `git stash`, which takes the whole tree rather than the one path it had in mind. Say so in the spawn prompt, and name the read-only alternative beside it, `git show HEAD:<path>`. For full isolation instead, spawn with `isolation: "worktree"` and merge on join: disjoint files won't conflict.
40
40
  - **Fix commits stage narrowly** (`git commit <path>`, never `-a`). Uncommitted files an agent did not create are the maintainer's in-progress work: never revert them and never sweep them into a commit.
41
41
  - **Degrade gracefully.** A cross-referenced skill excluded from this repo is a fallback path, not a blocker: apply its principle via an `Agent` or inline. When an `Agent` spawn itself fails (a terminal API error), do the work in the main thread.
42
42
 
@@ -67,7 +67,7 @@ The three substance passes own disjoint lanes (code owns Python including docstr
67
67
  - Failures the pass believes pre-existing get *reported*, not silently scoped out: that verdict belongs to step 2's CI check.
68
68
  - Adopting features from upgraded dependencies stays in `/repomatic-deps modernize`.
69
69
  - On the canonical repo, workflow invocations reading `uv --no-progress run --frozen -- repomatic` are the intended unfrozen state (the freeze commit rewrites them to a `uvx 'repomatic=={version}'` PyPI pin at release): never flag the local form as a pin regression or downstream breakage. The invariant to check instead is that every `uv`-invoking job provisions `setup-uv` in its own steps. Do not "restore" an isolated `uvx --from .` here: the lockfile path is deliberate, since an index resolution can be made unsatisfiable by the install cooldown while a lockfile cannot.
70
- - Docstring rendering belongs to this pass: build the docs and fix any broken cross-reference role a docstring introduced (the docs pass can surface but not fix them). Build in a separate environment, with `{scratch}` a directory outside the repository: `UV_PROJECT_ENVIRONMENT={scratch}/docs-venv uv run --frozen --all-extras --group docs -- sphinx-build -b html docs docs/_build/html`. The shared `.venv` then keeps the CI-matching groups, which the `docs` group would perturb (see step 2's `--all-groups` warning). A checked-in `:mirror:` block whose cells embed source-line anchors is invalidated by every edit that moves a line in the anchored modules, docstring rewraps included: expect the `update-docs` autofix PR to refresh it after the push, and take that PR's file (`gh api 'repos/<owner>/<repo>/contents/<path>?ref=update-docs' -H 'Accept: application/vnd.github.raw'`) when a local regeneration would differ from CI's, as a terminal-dependent width does, or when `gh pr merge` is permission-walled. Build only into the gitignored `docs/_build`, never an ad-hoc path: a stray build tree pollutes `git status` and trips tool scans like `run typos`.
70
+ - Docstring rendering belongs to this pass: build the docs and fix any broken cross-reference role a docstring introduced (the docs pass can surface but not fix them). Build in a separate environment, with `{scratch}` a directory outside the repository: `UV_PROJECT_ENVIRONMENT={scratch}/docs-venv uv run --frozen --all-extras --group docs -- sphinx-build --fresh-env -b html docs docs/_build/html`. The shared `.venv` then keeps the CI-matching groups, which the `docs` group would perturb (see step 2's `--all-groups` warning). `--fresh-env` re-reads every page: an incremental build reports warnings only from the pages it re-read, so it misses a reference that a rename broke in another page. A checked-in `:mirror:` block whose cells embed source-line anchors is invalidated by every edit that moves a line in the anchored modules, docstring rewraps included: expect the `update-docs` autofix PR to refresh it after the push, and take that PR's file (`gh api 'repos/<owner>/<repo>/contents/<path>?ref=update-docs' -H 'Accept: application/vnd.github.raw'`) when a local regeneration would differ from CI's, as a terminal-dependent width does, or when `gh pr merge` is permission-walled. Build only into the gitignored `docs/_build`, never an ad-hoc path: a stray build tree pollutes `git status` and trips tool scans like `run typos`.
71
71
  - Shortening an over-long workflow line to satisfy yamllint's 120-char limit must not lift `hashFiles(...)` (or any `runner.*`) into a workflow-level `env:` var: that context exposes only `github`/`secrets`/`inputs`/`vars`, so the expression resolves to empty at run-init before checkout and silently breaks the value — a cache `key:` shortened this way ships a broken key to every downstream repo. Shorten the literal itself instead (trim a shared key prefix, say).
72
72
  - The red inventory from the pre-spawn capture is part of its brief: root-cause each repo-fixable red (a chronic platform break, a flaky live-registry install, a crashing `⁉️` probe) and fix it at the source per step 6's taxonomy, even when the failing file saw no change this cycle.
73
73
  - Pending work the cycle introduced belongs in a ```` ```{todo} ```` admonition where Sphinx renders it, not in a bare `# TODO`/`XXX` comment: a comment never reaches the published todo list, which is the project's inventory of what it owes. This applies to **committed** cycle-diff lines only, and does not loosen the unstaged-scratch guard above: a `# TODO` present only in the unstaged set is the maintainer's draft and stays untouched.
@@ -82,6 +82,7 @@ The three substance passes own disjoint lanes (code owns Python including docstr
82
82
  - **On a cycle that migrated the release tooling itself, the historical freeze under-predicts the new one.** A pre-repomatic freeze touching only `changelog.md` says nothing about the repomatic freeze, which also rewrites `citation.cff`, `__init__.py`, and `pyproject.toml`: treat every version sample as hand-maintained until the regenerated release PR's diff shows the new freeze's actual scope.
83
83
  - The mirror of the hand-maintained rule: a freeze-managed field legitimately shows the *dev* version between releases, so never flag one as stale against the released tag or as a dead link. `pyproject.toml`'s `urls.Download` reading `.../releases/tag/vX.Y.Z.devN` (a tag that has no GitHub release yet) is the expected post-bump state that the freeze rewrites to the release tag at cut. Hand-maintained samples track the *released* tag while freeze-managed fields track the *dev* version, so classify a version string by which mechanism owns it before judging it stale.
84
84
  - A third owner sits beside hand-maintained and freeze-managed: artifacts regenerated by `_release-engine.yaml`'s `update-dep-graph` job, whose `if:` gates on `release_commits_matrix`, so it fires **only on release commits** (never on ordinary pushes, to avoid noise from transitive dependency churn). It sits in the release engine rather than `autofix.yaml` because a release push is its only firing moment, and that is exactly the push `autofix.yaml` now skips wholesale, so do not go looking for it there. `docs/assets/dependencies.mmd` therefore lags `pyproject.toml` for the whole cycle: a runtime dependency added since the last release is *expected* to be missing from it, and the graph catches up through its own PR once the release lands. Never hand-forge the file, and never run `<cmd> update-dep-graph` to "fix" it mid-sweep: a local run uses whatever repomatic version the sweep resolved rather than the version the job pins, so it produces churn the next regeneration reverts. Classify a stale-looking generated artifact by the job that owns it before reporting it as drift.
85
+ - **A fourth owner is a version derived from a sibling checked-in file, and it is the only one that breaks something when bumped.** A build recipe in prose stages an artifact and then invokes a spec, manifest or lockfile the repository tracks, so its version must equal what that file declares rather than the released tag. Bumping the prose alone leaves the recipe unrunnable: `docs/packaging.md`'s openSUSE walkthrough downloads `{pkg}-{X.Y.Z}.tar.gz` into `~/rpmbuild/SOURCES`, then runs `rpmbuild -ba {pkg}.spec`, which resolves `Source0` through the spec's own `%{version}` and fails on the tarball the reader was just told to fetch. The tell is that the literal sits inside a procedure invoking a file in the repository: read that file's declared version before touching it. `git log -S '<the literal>'` settles the owner, since a derived value is written once by the commit that added the recipe and no sweep ever bumps it.
85
86
  - **A hand-maintained block enumerating a registry population is a drift class the version rules above do not reach.** A readme that pastes a console transcript of a whole collection (a `members` mapping, a `member_ids` set, a name list) or carries a `mirror-src` diagram lags the moment an entry is added, and nothing reports it: the version-string grep never looks at membership, no build reads those blocks back, and a mirror block stays stale until someone runs its refresher. Check every such block against the live collection, and derive the file set the change owes from the previous commit of the same kind rather than reasoning about it, since `git log -S '<a sibling entry>'` finds the commit that added the last one and its diff names each file that change had to touch. The archetype: a cycle adding one `Platform` refreshed the four generated `docs/` tables and left `readme.md` short in four places, three hand-pasted transcripts plus a mindmap `click-extra refresh-directives` regenerates, while every other platform including the previous release's two appeared in all four.
86
87
  - Executable doc blocks fail open: a `{click:run}` invocation that no longer parses renders the usage error into the published page instead of failing the build (`docs.yaml` stayed green while a stale option printed `No such option`; only `click:tree` and `click:config` hard-error). Verify each `{click:run}` invocation against the current CLI, or grep the built HTML for `Error: No such option`-class output.
87
88
  - Correcting one description of a convention means correcting *every* description of it in the same pass: a rule restated in more than one place (an overview line and its worked example, two docs pages) drifts as a set, so grep for the sibling statements and align them together — fixing one in isolation leaves the others contradicting the fix (a freeze-cutoff overview still said "the day after" while its worked example had been corrected to "the second day after", reconciled only on a second pass).
@@ -153,7 +154,7 @@ The checks:
153
154
  - **Binary self-test plan**, against the source build: `uv run -- click-extra test-suite --command <source-entrypoint> --jobs max`, the same engine `tests.yaml` (`--command`) and `release.yaml` (`--binary`) drive. It catches the two failures otherwise hidden until the ~90-minute matrix: a case assertion drifted from current CLI output (colors stripped by the piped harness, a moved string), and a plan that cannot *load* under the binary runner's stdlib-only base deps.
154
155
  - **Keep the plan TOML or JSON.** A YAML or json5 plan raises "format support disabled" and silently falls back to a trivial suite. Confirm a non-TOML plan parses under stdlib `tomllib`, since the full-venv source run has the format extras and hides the gap.
155
156
  - **It cannot catch a case whose expected output depends on the target platform's identity.** The source run is single-OS, so an assertion keyed on the release runner's distro (a `manylinux` container correctly detected as its RHEL/AlmaLinux base) or a manager present only there passes locally and still reds the binary matrix. A cycle that bumps a platform-detection dependency (`extra-platforms`) can silently shift such attributions: expect test-plan breakage in the binary matrix and check it there, not just in the source self-test.
156
- - **Fresh resolution**: `uvx --no-progress --from . <cmd-bare> --version`. A fresh isolated env resolves `[project.dependencies]` from scratch, surfacing transitive conflicts the already-synced venv hides; CI's `🧬 Project metadata` job runs exactly this on every workflow, and end users installing via `uvx` hit the same resolution, so a failure is **release-blocking**. Fix at the dependency level (drop, swap, or wait on upstream), never with environment-scoped overrides: `uvx --from .` does not read `[tool.uv] override-dependencies`.
157
+ - **Fresh resolution**: `uvx --no-progress --from . <cmd-bare> --version`. A fresh isolated env resolves `[project.dependencies]` from scratch, surfacing transitive conflicts the already-synced venv hides; CI's test matrix installs from `uv.lock` and hides them too, while end users installing via `uvx` hit exactly this resolution, so a failure is **release-blocking**. Fix at the dependency level (drop, swap, or wait on upstream), never with environment-scoped overrides: `uvx --from .` does not read `[tool.uv] override-dependencies`.
157
158
  - **A cooldown filter is not a resolution failure — check for it before declaring one.** `uvx` reads the *user-level* `~/.config/uv/uv.toml`, which on a maintainer's machine typically carries a supply-chain `exclude-newer` (repomatic recommends one). A release that raises a dependency floor to a version published inside that window then fails to resolve **on the maintainer's machine only**, for a reason no end user shares and no dependency conflict caused. The tell is in uv's own output: a `hint: <pkg> was filtered by exclude-newer to only include packages uploaded before <date>. The latest version satisfying the requirement is vX, published at <later date>` — that is environment, not a conflict. Note this is self-clearing: the same command passes untouched once the dependency ages past the window.
158
159
  - **Re-run with the cutoff lifted wholesale, and judge the gate on that result.** Use `uvx --no-progress --exclude-newer 2100-01-01 --from . <cmd-bare> --version`. Lifting it per-package (`--exclude-newer-package <pkg>=0d`) just surfaces the next floor in the chain, one round-trip at a time.
159
160
  - **A cooled run that resolves and then crashes is a floor bug, not the cooldown.** The two look alike and mean opposite things. A cooldown artifact fails *during* resolution, and says so with the `hint:` above. A floor bug installs cleanly, then dies at runtime on the older version the cooldown fell back to: typically a `TypeError` naming an argument a newer release introduced. Lifting the cutoff hides it, so judging the lifted run alone passes the gate on a release that every cooled install will break. Downstream repos run the frozen `uvx 'repomatic==X.Y.Z'` under a workflow-level `UV_EXCLUDE_NEWER`, and `uvx` reads neither `uv.lock` nor `[tool.uv]`. Read the traceback before crediting the cutoff. When the older version is at fault, raise the floor to what the code needs, and let `lint-deps` say whether the release waits.
@@ -191,6 +192,8 @@ Commit the reconciled tree with a message describing the net reconciliation (plu
191
192
 
192
193
  **Re-read `git status` immediately before staging, and never reach for `git add -A`.** A sweep agent that has gone quiet is not necessarily finished: it can resume editing minutes later, after the step-2 gate has already run and while you are drafting the commit. `git add -A` then sweeps in files you never reviewed and whose changes the gate never covered. Diff every path that was not in the tree when you ran the gate, and re-run the gate before committing if any appeared: an edit landing after the gate is an ungated edit, whoever made it. This is not hypothetical bookkeeping — one such late edit dropped an explicit `name=` from a Click command, which would have silently renamed a CLI command the changelog advertises had the framework not happened to derive the same name from the function. The narrow-staging rule the sub-agent rules impose (`git commit <path>`, never `-a`) applies to the orchestrator's own reconciliation commit for exactly this reason.
193
194
 
195
+ **A gate command you ran yourself re-creates the mutations you already reverted.** The step-2 revert is not final, and a sweep agent is not the only thing that writes to the tree. Any later step that builds the documentation regenerates the committed artifacts that build owns, and a test selection can build them without announcing it. In one run a docs build restamped 121 capture SVGs and the orchestrator discarded them; a `pytest` selection over a single Sphinx test module then brought 23 of them back, after every gate had passed. So re-read `git status` after the *last* command that touched the tree, not after the sweep agents joined, and stage by explicit path so a resurrected artifact cannot enter the commit.
196
+
194
197
  **Signed commits need the sandbox off.** With SSH signing (`gpg.format = ssh`), the harness sandbox blocks the key or socket under `~/.ssh/*` (`Operation not permitted`): disable the sandbox for the `git commit` and `git push` calls only.
195
198
 
196
199
  **A hardware key is not a retry loop.** A hardware-backed key (Secretive, YubiKey, TPM) prompts the maintainer per signature, and one unanswered prompt wears three faces, sometimes in sequence across retries: `agent refused operation?`, `Couldn't sign message (signer): communication with agent failed?` (exit 128, then `failed to write commit object`), or no output whatsoever until something kills the command. The first two look like a real failure; the third is the expensive one, because a signing command silent for minutes is a prompt nobody answered rather than a slow command, so bound it with a timeout and hand off instead of waiting it out. Stop after one or two retries and ask the maintainer rather than burning prompts they may not be watching.
@@ -233,7 +236,7 @@ Its prompt restates the sub-agent rules (the trailer and narrow staging especial
233
236
  - **Poll at the job level** (`gh run view <run> --json jobs`), per the tight fix-loop above, never the run's `conclusion` alone: a run-level read hides an already-failed fast job for as long as the slowest cell runs (a failed `once-tests` job once hid for half an hour behind a 40-minute macOS cell that ultimately passed). Break the instant any required job turns `conclusion == "failure"` — required meaning any name *without* `⁉️` in it, which covers the glyph-less non-matrix jobs (`🛡️ Lint types`, `1️⃣ Run-once tests`, `📦 Package install`) as well as the `✅` cells.
234
237
  - **Log fetches may need the sandbox off**: `gh run view --log-failed` caches under `~/.cache/gh`, which the sandbox denies; the `creating cache entry ... operation not permitted` failure masquerades as a `gh` bug.
235
238
  - **Foreground `sleep` is blocked in the orchestrator's shell**, so you cannot run the in-turn `while … sleep` poll loop the spawned babysitter uses. Drive the wait with the `Monitor` tool (an until-loop command that emits each workflow's terminal state and exits) or a bounded `gh run watch <run-id>`, acting on each landing. The babysitter's "never detach a monitor" rule governs the *sub-agent* polling in-turn; the orchestrator taking over must reach for `Monitor`/`gh run watch` precisely because its own `sleep` is disallowed.
236
- - **Write that watcher in Python, and never trust a green it reports without confirming against `gh`.** The failure that matters here is not a watcher that crashes, it is one that exits silently declaring success: its "all workflows terminal" line is indistinguishable from the real thing, and it arrives *early*, which reads as good news. A shell watcher is the easy way to get one, because macOS ships bash 3.2: `declare -A` is a hard error there, so the obvious "have I already reported this workflow?" map fails on the first iteration, every workflow falls through as already-seen, and the loop announces completion while the whole matrix is still queued. A stderr line scrolling past in the monitor's output file is the only hint. Python has no such trap and gives you a `set()` that works on any machine. Whatever you write, the confirmation is the same: re-read `gh api 'repos/<owner>/<repo>/actions/runs?head_sha=<full-sha>'` yourself before acting on a terminal claim, exactly as you do for the babysitter's own return.
239
+ - **Write that watcher in Python, and never trust a green it reports without confirming against `gh`.** The failure that matters here is not a watcher that crashes, it is one that exits silently declaring success: its "all workflows terminal" line is indistinguishable from the real thing, and it arrives *early*, which reads as good news. A shell watcher is the easy way to get one, because macOS ships bash 3.2: `declare -A` is a hard error there, so the obvious "have I already reported this workflow?" map fails on the first iteration, every workflow falls through as already-seen, and the loop announces completion while the whole matrix is still queued. A stderr line scrolling past in the monitor's output file is the only hint. Python has no such trap and gives you a `set()` that works on any machine. The same early exit arrives with no shell involved: that `head_sha` endpoint answers eventually-consistently, and it has returned an empty page for a commit that listed eight runs a minute earlier, so a `terminal == len(runs)` test reads `0 == 0` and passes. Guard the exit on the run list being non-empty if it ever was, and poll through a later empty page as a blip rather than reading it as a finished suite. Whatever you write, the confirmation is the same: re-read `gh api 'repos/<owner>/<repo>/actions/runs?head_sha=<full-sha>'` yourself before acting on a terminal claim, exactly as you do for the babysitter's own return.
237
240
 
238
241
  **Verify the Nuitka run yourself, starting with whether the project builds binaries at all:**
239
242
 
@@ -47,7 +47,7 @@ For each project, collect (parallelize with sub-Agents when possible). For each
47
47
  - **Theme assets** (agent § `conf.py` hygiene › Theme assets and OpenGraph). Confirm the sidebar logo is Furo's `light_logo`/`dark_logo` **pair** in `html_theme_options`, each name also listed in `html_static_path`, with `html_logo` **unset** — Furo prefers `html_logo` and skips the pair when it is present, so a lingering `html_logo` is drift to report, never the thing to confirm. Confirm `html_favicon = "assets/favicon.svg"`, and that `ogp_image` is `_static/banner-social-<variant>.png` with that PNG also listed in `html_static_path`, never a bare `assets/...` path (`docs/assets/` is not copied into the built site, so that value 404s for social crawlers). An absolute `raw.githubusercontent.com` URL was the earlier rule: it still resolves, so report it as alignment, not as a bug. Flag projects with `sphinxext.opengraph` enabled but no `ogp_image` set. Suggest the user run `/brand-assets` on flagged projects to regenerate or backfill the asset set in one pass.
48
48
  - **`sphinx_issues` migration** (agent § Migrating off `sphinx_issues`). Grep each project for `{issue}` `/`{pr}` ` / `{user}` `/`{commit}` ` (MyST) and `:issue:` `/`:pr:` ` / `:user:` `/`:commit:` ` (reST) across `*.md`, `*.rst`, `*.py`. Flag every occurrence and offer to apply the migration recipe in one pass per repo. After replacement, drop `"sphinx_issues"` from `extensions` in `conf.py`, `"sphinx-issues>=…"` from `[dependency-groups] docs`, and any `issues_github_path` setting unused by other extensions.
49
49
  - **`pyproject.toml` docs dependency group**. Compare against what `conf.py` actually imports — flag undeclared imports and declared-but-unimported deps. Don't change version pins unless provably stale (a conditional dep on a Python version below the project's floor; a transitively-constrained loose pin held by a meta-extra like `click-extra[sphinx]`).
50
- - **`readme.md`**. Compare badge sets and section structure. Flag a `## Development` section when `claude.md` exists in the same repo (per agent § High-frequency lapses).
50
+ - **`readme.md`**. Compare badge sets and section structure. Flag developer setup held in a `## Development` section or in `claude.md`: it belongs on the `contributing` page (per agent § High-frequency lapses).
51
51
  - **Sphinx tests** (agent § Sphinx tests). Look for `tests/sphinx/`, `tests/test_sphinx_*.py`, or `test_sphinx_crossrefs.py`. Note which projects have render-tests and which don't; suggest adopting cross-reference render tests where the docs surface complex `{role}` cross-refs.
52
52
  - **Static assets and auto-generated files**. Compare `docs/_static/`, `docs/assets/`, `.rst` files, `docs_update.py`. Hunt for stale `.rst` orphans from past package renames.
53
53
 
@@ -14,7 +14,7 @@
14
14
  "name": "repomatic",
15
15
  "source": {
16
16
  "path": ".claude",
17
- "ref": "v7.16.2",
17
+ "ref": "v7.16.3",
18
18
  "source": "git-subdir",
19
19
  "url": "https://github.com/kdeldycke/repomatic"
20
20
  },
@@ -25,7 +25,7 @@
25
25
  "github-actions",
26
26
  "release-automation"
27
27
  ],
28
- "version": "7.16.2"
28
+ "version": "7.16.3"
29
29
  }
30
30
  ]
31
31
  }
@@ -27,14 +27,14 @@ inputs:
27
27
  runs:
28
28
  using: composite
29
29
  steps:
30
- - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
30
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
31
31
  with:
32
32
  enable-cache: false
33
33
  # Downstream callers invoke this action without a checkout (the codegen drops it: see
34
34
  # _render_publish_pypi_job in repomatic/github/workflow_sync.py), so the empty workdir
35
35
  # is by design and setup-uv's warning about it is noise.
36
36
  ignore-empty-workdir: true
37
- version: "0.12.12"
37
+ version: "0.12.17"
38
38
 
39
39
  - name: Download build artifact
40
40
  id: download
@@ -46,7 +46,7 @@ permissions: {}
46
46
  # minimum-release-age`. repomatic's own test suite enforces that upstream; a
47
47
  # synced copy is kept in step by hand. Deliberate bypasses are per-package CLI
48
48
  # flags (`--exclude-newer-package`, `--min-release-age-exclude`).
49
- # See claude.md for the rationale.
49
+ # See https://repomatic.net/workflows#install-time-cooldown for the rationale.
50
50
  env:
51
51
  NPM_CONFIG_MIN_RELEASE_AGE: 7
52
52
  UV_EXCLUDE_NEWER: "1 week"
@@ -66,9 +66,9 @@ jobs:
66
66
  issues: write
67
67
  steps:
68
68
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
69
- - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
69
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
70
70
  with:
71
- version: "0.12.12"
71
+ version: "0.12.17"
72
72
  - name: Extract PR reference
73
73
  id: extract
74
74
  env:
@@ -81,7 +81,7 @@ jobs:
81
81
  env:
82
82
  PR_REF: ${{ steps.extract.outputs.pr_ref }}
83
83
  run: >
84
- uvx --no-progress --exclude-newer-package repomatic=P0D 'repomatic==7.16.2'
84
+ uvx --no-progress --exclude-newer-package repomatic=P0D 'repomatic==7.16.3'
85
85
  pr-body --output-format github-actions
86
86
  --template detect-squash-merge
87
87
  --pr-ref "${PR_REF}"
@@ -124,13 +124,13 @@ jobs:
124
124
  run: git branch --all
125
125
  - name: List all commits
126
126
  run: git log --decorate=full --oneline
127
- - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
127
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
128
128
  with:
129
- version: "0.12.12"
129
+ version: "0.12.17"
130
130
  - name: Run repomatic show-metadata
131
131
  id: metadata
132
132
  run: >
133
- uvx --no-progress --exclude-newer-package repomatic=P0D 'repomatic==7.16.2' show-metadata
133
+ uvx --no-progress --exclude-newer-package repomatic=P0D 'repomatic==7.16.3' show-metadata
134
134
  --format github-json --output "$GITHUB_OUTPUT"
135
135
  new_commits_matrix release_commits_matrix build_targets nuitka_matrix
136
136
  is_python_project cli_scripts package_name current_version released_version
@@ -161,12 +161,12 @@ jobs:
161
161
  ${{ fromJSON(needs.metadata.outputs.metadata).release_commits_matrix
162
162
  && fromJSON(needs.metadata.outputs.metadata).release_commits_matrix.commit[0]
163
163
  || github.sha }}
164
- - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
164
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
165
165
  with:
166
- version: "0.12.12"
166
+ version: "0.12.17"
167
167
  - name: Check dependency sources
168
168
  run: >
169
- uvx --no-progress --exclude-newer-package repomatic=P0D 'repomatic==7.16.2' lint-deps
169
+ uvx --no-progress --exclude-newer-package repomatic=P0D 'repomatic==7.16.3' lint-deps
170
170
  ${{ fromJSON(needs.metadata.outputs.metadata).release_commits_matrix
171
171
  && '--fatal' || '--no-fatal' }}
172
172
 
@@ -193,9 +193,9 @@ jobs:
193
193
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
194
194
  with:
195
195
  ref: ${{ matrix.commit }}
196
- - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
196
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
197
197
  with:
198
- version: "0.12.12"
198
+ version: "0.12.17"
199
199
  # Bakes the tag SHA into the CLI module so a built artifact can report the
200
200
  # commit it came from. Gated on `cli_scripts` because click-extra locates that
201
201
  # module through `[project.scripts]`, and hard-errors with "No __init__.py
@@ -210,7 +210,7 @@ jobs:
210
210
  env:
211
211
  COMMIT: ${{ matrix.commit }}
212
212
  run: >
213
- uvx --no-progress 'click-extra==9.1.0'
213
+ uvx --no-progress 'click-extra==9.3.3'
214
214
  prebake field git_tag_sha "${COMMIT}"
215
215
  - name: Build package
216
216
  run: uv --no-progress build