Repository navigation
v8.0.0
- Breaking: Drop Python 3.10, past its end of life: repomatic needs Python 3.11, and the default test matrix starts at 3.11 on every runner.
- Breaking: Remove the
metadataalias ofshow-metadataand the hiddenworkflow lintcommand, as their deprecation warnings announced.lint-repoandinitflag a workflow step that still callsmetadata. - Breaking: Remove
lint-workflows:lint-reporuns its checks asworkflow-dispatch,thin-caller-pins,thin-caller-triggersandthin-caller-secrets. - Breaking: Remove
git-commit-push, which no bundled workflow calls since7.14.0. - Breaking: Rename
show-metadata --formatto--output-format, like every other command. A workflow step passing--formatneeds the new name. - Breaking:
changelognow writes in place atchangelog.location, and its--sourceoption becomes--changelog. Pass-to print instead. - Breaking: Remove
sync-binaries --backfill-records, theshow-metadata --forceand--replacealiases, and theGHA_PR_*environment variables. - Breaking:
pr-bodyandpr-syncread the diff table and the upgrade report only fromREPOMATIC_DIFF_TABLE_FILEandREPOMATIC_UPGRADE_REPORT_FILE. - Breaking: Remove the
[tool.repomatic.flavor]table and themetrics.skipandcache.github-release-ttlkeys. A config that sets them gets an unknown-key warning. - Breaking: Remove the
new_commits,release_commits,release_notes,release_notes_with_admonition,minor_bump_allowed,major_bump_allowed,skip_binary_buildandnuitka_extraskeys ofshow-metadata, which no workflow reads. - Breaking: Replace the
unsubscribe-phase1andunsubscribe-phase2templates with oneunsubscribe-reporttemplate. - Breaking:
lint-repodrops thepat-stale-statuses-permissioncheck, so it no longer posts a commit status on each run. - Breaking:
initno longer deletes the files of assets removed before7.0.0. A repository upgrading from6.xdeletes them by hand. - Breaking:
scan-virustotalandsync-binariesrefuse a scan history kept only in the pre-7.13.0JSON file, and no longer migrate old binaries page markers. - Breaking:
cloudflare-r2 --offloadwrites its report through the new--outputoption instead of$GITHUB_STEP_SUMMARY, and needs a project name like the other modes. - Breaking: Remove the
close-stale-bump-prcommand and thepr-body --pr-refoption.bump-versionandsquashed-releasedo their work. - Breaking:
broken-linksnow runs lychee itself and drops--lychee-exit-codeand--body-file. Pass--no-lycheeto skip the crawl. - Breaking:
show-metadatareplacessite_cloudflare_projectwithcloudflare_project, which falls back to the repository name. - Breaking: The
github-jsonformat ofshow-metadatanow writes a list of objects, likebuild_targets, as a JSON array. Drop thefromJSONthat decoded it. - Breaking: The
_release-engine.yamlreusable workflow takes the metadata of the build lane as a requiredmetadatainput, and loses its🧬 Project metadatajob. - Breaking:
labels.yamlmerges itssponsor-labeljob intoapply-labels. A required check that names the old job needs the new name. - Breaking: Rename the
detect-squash-mergejob of_release-build.yamltosquashed-release, and title its issue🚨 Squashed release. - Breaking:
repomatic run pyproject-fmtnow exits 0 after a rewrite it verified, instead of 1. - Breaking: The bundled
zizmor.yamlnow requires hash pins for third-party actions. - Breaking: The bundled
labels.tomlno longer renames the🎁 feature requestlabel, andlychee.tomlno longer skips star-history.com links. - Breaking: The bundled
uv.tomlfloors uv at0.12.22, the first release writing the committeduv.lockformat. Move asetup-uvpin below it before syncing. - Drop the
boltonsdependency: the test matrix model,sync-mailmapand the Cloudflare Pages drift check use the standard library instead. - Drop the
arrowdependency: relative times likein 4 daysand theunsubscribemonth cutoff are computed in-house, with the same wording. - Drop the
pyelftoolsdependency:verify-binaryreads ELF headers with its own parser, as it already did for Mach-O and PE. - Drop the
vt-pydependency and theaiohttpstack beneath it:scan-virustotalcalls the VirusTotal REST API through the standard library. - Enable the
D205,D209,E501,PLC0415,RUF100,RUF102,RUF103,RUF104andTCruff rules in the bundledruff.toml. - The bundled
pytest.tomlschedules with--dist=loadgroup, so anxdist_groupmarker keeps its tests on one worker, and setsstrict_configandstrict_markers. - The bundled
pytest.tomlruns one xdist worker per logical CPU with--numprocesses=logical:autocounted physical cores and halved the workers on the x86 runners. - Add
prune-caches, which deletes the GitHub Actions caches a newer save superseded. Thecompile-binaries,sync-depsandsync-tool-versionsjobs run it after their restore, and gain theactions: writescope. - Add the
tool_versionskey toshow-metadata, the pinned version of everyrepomatic runtool. Each tool cache is now keyed on it, so a cache rotates with the pin instead of with every registry edit. - Raise the
click-extrafloor to9.5, which keeps the lazy command modules unloaded when a configuration file is read, andpy-walkto0.3.3. - Raise the test and docs dependency floors to the releases the suite and the Sphinx build rely on, pytest
9.0.3among them for CVE-2025-71176. repomatic run nuitkaspells the macOS ccache opt-out--disable-cache=ccache, the documented form of the hidden--disable-ccachealias.repomatic run gitleaksprints each finding with its file, line, commit and rule, and redacts the secret, so a redlint-secretsrun names what it found.repomatic run typosnow installs on Windows ARM64, andrepomatic run lycheeon x86_64 macOS.repomatic run --verifyprints the unified diff of each file it would rewrite, below itsWould rewrite:line.- An npm tool install now ends with
npm audit signatures, which verifies the registry signature and the provenance of every installed package. repomatic runmanageswrangler, and thedeploy-docs-cloudflarejob deploys through it instead of annpxcall.update-checksumsandsync-tool-versionsverify the upstream attestation of each actionlint, Biome, gh, shfmt and typos download before recording its checksum.sync-uv-lockandsync-tool-versionshold back a PyPI release that lost the PEP 740 provenance its predecessor had, and show each release's trusted publisher.- The updates table of a dependency PR moves its
Provenancecolumn next toChange, ahead ofReleased. - The documentation's copy button skips the prompt and output lines of a shell session, and its sitemap drops the search and index pages.
- Set
wrap = "no"in the bundledmdformat.toml, soformat-markdownjoins the lines of a hard-wrapped paragraph. - The bundled
zizmor.yamlignores theunpinned-imagesaudit of_release-engine.yaml, whosecontainer:value the build matrix supplies. lint-changelogwarns on an entry filed out of the Breaking, then Deprecated, then ordinary order and on a#Nnaming no issue, and--fixstrips avtag prefix off a heading.- The
prepare-releasejob waits until the unreleased changelog section holds an entry, read from the newchangelog_has_entriesmetadata key. - Add
ci-status --wait, which polls in-process until a required job fails or every run settled, with--until-changeand--state-filefor a re-armed watch. - Add
ci-status --failed-logs,--automation-prsand--release-pr, and report a matrix job GitHub never expanded. - Add a
lint-pythonjob tolint.yaml, which fails on the ruff findings no safe fix clears, whereformat-pythononly annotates them. - Add
lint-coverage, which flags a[tool.coverage] report.fail_underfloor more than two points under the coverage total. Thetestsjob oftests.yamlruns it after the unit tests. repomaticnow imports only the module of the command it runs:repomatic --versionstarts in 0.3 s instead of 0.45 s.- Add the
sync-runner-images.syncandgithub-releases.synckeys to turn off these two syncs. - Add the
bump-version,create-release,pack-manpages,squashed-releaseandwait-pypicommands, which replace the shell steps of the release workflows. - Add
prepare-release --commitand--output,--upload-toonpack-attestationandpack-binaries, andpack-attestation --require-declaredand--verify. - Add
sync-deps --pr-sync, which syncs each updater from a clean tree, opens or refreshes its own pull request, and refuses uncommitted changes. - Add the
show-metadatakeysis_awesome,builds_sphinx,main_cli_script,import_name,latest_stable_python,is_release_pushandrelease_commit. nuitka_matrixis now empty when the binary build is skipped, and each entry gains anuitka_cacheflag.manpages_asset_namenow gives its<package>-manpagesdefault instead of an empty value.- The help screen gains "Site & docs" and "Tools" sections, and lists every
sync-*command under "Sync". - Every
--outputoption now accepts-o, and-for stdout. apply-labels,lock-threads,sync-labels,sponsor-labelandsync-binariesfall back to the repository of the git remote when--repois missing.- Library helpers now read the configuration the CLI resolved, so
--configreaches the tool cooldown, the cache settings and theinitpins. lint-repoandsetup-guidenow read the repository once and probe each setup step once, which saves API calls on every run.lint-reponow warns when arepomatic runtool pin is still inside the cooldown, and names theexclude-newer-packageentry that admits it.lint-reponow warns when a MyST Sphinx build does not fail onmyst.xref_missing, the dead fragment linkslint-anchorscaught until7.18.0.lint-repono longer warns that aREPOMATIC_PATlimited to its own repository likely has access to all repositories.lint-repono longer warns about a runner image outside the test matrix axes when[tool.repomatic.sync-runner-images] ignorenames it.immutable-releasesnow applies to every repository with a changelog, not only to Python packages.description-matchesandwebsite-for-sphinxskip when no repository is named, instead of failing.ci-statusand the workflow checks oflint-reponow read.ymlworkflow files too.- The setup guide issue now stays open while
REPOMATIC_PATalso has access to another repository of its owner, and the token step names it. run --listand the tool reference now find the bump-my-version configuration in[tool.bumpversion].sync-tool-versionsnow downloads only the artifacts of the tools it bumps, and fetches release data in parallel, likesync-action-pins.sync-workflow-pinsnow realigns the inlinerepomaticpin in every shapelint-repochecks, extras included.- Add the
workflow-pins.ignorekey:sync-workflow-pinsleaves the pins of each package it lists as written. sync-workflow-pinsnow bumps the tag of agh release download vX.Y.Z --repo owner/repocommand, and--release-notescollects that release's notes.- Generated tool configs are cached under a content digest, so two checkouts no longer overwrite each other's config.
- A bare
repomatic run gitleaksnow scans the git history, and a barerepomatic run lycheechecks the documentation files. - Add
repomatic run shellcheckandrepomatic run npm.repomatic run actionlintputs shellcheck onPATHand annotates its findings in CI. repomatic run nuitkanow installsnuitka.extras, prepares the compile cache, and adds the macOS deployment flags.- npm tools now always install through the pinned npm, so the cooldown holds whatever npm the runner provides.
update-docsnow reformats thepyproject.tomlfiles it changes.cancel-runsnow spares the runs of a release push.- Tool downloads stop at once on an HTTP 4xx and send the
repomatic/{version}User-Agent. An install failure prints an error, not a traceback. audit --fixlinks each version change to its GitHub comparison.- Dependency pull requests fetch release notes with one listing per repository, show GitHub-only releases, and leave out pre-releases inside the range.
lint-depspolicy warnings name locations as TOML paths, likeproject.dependencies.- The output of uv no longer interleaves with the progress display of
sync-deps,audit --fixandupdate-dep-graph. initreports a mergedpyproject.tomlonce under "Updated", and a new changelog starts with a section thatlint-changelogcan parse.include = ["awesome-template"]now writes the template in any repository, like otherincludeentries.- The
githubformat ofshow-metadatatrims a value over the step-output limit with a warning, instead of failing the step. - Outside CI, the repository slug now comes from the
originremote beforegh. sync-labelspicks the awesome-list label profile from--repoinstead of the checkout.sample-metricsrefuses a metrics store holding an unknown source.- The
metrics.yamlschedule moves from weekly to quarterly, which thin callers mirror at their next sync. - The
unsubscribe-threadsreport warns when its first phase cannot fetch notifications, and shows dates beside relative times. - The
fix-typospull request title and commit message now read "Fix typos". - Release lookups leave out draft releases, and
sync-github-releases --livereads fresh release bodies and continues past a failed edit. sync-dev-releasefails instead of creating a duplicate draft when it cannot edit the listed draft.scan-virustotalcounts two API calls per upload and shares one rate budget with polling.- The
scan-virustotaljob now times out after 30 minutes instead of 15, and passes with its steps skipped when no API key is set. - The squashed release issue now carries the
🤖 cilabel, updates on a re-run instead of opening a duplicate, and reopens when a squash merge recurs. - Freeze and post-release commits are now authored by
github-actions[bot]instead of the actor who triggered the run. - The generated autofix caller now grants
security-events: read, sofix-vulnerable-depsreads Dependabot alerts with the workflow token. - The release workflows now pin
pypi-attestations, and call the pinnedghof the tool registry instead of the runner's. git-tagerrors now include the output of git.lint-changelogtolerates release versions that are not PEP 440.- Binary builds now count the
workflow.source-pathsdirectories, so a source-only push to a src-layout project builds its binaries. - The bundled
tests.yamldrops its step that forced a native Python on Windows ARM64, since uv0.13.0picks it unaided. A downstream copy can drop the same step. - The Windows binaries now build on uv's managed Python, like the binaries of the other platforms.
- The test matrix now runs Python
3.15as the stable release and3.16as the development one, and smoke-tests the free-threaded3.15t. - The managed
setup-uvpin moves to0.13.4, the first uv release that ships the Python3.16alpha, so the development cell installs its interpreter again. - Bump Nuitka from
4.3to4.3.1, which stops a new kind of local variable from recompiling every C file of the binary. - The bundled
benchmark-updateskill now grades each cell ✅, 🟡 or ❌, links it to its evidence, and audits blank cells against quoted sources. - The bundled
repomatic-auditskill now reads the CI state of the default branch, and checks that[tool.gitleaks]keeps the built-in rules. - The bundled
repomatic-depsskill now flags, in itsexploremode, thin dependencies that in-house code could replace. - The bundled
repomatic-upgradeskill now runs the newly pinnedmypyandruffon the untouched tree, since the changelog often leaves a tool bump out. - The bundled
repomatic-upgradeskill now tells a local edit that upstream already holds from one the upgrade drops, with a three-way merge. - The bundled
repomatic-upgradeskill now reads the binary self-test ofBuild & releasewhen an upgrade changes how binaries build. - The bundled
repomatic-upgradeskill now runsrepomatic run actionlintafter a row that touches a workflow. - The bundled skills and the
sphinx-docsagent read the cooldown window from the repository's workflows instead of assuming1 week. - The bundled
repomatic-test-matrixskill now replays alowest-directcell, judges each run by its exit code, and needs--frozenon every lateruv run. The skill and the test matrix guide now say thatfull-includedrops thepython-versionaxis. - The bundled
repomatic-shipskill now watches CI itself after a cycle under 10 minutes, and spawns the babysitter only on a red required job. - The bundled
repomatic-shipskill now reads a--versionbanner captured from a checkout as the dev version, not as a sample lagging the released tag. - Fix the YAML and workflow lint jobs running on every push:
yaml_changed,workflows_changedandzsh_changednow read the commit range, shallow clones included. - Fix a later push cancelling the tests of a release push: they now run in a concurrency group of their own.
- Fix a failed lychee run, or a run where no link checker ran, closing the "Broken links" issue.
- Fix
auditrunninguv auditwhen the configured sources leave it out. - Fix
repomatic run mypyon projects whose Python floor is3.8or3.9. - Fix
exclude-newer = "0 days"and afalseentry inexclude-newer-package, whichsync-uv-lockcould not read. - Fix the generated
release.yamlandtests.yamlheader exporting the default cooldown instead of the repository'sminimum-release-age. - Fix
init --upstream-repoexemptingrepomaticfrom the cooldown instead of the package of the named repository. - Fix
lint-deps --pyprojectreading thepyproject.tomlnext to the file it names. - Fix
show-metadataandupdate-docscrashing on aconf.pywith a tuple or subscript assignment. - Fix
current_version, which reported the oldest commit of a multi-commit push instead of the newest. - Fix the draft GitHub release of a first release, which lacked the "first version" wording of its changelog entry.
- Fix the malformed table of the
release-sync-reporttemplate, and the doubled footer ofsync-runner-imagespull requests. - Fix
cloudflare-pagesandcloudflare-r2printing a traceback on a timeout or a dropped connection. - Fix GraphQL queries for a repository named like a number or a boolean, such as
2048. - Fix
initreporting four phantom updates in awesome-list repositories, and missing the#readmelink of their template. - Fix
init --output-dirbuildingpaths:filters from the working directory instead of the target project. - Fix
cancel-runsmatching the wrong runs for a branch name holding+,&or#. - Fix the thin-caller secrets check reading the first job with secrets instead of the job that calls the reusable workflow.
- Fix the binaries leaving out the
prepare-releaseandrelease-sync-reporttemplates. - Fix the Linux binaries baking no git field: the build job now trusts the checkout inside the manylinux container.
- Fix the binary of a CLI that starts worker processes, which ran the whole CLI again in each worker since
7.18.0. - Fix the file lists of
repomaticcommands including the files that.git/info/excludeignores, like an agent worktree under.claude/worktrees/. - Fix stale claims of the bundled
babysit-ci,repomatic-shipandrepomatic-test-matrixskills on release runs, binary skips andformat-pythonpull requests. - Fix the bundled
repomatic-shipskill testing with repomatic's own dependency groups, including atypinggroup that downstream repositories may not define. - Fix a dependency pull request picking up the staged changes of an updater whose commit failed.
- Fix the
sync-gitignorehelp naminggitignore-extra-contentandgitignore-locationinstead of thegitignore.extra-contentandgitignore.locationkeys. - Fix
lint-repo'spypi-trusted-publishercheck showing the raw[project] name, not the normalized one PyPI uses, in its messages and settings link. - Fix
audit,lint-changelog,pack-plugin,prepare-release,sync-gitignore,sync-uv-lock,update-dep-graphandverify-binaryprinting a traceback on a missing file, a failed fetch or a faileduvcall. - Fix a command printing a traceback when
uvoruvxis missing fromPATH. - Fix
lint-depspassing in a directory with nopyproject.toml, which it read as a project with no dependency. - Fix
show-metadatacrashing onnuitka_matrixfor a project with a CLI but no bump-my-version configuration. - Fix the help of
sync-workflow-pins, which named two of the five pin shapes it rewrites, and theunsubscribe-threadsexamples, which lacked--live. - Fix the note
initprints for a removed codecov file, which named--cov-fail-underinstead of[tool.coverage] report.fail_under. - Fix
initdropping the downstream jobs of a thin caller that indents its jobs by four spaces. - Fix the commands that read GitHub releases crashing on a corrupt release cache holding a JSON list.
- Fix
sync-depsreporting all dependencies up to date when an updater failed to resolve. - Fix
show-metadata --no-overwriteannouncing that it overwrites the target file it then keeps.
Full changelog: v7.18.0...v8.0.0