Releases: kdeldycke/repomatic
Releases · kdeldycke/repomatic
v6.14.0
Immutable
release. Only release title and notes can be modified.
- Add Sphinx documentation site with Furo theme and MyST-Parser. Splits the monolithic
readme.md(1139 lines) into focused pages: installation, configuration reference (auto-generated fromConfigdataclass docstrings), CLI parameters (auto-generated viaclick_extra.sphinx), reusable workflow reference, security practices, Claude Code skills, and a tool runner tutorial covering the 4-level config precedence chain, available tools,[tool.X]bridge, binary caching, and version overrides. Deployed to GitHub Pages via the existingdocs.yamlworkflow. - Add
repomatic.myst_docstringsSphinx extension andrepomatic.myst_converterutility module. The extension hooks intoautodoc-process-docstringto convert MyST markdown in Python docstrings to reST at Sphinx build time, sosphinx.ext.autodocworks without modification. Supports colon-fenced and backtick-fenced directives (:::{note}and```{note}), cross-references with hyphenated names (like{eval-rst},{code-block}), markdown links, and inline code. The converter is a standalone migration utility that rewrites Python source files from reST to MyST in place. Both are idempotent. - Add
--sort-byoption toshow-config,metadata --list-keys,run --list, andcache showcommands via click-extra7.11.0'sSortByOption. Each command defaults to a natural sort column and accepts any column name. - Add incremental mode to the
brand-assetsskill. When base SVGs already exist, skip the design exploration menu and proceed directly: scan existing assets, identify gaps against the four expected variants, create missing SVGs and PNGs, and wire new assets intodocs/conf.py. - Add
check_stale_gh_pages_branchlint check and setup guide instructions for deleting leftovergh-pagesbranches after switching to GitHub Actions deployment. - Fix
Matrix.prune()keeping exclude directives that reference keys absent from the matrix axes. GitHub Actions rejects these with "Matrix exclude key does not match any key within the matrix". Affects downstream projects whose[tool.repomatic.test-matrix]config definesvariationsandexcludeentries referencing those axes: the PR matrix (which omits variations) retained the stale excludes. - Fix setup guide Pages step: treat
None(unconfigured) as incomplete for Sphinx projects so the issue reopens with the Pages setup step, and add bothPOST(first-time enable) andPUT(update existing) commands to the template. Previously,check_pages_deployment_sourcereturningNonewas treated as passing, and the template assumed Pages was already enabled. - Fix
sponsor-labelworkflow job missingactions/checkoutstep inlabels.yaml, causing the job to fail.
Full changelog: v6.13.0...v6.14.0
🛡️ VirusTotal scans
| Binary | Detections | Analysis |
|---|---|---|
repomatic-6.14.0-linux-arm64.bin |
0 / 64 | View scan |
repomatic-6.14.0-linux-x64.bin |
0 / 65 | View scan |
repomatic-6.14.0-macos-arm64.bin |
4 / 63 | View scan |
repomatic-6.14.0-macos-x64.bin |
2 / 64 | View scan |
repomatic-6.14.0-windows-arm64.exe |
2 / 67 | View scan |
repomatic-6.14.0-windows-x64.exe |
24 / 71 | View scan |
v6.13.0
Immutable
release. Only release title and notes can be modified.
- Add
nuitka.entry-pointsconfig option to select which[project.scripts]entries produce Nuitka binaries. When unset, deduplicates by callable target: keeps the first entry point for each uniquemodule:callablepair, so alias entry points (like bothmpmandmeta-package-managerpointing to the same function) don't produce duplicate binaries. - Add two-phase VirusTotal scanning: phase 1 uploads binaries and writes an initial table with scan links (binary names link to their GitHub release download URLs), phase 2 (
--poll) polls for analysis completion and replaces the table with a Detections column showingflagged / totalengine counts. The workflow uses two sequential steps so users see scan links immediately while detection stats populate asynchronously. - Add
av-false-positiveskill to scan release binaries on VirusTotal and generate per-vendor false-positive submission files for flagged artifacts. Derives project metadata (name, license, maintainer, URLs) frompyproject.tomland git config instead of hardcoding. - Add
update-checksums.yamlworkflow that triggers on Renovate pushes torenovate/**branches modifyingrepomatic/tool_runner.py. Downloads each binary tool at its new version, computes the SHA-256, and commits corrected checksums to the PR branch. Works around renovatebot/renovate#42263 wherepostUpgradeTaskssilently drops changes to the same file the regex manager updated. - Include release notes for all intermediate versions in
sync-uv-lockPR bodies. When a package jumps from11.0.3to11.0.5, both11.0.4and11.0.5release notes are shown. - Config
includeentries now bypassRepoScopefiltering, matching the behavior of explicit CLI component naming.include = ["skills"]in a non-awesome repository produces all skills including awesome-only ones; qualified entries likeinclude = ["skills/awesome-triage"]implicitly select the parent component. Scope-bypassed components fall through to config-key and file-level checks instead of being unconditionally skipped. - Add baseline criteria for GitHub repositories in awesome list contributing guidelines: minimum 50 stars, not archived, and updated within 3 years. Includes exceptions for static resources and high-adoption archived repos.
- Add
--min-savings-bytesoption toformat-images(default 1024 bytes). Skips optimized files where the absolute byte savings are negligible, preventing noisy diffs for tiny images where even a high percentage represents minimal actual reduction. - Add cross-platform binary support for all tools in the registry. actionlint, biome, gitleaks, labelmaker, lychee, shfmt, and typos now ship binaries for macOS (arm64, x64), Linux (arm64, x64), and Windows (x64) where upstream releases are available. Add ZIP archive extraction and per-platform archive format overrides to
BinarySpec. Replace hand-rolled OS/arch detection in_get_platform_key()with extra-platforms'current_platform()andcurrent_architecture(), and replace string platform keys withPlatformKeytuples ((Platform | Group, Architecture)) for richer detection heuristics. - Add a progress bar during binary tool downloads when the server provides a
Content-Lengthheader. Displays on interactive terminals only; silent in CI. - Add two-layer integrity model for cached binaries. The archive checksum from the registry is verified at download time. After extraction, a
.sha256sidecar file is written next to the binary and checked on every subsequent cache hit, defending against local cache tampering between runs. - Enable
[tool.actionlint]bridge support. actionlint config frompyproject.tomlis now translated to YAML and written to.github/actionlint.yamlat invocation time (CWD-discovery, cleaned up after the run). - Cache downloaded tool binaries across CI runs with
actions/cache. Each workflow job that invokes a binary tool (actionlint, biome, gitleaks, labelmaker, lychee, shfmt, typos) restores from a per-tool cache key scoped to OS, architecture, and tool registry hash. - Replace
peaceiris/actions-gh-pageswith GitHub's nativeactions/upload-pages-artifact+actions/deploy-pagesfor Sphinx documentation deployment. Add alint-repocheck and setup guide step that verify the repository's Pages source is set to "GitHub Actions" instead of branch-based deployment. - Add
benchmark-updateskill to create and maintain competitive benchmark pages (docs/benchmark.md) comparing projects against alternatives. Supportsaudit,init,add, andrefresh-badgesmodes. - Add
upstream-auditskill to create and maintain upstream contribution tracking pages (docs/upstream.md). Discovers merged PRs, reported issues, workarounds, and declined features across dependencies. Supportsaudit,init,refresh, andsync-gitmodes. - Restructure
Configto use nested dataclasses (CacheConfig,DependencyGraphConfig,DocsConfig,GitignoreConfig,LabelsConfig,TestPlanConfig,WorkflowConfig) withclick_extra.config_pathmetadata. Config fields are now accessed asconfig.cache.dirinstead ofconfig.cache_dir. The[tool.repomatic]TOML key structure is unchanged. Eliminates the_NESTED_PREFIXESmapping in favor of click-extra's schema-aware dataclass instantiation. - Upgrade macOS Intel runner from
macos-15-inteltomacos-26-intelacross binary builds, test matrix, and Nuitka compilation. - Run
lint-repoworkflow job on all repositories, not just Python projects. Generic checks (funding file, stale draft releases, tag protection rules, fork PR approval policy, workflow permissions, PAT checks) were being skipped on non-Python repos like awesome lists. - Centralize GitHub token resolution in
run_gh_command: priority isREPOMATIC_PAT>GH_TOKEN>GITHUB_TOKEN, with automatic fallback toGITHUB_TOKENon 401 Bad Credentials (expired or revoked PAT). The--has-patflag onsetup-guideandlint-repoauto-detects from theREPOMATIC_PATenvironment variable when not specified, replacing theHAS_REPOMATIC_PATenv var. Normalize all workflow token references toGH_TOKENwithgithub.tokenas the default, and fix missingGH_TOKENinsync-dev-release,sponsor-label,setup-guide,lint-repo,check-renovate, andscan-virustotalworkflow steps. - Fix
exclude-newer-packagehandling inpyproject.toml: remove orphaned comments when the section is fully pruned, and fix inline table rendering to producepyproject-fmt-compatible formatting (tomlkit'sInlineTable.append()left malformed whitespace: doubled spaces after commas, missing inner-brace spaces). - Add pre-flight
shutil.whichcheck inrun_exiftoolfor a clear error when exiftool is not installed, instead of a bareFileNotFoundError. Verify exiftool is on PATH afterchoco installin the Windows binary build step, catching silent Chocolatey CDN failures. - Create parent directories for
--outputfile paths inrepomatic run, fixing lycheeCannot write status output to fileerrors when the output directory doesn't exist. - Sanitize
@mentions,#issuereferences, andgithub.comURLs in Lychee and Sphinx linkcheck output before embedding in the broken links GitHub issue body. Reuses the same zero-width space sanitization already applied to upstream release notes insync-uv-lockPR bodies.
Full changelog: v6.12.0...v6.13.0
🛡️ VirusTotal scans
| Binary | Detections | Analysis |
|---|---|---|
repomatic-6.13.0-linux-arm64.bin |
0 / 54 | View scan |
repomatic-6.13.0-linux-x64.bin |
0 / 65 | View scan |
repomatic-6.13.0-macos-arm64.bin |
3 / 63 | View scan |
repomatic-6.13.0-macos-x64.bin |
1 / 62 | View scan |
repomatic-6.13.0-windows-arm64.exe |
2 / 65 | View scan |
repomatic-6.13.0-windows-x64.exe |
20 / 70 | View scan |
v6.12.0
Immutable
release. Only release title and notes can be modified.
- Add
repomatic cachesubcommands (show,clean,path) and a global binary cache for downloaded tool executables under~/Library/Caches/repomaticon macOS and~/.cache/repomaticon Linux. Cached binaries are re-verified against their registry SHA-256 checksum on every use; stale entries are auto-purged after 30 days (configurable viaREPOMATIC_CACHE_MAX_AGE). Add--no-cachetorepomatic runto bypass the cache. - Add HTTP response cache for PyPI metadata (24h TTL) and GitHub release bodies (24h for all-releases, 7d for single-release) to avoid redundant API calls across
changelog,sync-uv-lock, andsync-github-releasesinvocations. Add--namespacetorepomatic cache cleanfor targeted cleanup. - Route generated tool configs through the cache directory (
~/.cache/repomatic/config/{tool}/{filename}) instead of/tmpor the repository root. Tools with a--configflag now receive an explicit--config <cache_path>argument, making repomatic's involvement visible in logs and eliminating cleanup issues from interrupted runs..editorconfigserialization for CWD-discovery tools likeshfmtnow translates[tool.X]sections frompyproject.tomland writes the result to the cache. Tools without a--configflag (mdformat, shfmt) remain CWD-discovery exceptions. - Add
--version,--checksum, and--skip-checksumoptions torepomatic runto override the pinned tool version and SHA-256 verification at invocation time. - Add structured logging to
repomatic run.--verbosity INFOreports the config precedence level, full command line, and exit code.--verbosity DEBUGadds the parsed[tool.X]content and translated config file details. - Add
skills.locationconfig option to override the Claude Code skills directory. Defaults to./.claude/skills/; useful for repos where.claude/is not at the root. - Add
changelog.locationconfig option to override the changelog file path. Defaults to./changelog.md. All CLI commands (changelog,release-prep,sync-github-releases,sync-dev-release), metadata extraction, andinitnow read from this single source. - Add
.claude/package-skills.shto package each Claude Code skill as a ZIP for manual upload to Claude Desktop via Settings > Customize > Skills. Refs #2540. - Sanitize
@mentions,#issuereferences, andgithub.comURLs in upstream release notes embedded insync-uv-lockPR bodies. Inserts Unicode zero-width spaces to prevent GitHub from auto-linking mentions and issue references. Rewritesgithub.comURLs toredirect.github.comto prevent backlink cross-references. Code fences and inline code spans are preserved. Closes #2542. - Use
REPOMATIC_PATtoken in allpeter-evans/create-pull-requeststeps acrossautofix.yaml,changelog.yaml, andrenovate.yaml. PRs created with the defaultGITHUB_TOKENdo not trigger other workflows. - Rename
shell_filesmetadata key toshfmt_files. Exclude Zsh files (.zsh,.zshrc, etc.) and.shfiles with a Zsh shebang fromshfmtprocessing.shfmt's Zsh support is experimental (v3.13.0+) and fails on common Zsh constructs (see mvdan/sh#1203). - Make the
uv syncstep in thelint-typesjob conditional onis_python_project, so repositories with Python files but no lockfile can still be type-checked. - Fix
format-jsonautofix job failing withflag --config-path is not valid in this contextwhen a[tool.biome]section exists. Biome's bpaf-based CLI scopes--config-pathinside the subcommand; the flag is now spliced after the subcommand name via a newconfig_after_subcommandfield inToolSpec. - Improve
file-bug-reportskill to check organization-level community health files from the org's.githubrepo before scanning per-repo files. GitHub allows orgs to define default CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md, and issue templates that repos inherit unless they provide their own copy.
Full changelog: v6.11.3...v6.12.0
🛡️ VirusTotal scans
| Binary | Analysis |
|---|---|
repomatic-6.12.0-linux-arm64.bin |
View scan |
repomatic-6.12.0-linux-x64.bin |
View scan |
repomatic-6.12.0-macos-arm64.bin |
View scan |
repomatic-6.12.0-macos-x64.bin |
View scan |
repomatic-6.12.0-windows-arm64.exe |
View scan |
repomatic-6.12.0-windows-x64.exe |
View scan |
v6.11.3
Immutable
release. Only release title and notes can be modified.
- Add
lint-repocheck warning when the GitHub Actions fork PR workflow approval policy is weaker thanfirst_time_contributors. Queries/repos/{repo}/actions/permissions/fork-pr-contributor-approvaland flags the defaultfirst_time_contributors_new_to_githubsetting, which only catches brand-new GitHub accounts. The setup guide includes a new step with a pre-filledgh apione-liner to fix the policy in place. - Add
readme.md§ Supply chain security section mapping Astral's Open Source Security at Astral practices to concrete repomatic implementations, with a known-gap admonition for multi-person release approval. - Fix
rst_to_mystconversion leaving RST backslash escapes (\_) in headings and not wrapping dotted Python module names in backticks.sphinx-apidocuses\_to prevent RST reference interpretation; these are meaningless in markdown and causemdformatto strip them on every reformat pass. - Fix
format-pyprojectautofix job failing with exit code 123.xargstranslatespyproject-fmt's exit code 1 (file reformatted) to 123, and the defaultbash -eshell aborted before the exit code guard could run. - Disable uv cache in the
publish-pypirelease job, which has no checkout step. Without a workspace,setup-uvcannot find lockfiles to hash and emits spurious cache-miss warnings on every run.
Full changelog: v6.11.2...v6.11.3
🛡️ VirusTotal scans
| Binary | Analysis |
|---|---|
repomatic-6.11.3-linux-arm64.bin |
View scan |
repomatic-6.11.3-linux-x64.bin |
View scan |
repomatic-6.11.3-macos-arm64.bin |
View scan |
repomatic-6.11.3-macos-x64.bin |
View scan |
repomatic-6.11.3-windows-arm64.exe |
View scan |
repomatic-6.11.3-windows-x64.exe |
View scan |
v6.11.2
Immutable
release. Only release title and notes can be modified.
- Add
shfmtshell formatter to the tool runner (repomatic run shfmt). Downloads the binary for the current platform and invokes it with managed version pinning and.editorconfigdiscovery. - Add
format-shellautofix job to auto-format shell scripts withshfmt. - Replace
crazy-max/ghaction-virustotalGitHub Action with a nativerepomatic scan-virustotalCLI command usingvt-py. Fixes the release body update that was silently skipped because the action required areleaseevent but the workflow triggers onpush. - Deduplicate release attestations: Python packages are now attested once in
build-packageinstead of three times acrossbuild-package,publish-pypi, andcreate-release. The attestation bundle is forwarded as an artifact tocreate-releasefor upload to the GitHub release. Also fixescreate-releaseaccidentally attesting.gitignorevia therelease_artifact/*glob.
Full changelog: v6.11.1...v6.11.2
🛡️ VirusTotal scans
| Binary | Analysis |
|---|---|
repomatic-6.11.2-linux-arm64.bin |
View scan |
repomatic-6.11.2-linux-x64.bin |
View scan |
repomatic-6.11.2-macos-arm64.bin |
View scan |
repomatic-6.11.2-macos-x64.bin |
View scan |
repomatic-6.11.2-windows-arm64.exe |
View scan |
repomatic-6.11.2-windows-x64.exe |
View scan |
v6.11.1
Immutable
release. Only release title and notes can be modified.
- Parallelize release workflow:
compile-binariesnow starts right aftermetadatainstead of waiting forcreate-release, andpublish-pypiruns concurrently withcreate-tagandcreate-release. Binary and attestation uploads to the GitHub release are deferred topublish-release. The PyPI admonition in release notes is applied bypublish-releaseafter confirming PyPI publication succeeded. - Fall back to PyPI
project_urlschangelog link when no GitHub Release exists for a package. Release notes sections now render a[Changelog](url)link instead of silently omitting the package. - Fix release workflow uploading attestation bundle before the GitHub release draft exists. The upload step now runs after release creation.
- Skip
exclude-newer-packageexemptions for packages whose fixed version already falls within theexclude-newercooldown window. Previously,fix-vulnerable-depspersisted"0 day"overrides for all upgraded packages unconditionally. - Fix
--delete-excludednot detecting scope-excludedBundledComponentfiles that still exist on disk. Component-level scope exclusion (e.g.,codecovin awesome repos) skipped recording file entries, so stale files were invisible to the deletion pass. - Fix awesome-template sync overwriting
pyproject.tomlinstead of merging._copy_template_treereplaced the entire file with the bundled template, stripping user-managed[tool.*]sections (e.g.,[tool.gitleaks]). The lychee config is now aToolConfigComponentwithAWESOME_ONLYscope, so it goes through the standard_init_tool_configsmerge path.pyproject.tomlis removed from the awesome-template bundle. - Fix
repomatic init <component>silently ignoring explicitly-requested components in repos where their scope doesn't match. Scope exclusions now only apply during barerepomatic init, matching the existing guard on user-config exclusions. This fixesrepomatic init renovatefailing in awesome repos where the renovate workflow materializesrenovate.json5at runtime. - Fix
--delete-excludedremoving opt-in workflow files in the source repo. Config-key exclusions (e.g.,notification.unsubscribe) now skip the source repo, matching the existing scope-exclusion guard. Previously, thesync-repomaticjob would delete.github/workflows/unsubscribe.yamlfrom upstream, breaking the symlink inrepomatic/data/and all downstreamworkflow_callreferences. - Fix
format-pyprojectautofix step running with no input files and masking tool errors. Thepyproject_filesmetadata key was missing, so pyproject-fmt ran against an empty file list and|| trueswallowed all non-zero exit codes. The key is now requested and the step tolerates only exit code 1 (file reformatted).
Full changelog: v6.11.0...v6.11.1
v6.10.0
Immutable
release. Only release title and notes can be modified.
- Add
brand-assetsskill to create and export project logo/banner SVG assets to light/dark PNG variants. - Add
babysit-ciskill to monitor CI test workflows, diagnose failures, fix code, and loop until all stable jobs pass. - Add
file-bug-reportskill to write upstream bug reports. Exhaustively reads contribution guidelines, issue templates, security policies, and community norms before producing a markdown file. - Add
test-matrix.replaceandtest-matrix.removeconfiguration to modify axis values in both full and PR test matrices.replaceswaps values (e.g.,replace.os = { "ubuntu-slim" = "ubuntu-24.04" }),removedrops values beforesolve()runs. Stale exclude directives referencing removed values are pruned with a warning. - Add
SyncModeenum andpreserved_keysfield toToolConfigComponent. Tool configs can now declaresync_mode=ONGOINGto opt into repeated syncing that preserves local additions. Preserve local[[tool.bumpversion.files]]entries duringsync-bumpversionas the first consumer. - Add
--output-format [markdown|github-actions]tosync-uv-lock,fix-vulnerable-deps,pr-body, andformat-images. Replaces implicit$GITHUB_OUTPUTenvironment variable detection with an explicit flag. Remove-oshort option frompr-bodyandformat-images(prefer long-form--output). - Add
.claude/scheduled_tasks.lockto the default.gitignoreextra content. - Append workflow metadata block to issue lifecycle comments (
Condition recurred.,Superseded by #N., close comments). Each comment now includes a collapsible table with trigger, actor, commit, job, workflow, and run link. - Make
setup-guideissue body conditional: each step is a collapsible section with a status indicator (completed steps are collapsed with a checkmark, incomplete steps are expanded with a warning). Add branch ruleset and Dependabot settings checks to the closing criteria. The issue now closes only when PAT, permissions, vulnerability alerts, and branch protection are all verified. - Rework
sync-uv-lockCLI output: default to a terminal table via click-extra's--table-format, add--release-notes/--no-release-notesand--table/--no-tableflags, move markdown formatting to--outputfor CI use only. Prune staleexclude-newer-packageentries frompyproject.tomlbefore relocking. - Change
renovatecomponent to opt-in (init_default=EXCLUDE). Excluderenovateandcodecovcomponents from awesome-list repositories. - Echo
metadataoutput to stderr when--outputtargets a file, so computed matrices are visible in CI logs. - Remove Python
3.15t(free-threaded) from the default test matrix. - Warn instead of crashing on unknown
[tool.repomatic]configuration keys. Old repomatic versions encountering config from a newer release now log a warning and continue. - Add
repomatic update-docsCLI command consolidatingsphinx-apidoc, RST-to-MyST conversion, anddocs/docs_update.pyexecution into a single orchestrated step. Projects using MyST-Parser get RST stubs automatically converted to markdown with{eval-rst}blocks. - Add
docs.apidoc-extra-args,docs.apidoc-exclude, anddocs.update-scriptconfiguration options. - Add
uses_mystmetadata property detecting MyST-Parser in Sphinx configuration. - Move
sync-uv-lockjob fromrenovate.yamltoautofix.yaml. The renovate workflow's path filter prevented the job from running on most pushes tomain, leaving stale PRs with merge conflicts. - Fix CLI crash when
test-matrix.variationsortest-matrix.replacecontain nested keys. Click-extra's generic config flattening was converting them to invalid field names. The CLI now routes config loading throughload_repomatic_configwhich preserves thetest-matrixsub-section structure.
Full changelog: v6.9.0...v6.10.0
v6.9.0
Immutable
release. Only release title and notes can be modified.
- Add per-project test matrix configuration via
[tool.repomatic.test-matrix]inpyproject.toml. Supportsexclude,include, andvariationsfields that map directly to theMatrixclass API. - Replace
audit-depslint job withfix-vulnerable-depsautofix job. Creates PRs that upgrade affected packages usinguv lock --upgrade-packagewith--exclude-newer-packagebypass for security fixes. - Add
codecovbundled component. Syncs.github/codecov.yamlto suppress PR comments unless coverage drops or the diff introduces uncovered lines. - Extend tool runner config resolution to support CWD-discovery tools (no
--configflag). Bundled defaults are written to disk and cleaned up after invocation. Move mdformatnumberdefault to a bundledmdformat.tomlso downstream repos can override via[tool.mdformat]or.mdformat.toml. - Replace dict-based config loading with click-extra's typed config resolution.
[tool.repomatic]is auto-discovered frompyproject.tomland exposed as a typedConfigdataclass viaget_tool_config(). Renameconfigsubcommand toshow-configto resolve a naming conflict with click-extra's--configoption. - Expand PAT validation in
lint-repoandcheck-renovate.lint-repogains repository scope check, tag ruleset detection, and workflows permission probe.check-renovatevalidates all PAT permissions (contents, issues, pull requests, vulnerability alerts, workflows) as warnings. - Auto-exclude
changelog.mdfor awesome-list repositories and remove redundant[tool.repomatic]exclude entries from the awesome template. Refactor the component registry to supportscope,target, andconfig_keyfields, replacing hardcoded dispatch with a type-driven loop.initCLI help text is now auto-generated from the registry. - Remove
prebake-versionandprebake-tag-shaCLI commands. Useclick-extra prebake all,click-extra prebake version, orclick-extra prebake fieldinstead. Rename__tag_sha__to__git_tag_sha__to align with click-extra'sgit_*naming convention. - Migrate from
actions/attest-build-provenancetoactions/attest. - Rename
pr-metadata.mdtemplate to.md.noformatextension to prevent mdformat from mangling the$rerun_rowtable-row placeholder. - Skip Codecov uploads on
sync-repomaticPRs. - Unify PAT permission validation into
check_all_pat_permissions()intoken.py.lint-repo,setup-guide, andcheck-renovateall use the same code path.setup-guidenow runs granular permission checks when the PAT is present and keeps the issue open with a diagnostic table when permissions are incomplete. - Fix
setup-guidejob: add missingHAS_REPOMATIC_PATenv var and remove upstream repo carve-out so PAT detection works everywhere. - Fix infinite cycle between
migrate-to-renovateandsync-repomaticjobs. - Include git stderr in
git-tagCLI error messages.
Full changelog: v6.8.0...v6.9.0
v6.8.0
Immutable
release. Only release title and notes can be modified.
- Move test matrix definition from inline YAML to
repomatic metadatausing theMatrixclass. Thetestsjob now depends on themetadatajob and consumes pre-computedtest_matrix/test_matrix_proutputs. Fixes thematrixcontext being unavailable in job-levelif:. - Reduce CI jobs on pull requests by skipping release builds, experimental Python versions, redundant architecture variants, and install/architecture verification tests. Full matrix still runs on push to main.
- Make
excludeconfig additive to default exclusions (labels,skills). Userexcludeentries now add to the defaults instead of replacing them. Addincludeconfig to force-include components that are excluded by default. - Add
--delete-unmodifiedflag torepomatic initto automatically remove config files identical to bundled defaults instead of only reporting them. Renamed from--delete-redundant. - Remove deprecated
WORKFLOW_UPDATE_GITHUB_PATsecret and all backward-compatibility fallbacks. Downstream repos must useREPOMATIC_PAT. - Auto-exclude
awesome-triageskill for non-awesome repositories. The skill is only relevant toawesome-*repos and was previously installed in all downstream projects. - Add
--delete-excludedflag torepomatic initto remove excluded files that still exist on disk. Detects component-level exclusions, file-level exclusions, auto-excluded files (e.g.,awesome-triageon non-awesome repos), and disabled opt-in workflows. - Replace
sync-workflowsandclean-unmodified-configsautofix jobs with a singlesync-repomaticjob. Runsrepomatic init --delete-unmodified --delete-excludedto sync all managed files and clean up stale ones in one PR. Renamed fromclean-redundant-configsand--delete-redundant. - Remove
PAT setup hintsteps andHAS_REPOMATIC_PATenv var fromautofix.yamlandchangelog.yamlworkflows. Thesetup-guidejob already creates an issue when the PAT is missing. - Add PAT capability checks and repo configuration validation to
lint-repo. Checks Renovate config exists, Dependabot security updates disabled, and vulnerability alerts enabled. WhenREPOMATIC_PATis configured, validates contents, issues, pull requests, Dependabot alerts, and commit statuses permissions. AddREQUIRED_PAT_PERMISSIONSconstant intoken.pyas the single source of truth for expected permissions. - Add stale draft release detection to
lint-repo. Warns about draft releases whose tag does not end with.dev0, which are leftovers from abandoned or failed release attempts. - Relax abandoned dependency threshold from 1 year to 2 years in Renovate config.
- Fix thin-caller generation rendering
workflow_dispatchinput definitions as Python dict literals instead of block-style YAML. - Add
/sphinx-docs-syncskill for cross-project Sphinx documentation comparison and synchronization. - Add
/translation-syncskill to detect stale translations inreadme.*.mdandcontributing.*.mdfiles. Compares structure and content against the English source, flags drift, and drafts updated translations. Auto-excluded for non-awesome repos. - Streamline Dependabot guidance in setup guide issue. Clarify that Renovate handles security PRs and that
renovate.yamlauto-removesdependabot.yml. Link Actions tab directly to theautofix.yamlworkflow. - Allow
repomatic initto accept qualifiedcomponent/fileselectors (e.g.,repomatic init skills/repomatic-topics). Uses the same syntax as theexcludeconfig option. Renameparse_excludetoparse_component_entriesand_valid_file_idstovalid_file_idsto support the shared parsing path. - Only auto-include
awesome-templatecomponent forawesome-*repos when no explicit components are given. Previously,repomatic init skills/repomatic-topicson an awesome repo would also sync all awesome-template files. - Stop persisting
[tool.ruff]defaults into downstreampyproject.toml. Bundled ruff config is now injected at runtime via--configwhen no[tool.ruff],ruff.toml, or.ruff.tomlexists. Remove therepomatic init ruffstep from theformat-pythonworkflow job. - Add package version diff table to
sync-uv-lockPRs. Lists updated, added, and removed packages with their old and new versions. Package names link to PyPI. Shows release date andexclude-newercutoff for visual verification. Includes collapsible release notes fetched from GitHub Releases. - Document file naming conventions in
claude.md: prefer.yamlover.ymland lowercase filenames everywhere, with a table of GitHub exceptions that require.ymlor uppercase. - Fix awesome-template URL rewriting to also process
.ymlfiles in.github/. - Auto-exclude
changelog.yaml,debug.yaml, andrelease.yamlworkflows forawesome-*repositories. These package-oriented workflows are irrelevant to curated lists. - Materialize bundled
renovate.json5at runtime in the Renovate workflow when the file is absent. Downstream repos can safely delete theirrenovate.json5viaclean-redundant-configswithout breaking Renovate runs. - Remove
sync-renovateCLI command, autofix job,renovate.syncconfig toggle, and PR body template. Thesync-repomaticjob (viarepomatic init --delete-redundant) already handles Renovate config sync, and the Renovate workflow now materializes the bundled default at runtime when the file is absent. - Remove
sync-bundled-configjob fromrenovate.yaml. The bundledrepomatic/data/renovate.json5is now regenerated byrepomatic initwhen it detects it's running in the source repository, folded into thesync-repomaticautofix job. - Remove upstream exclusion from
sync-repomaticjob. The upstream repo's[tool.repomatic] exclude = ["workflows"]prevents thin-caller generation, whilerepomatic inithandles the bundled renovate config regeneration. - Pin GitHub Actions to SHA digests via Renovate's
helpers:pinGitHubActionDigestsToSemverpreset. Prevents supply chain attacks from mutable tags while keeping automated version updates. - Add top-level
permissions: {}to all workflow files. Denies allGITHUB_TOKENpermissions by default, requiring each job to declare its own minimal permissions explicitly. - Merge
/repomatic-deps-reviewinto/repomatic-deps. The unified skill now supports two modes:graph(dependency tree visualization, previously the only mode) andreview(declaration audit against version policy). Also checks for staleexclude-newer-packagecooldown exceptions in[tool.uv]. - Consolidate 12+ scattered init constants into a declarative component registry (
repomatic/registry.py). Each component declares its kind, init default, file entries, and behavioral flags in one place. All derived constants (ALL_COMPONENTS,COMPONENT_FILES,REUSABLE_WORKFLOWS,SKILL_PHASES, etc.) are computed from the registry. - Fix
sync-repomaticdeleting the upstream repo's own skills. The source repo guard only covered auto-exclusions, not default exclusions (labels,skills). - Rename "redundant" terminology to "unmodified" across the CLI, output, and codebase.
--delete-redundantbecomes--delete-unmodified,clean-redundant-configsbecomesclean-unmodified-configs. - Generalize
opt_in_keyintoconfig_key/config_defaulton bothFileEntryandComponent. Replace the proceduralawesome-template.synccheck with a registry declaration.
Full changelog: v6.7.0...v6.8.0
v6.7.0
Immutable
release. Only release title and notes can be modified.
- Bundle awesome-template boilerplate files in
repomaticinstead of cloning fromkdeldycke/awesome-templateat runtime. - Add
pyproject_filesmetadata key listing allpyproject.tomlfiles. Theformat-pyprojectjob now formats all of them instead of only the root file. - Remove
sync-skills,workflow create, andworkflow syncCLI commands. All three are superseded byrepomatic initwhich handles skills, thin-caller generation, and header-only sync in a single invocation. - Add branch protection checklist to the setup guide issue. Links to a pre-filled ruleset creation form targeting the default branch with force-push and deletion protection.
- Add
unsubscribe.yamlreusable workflow for scheduled cleanup of closed notification threads. Opt-in vianotification.unsubscribe = truein[tool.repomatic]. Requires a classic PAT withnotificationsscope stored asREPOMATIC_NOTIFICATIONS_PAT. IntroduceOPT_IN_WORKFLOWSmechanism for workflows that are excluded from thin-caller generation unless explicitly enabled. - Surface actual
ghCLI error messages inunsubscribe-threadswarnings. Previously,RuntimeErrordetails from failed API calls were discarded, making Phase 1 REST failures impossible to diagnose from CI logs. - Enable
delete-branch: trueon allpeter-evans/create-pull-requestinvocations. Stale automation PRs are now auto-closed when a subsequent workflow run finds no changes to commit. - Add
gitleaksto the tool runner registry with binary download support and[tool.gitleaks]configuration bridge. Migratelint-secretsworkflow job fromgitleaks/gitleaks-actiontorepomatic run gitleaks. - Move lychee config from
lychee.tomlto[tool.lychee]inpyproject.toml. The tool runner's TOML bridge translates it to a native config file at runtime. Downstream repos with a standalonelychee.tomlcan do the same. - Fix
format-imagesjob failing becauseoxipngis not packaged in Ubuntu. Install from the GitHub release.debinstead, allowing the job to run onubuntu-slim.
Full changelog: v6.6.0...v6.7.0