v7.7.0
Warning
7.7.0 ships no standalone executables: the job attaching them failed, and a published release can no longer receive assets. Every other distribution is unaffected, so install from PyPI as usual, or wait for the next release for a binary.
- Breaking: drop the
WorkflowFormatenum and thegenerate_workflowsfunction, orphaned since theworkflow createandworkflow syncCLI commands were removed.repomatic initis now the only way to write a workflow file. - Breaking: drop the
check-versioncommand: nothing invoked it, and workflows read theminor_bump_allowedandmajor_bump_allowedmetadata keys instead. - Breaking: drop the
clean-unmodified-configscommand, superseded byrepomatic init --delete-unmodified. - Breaking: replace the
ItemActionandSyncActionreport enums with a singlegithub.actions.ReportAction; read its.valueinstead of the removed.label. - Breaking:
repomatic metadatano longer emits thetoml_files,changelog_bullet_word_threshold,nuitka_enabledandnuitka_nofollow_importskeys. No workflow consumed them; the three config fields are read directly by their subcommands. - New
github-housekeepingskill backfills and curates labels and milestones across a repository's full issue and PR history: taxonomy design, cache-backed bulk classification with review gates, AI-slop detection from closed-without-comment signals, and milestone assignment by changelog, git-tag, and release-date archaeology. - New
pack-binariescommand materializes the versionless binary aliases and prints the release upload list, replacing the release engine's shell loop: the asset naming convention now has one Python definition, shared with the install-guide freeze. - New
--default-branchoption on thechangelogcommand, so a repository whose default branch is notmaingets a comparison URL that round-trips through the release freeze. initno longer writes the release lane (changelog.md,changelog.yaml,release.yaml, the PyPI publish action) into a uv virtual project ([tool.uv] package = false). Dependency locking, coverage and test tooling still apply.initnow lists eachawesome-templatefile it writes instead of one summary line, andinit labelsno longer reports its regenerated files as unmodified configs to clean up.- Rename the Claude Code plugin release asset to
repomatic-claude-plugin.zip, asrepomatic-plugin.zipread as a plugin for repomatic./plugin installis unaffected. - Attestation bundles are now named after the asset they cover (
repomatic-manpages.attestation.json) rather than the job that produced them, so the eight binary bundles no longer overwrite each other down to a single file. - The VirusTotal detections chart now pins its CDN script with a Subresource Integrity digest, so a tampered copy is refused by the browser.
sync-workflow-pinsnow splices the--exclude-newer-packagecooldown exemption beside the inlinerepomatic==X.Y.Zpin it realigns, in the single spelling the release freeze writes and the post-release unfreeze recognizes.- The changelog's
[!CAUTION]admonition for a yanked release now quotes the reason PyPI recorded for the yank, when there is one. - Changelog links are discovered under any capitalization of the PyPI
project_urlskey, matching how source URLs were already resolved. - PyPI release lookups order same-day publications by PEP 440, so
1.10.0is no longer ranked below1.9.0. - Dependency-update PR bodies omit the version comparison link when the upstream repository publishes no matching tags, instead of linking to a 404.
format-imagesnow installs and verifies itsoxipngbinary once per run instead of once per optimized image.- Registry binary downloads and
update-checksumsnow carry a stall timeout, andupdate-checksumsrejects truncated bodies instead of recording their digest as the new canonical checksum. - GitHub token validation now times out instead of hanging forever when the API is unreachable.
- The
zsh_filesmetadata key now lists only shell scripts whose shebang names zsh, so a bash.shfile is no longer linted as Zsh. repomatic metadatano longer aborts on a src-layout project: a Nuitka entry point with no module file at the repository root is skipped with a warning.lint-reponow reports an unreadable rulesets API as a skipped branch-protection check rather than a failed one.- The broken-links issue no longer claims broken links when lychee itself failed to run.
- The release freeze now warns when it finds no changelog section for the version being released, instead of silently doing nothing.
lint-changelog --fixnow exits non-zero when it could not repair every problem it reported, instead of reporting success as soon as any one fix landed.lint-changelog --fixno longer stamps an undatable orphaned version with a0000-00-00placeholder date, and files a datable one in order even when every existing heading is a.devNdevelopment section.sync-uv-lockparsesuv.lockonce per phase instead of once per lookup, cutting several hundred milliseconds off each run.- Fix downstream tool caches frozen at their first write: the reusable workflows' cache keys hashed a file that only exists upstream. Keys now rotate with the reusable workflow's own commit SHA.
- Fix
initmisreading a thin caller's trailing comment or odd-indented job line as extra downstream jobs, which silently flipped the file onto the explicit-permissions contract or duplicated the managed job's tail below the regenerated lanes. - Fix
initmishandling a consumer's extra release jobs: the extraneeds:edges declared on thereleaselane were dropped, and a blank line accumulated above the jobs on every sync. - Fix
init --output-dirscanning the current directory for unmodified configs, which made--delete-unmodifiedact on the wrong tree. - Fix the generated
release.yamlemitting a bareneeds:(which GitHub rejects at startup) when every canonical edge is filtered out. - Fix a
[tool.repomatic.workflow] pathsoverride emitting entries like**/*.pyunquoted when the canonical block held no quoted entry to copy, which parsed as a YAML alias and left the workflow silently ignored. - Fix
repomatic metadatacrashing on a repository carrying a tag the version parser refuses, likev1.2.3_hotfix. - Fix
sync-action-pinsandsync-workflow-pinssilently reverting each other's edits when onesync-depsrun bumps both kinds of pin in the same workflow file. - Fix a mid-resolve failure of
sync-uv-lockleaving synced policy pins beside a stale lockfile for the CI job to commit: the project is now restored to its pre-run state on any error. - Fix
sync-mailmapcrashing withUnboundLocalErroron a repository that has no.mailmapyet, the exact bootstrap its default--create-if-missingadvertises. - Fix the sponsor labeller treating an empty
pull_requestevent payload as a pull request. - Fix issue-filing jobs failing to record a new issue when
ghprints a notice above the issue URL. - Fix
update-dep-graphfailing on Windows when a dependency's SBOM metadata contains non-ASCII characters. - Fix
cache cleanscoping:--namespaceno longer wipes binaries and tool configs,--toolno longer wipes HTTP responses, and--max-agenow applies to cached configs instead of deleting them all. - Fix
repomatic run mypyaborting withUnable to find lockfilein a repository without auv.lock: the tool now runs in an isolated, cooldown-gated environment when there is no lockfile to freeze. - Fix binary tools executing a just-deleted staging copy when the cache write is lost (Docker overlay runners) or the cache root is unwritable: the fallback copy now survives for the whole process.
- Fix the published plugin manifest declaring the post-release
.devNversion rather than the release it ships with. - Fix image optimization leaving a
.bakfile in the working tree when interrupted. - The test suite now derives its file inventories from
git ls-filesinstead of four hundred hand-typed lines, so adding a tracked file no longer needs a fixture edit.
Full changelog: v7.6.0...v7.7.0