id = "multi-gitter"
name = "multi-gitter"
homepage = "https://github.com/lindell/multi-gitter"
description = "Update multiple repositories with one command."
executables = ["multi-gitter"]
[dotfiles]
paths = ["~/.multi-gitter/config"]
secret = []
[[dotfiles.secret_paths]]
file = "~/.multi-gitter/config"
format = "yaml"
match = { key_path = ["token"] }
[commands]
format = 1
label = "multi-gitter"
description = "Run a script across many repositories and open pull requests. Only the run subcommand is modelled; tokens and other platform flags are left out (use environment variables for tokens)."
quality = "ai-draft"
parser = { end_of_options = "--", interleave = "permute", long_equals = true, short_attached = false, short_bundles = false }
[[commands.subcommand]]
path = ["run"]
label = "Run a script on repositories"
[[commands.subcommand.source]]
id = "readme"
kind = "help"
url = "https://raw.githubusercontent.com/lindell/multi-gitter/HEAD/README.md"
revision = "2026-10"
evidence = """
multi-gitter run [script path] [flags]
-B, --branch string The name of the branch where changes are committed. (default "multi-gitter-branch")
-m, --commit-message string The commit message. Will default to title + body if none is set.
-d, --dry-run Run without pushing changes or creating pull requests.
--draft Create pull request(s) as draft.
-O, --org strings The name of a GitHub organization. All repositories in that organization will be used.
-R, --repo strings The name of a GitHub repository in the format "ownerName/repoName".
-U, --user strings The name of a user. All repositories owned by that user will be used.
-t, --pr-title string The title of the PR.
--skip-pr Skip pull request and directly push to the branch.
"""
[[commands.subcommand.field]]
id = "script"
label = "Script"
description = "Script path or command line to run in each repository."
type = "string"
position = 0
min = 1
effect = "exec"
sources = ["readme"]
[[commands.subcommand.field]]
id = "org"
label = "GitHub organization"
type = "string"
option = ["--org", "-O"]
multiple = true
sources = ["readme"]
[[commands.subcommand.field]]
id = "repo"
label = "Repository (owner/name)"
type = "string"
option = ["--repo", "-R"]
multiple = true
sources = ["readme"]
[[commands.subcommand.field]]
id = "user"
label = "User"
type = "string"
option = ["--user", "-U"]
multiple = true
sources = ["readme"]
[[commands.subcommand.field]]
id = "branch"
label = "Branch name"
type = "string"
option = ["--branch", "-B"]
sources = ["readme"]
[[commands.subcommand.field]]
id = "message"
label = "Commit message"
type = "string"
option = ["--commit-message", "-m"]
sources = ["readme"]
[[commands.subcommand.field]]
id = "pr_title"
label = "Pull request title"
type = "string"
option = ["--pr-title", "-t"]
sources = ["readme"]
[[commands.subcommand.field]]
id = "dry_run"
label = "Dry run"
type = "boolean"
option = ["--dry-run", "-d"]
sources = ["readme"]
[[commands.subcommand.field]]
id = "draft"
label = "Draft pull requests"
type = "boolean"
option = ["--draft"]
sources = ["readme"]
[[commands.subcommand.field]]
id = "skip_pr"
label = "Push directly, no pull request"
type = "boolean"
option = ["--skip-pr"]
effect = "overwrite"
sources = ["readme"]
[[commands.subcommand.task]]
id = "dry"
label = "Dry run over an organization"
fields = ["script", "org", "branch", "message"]
required = ["script", "org", "branch", "message"]
set = { dry_run = [true] }
[[commands.subcommand.task]]
id = "open_prs"
label = "Open pull requests"
fields = ["script", "org", "repo", "branch", "message", "pr_title", "draft"]
required = ["script", "branch", "message"]
[[commands.subcommand.group]]
id = "basic"
label = "Basic"
fields = ["script", "org", "repo", "user", "branch", "message"]
[[commands.subcommand.group]]
id = "advanced"
label = "Advanced"
fields = ["pr_title", "dry_run", "draft", "skip_pr"]