1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
{#
and rendered at runtime with
-- list of { id, path, type, changelog? }
-- true when more than one package was discovered
has_npm / has_deno / has_dart -- ecosystem detected flags
#}
# =============================================================================
# monochange.toml — repository configuration for monochange
# =============================================================================
#
# This file is the single source of truth for release planning, CLI commands,
# changelog generation, and automation flows in this monorepo.
#
# Run `mc validate` to check this file against the workspace.
# Run `mc init` to generate a starter config from detected packages.
# =============================================================================
# [defaults] — repository-wide defaults applied to every package unless
# overridden at the package or group level.
# =============================================================================
[]
# Bump severity applied to transitive dependents when a dependency changes.
# When package A depends on package B, and B gets a minor bump, A receives
# whichever bump is configured here.
#
# Options: "none", "patch", "minor", "major"
# Default: "patch"
= "patch"
# Whether to include private packages (publish = false) in discovery and
# release planning. When false, private packages are discovered but excluded
# from release plans and version bumps.
#
# Default: false
= false
# Emit a warning when version-group members have mismatched current versions.
# Helps catch accidental version drift in grouped packages.
#
# Default: true
= true
# Default package type for all packages that don't declare their own `type`.
# Setting this avoids repeating `type = "cargo"` on every [package.*] entry.
#
# Options: "cargo", "npm", "deno", "dart", "flutter"
# Default: none (each package must declare its own type)
# package_type = "cargo"
# Default changelog configuration applied to every package that doesn't
# declare its own `changelog` field.
#
# Accepts three forms:
{% raw -%}
# true → use "{{ path }}/CHANGELOG.md" for every package
# false → disable changelogs by default
# "{{ path }}/changelog.md" → pattern where {{ path }} is replaced with each package path
#
# As a table, you can set both path and format:
# [defaults.changelog]
# path = "{{ path }}/changelog.md"
# format = "keep_a_changelog"
{% endraw -%}
#
# Supported formats: "monochange" (default), "keep_a_changelog"
# Default: none (changelogs are disabled unless configured)
# [defaults.changelog]
{% raw -%}
# path = "{{ path }}/changelog.md"
{% endraw -%}
# format = "keep_a_changelog"
# Default extra changelog sections applied to every package/group unless
# that target adds more sections of its own.
#
# Each entry maps one or more changeset `type` values into a named changelog
# section. Example:
# extra_changelog_sections = [
# { name = "Testing", types = ["test"], default_bump = "none", description = "Changes that only modify tests" },
# { name = "Documentation", types = ["docs"], default_bump = "none", description = "Changes that only modify documentation" },
# { name = "Security", types = ["security"], default_bump = "none", description = "Security-related changes" },
# { name = "Performance", types = ["perf"], default_bump = "none", description = "Performance improvements" },
# { name = "Refactor", types = ["refactor"], default_bump = "none", description = "Code refactoring without functional changes" },
# ]
#
# Each section can include:
# - name: The display name for the changelog section
# - types: List of change types that route to this section
# - default_bump (optional): The default semver bump for this type (none, patch, minor, major)
# - description (optional): When this type should be used; helpful for LLMs and users
#
# Default: []
# Default empty_update_message applied when a package is bumped but has no
# direct changeset entries (e.g. transitive dependency bumps or group
# synchronization). Template placeholders are interpolated at render time
# using minijinja syntax.
#
# Available placeholders:
{% raw -%}
# {{ package }}, {{ package_name }}, {{ package_id }}
# {{ group }}, {{ group_name }}, {{ group_id }}
# {{ version }}, {{ new_version }}, {{ current_version }}, {{ previous_version }}
# {{ bump }}, {{ trigger }}, {{ ecosystem }}
# {{ release_owner }}, {{ release_owner_kind }}
# {{ members }}, {{ member_count }} (group changelogs only)
# {{ reasons }}
{% endraw -%}
#
# Precedence: package → group → defaults → built-in message
# Default: built-in message varies by grouped/ungrouped context
#
{% raw -%}
# empty_update_message = "No direct changes; {{ package }} updated to {{ version }}."
{% endraw %}
# Default release_title applied when creating provider releases.
# This is a plain-text title used for GitHub, GitLab, and Gitea releases.
#
# Available placeholders:
{% raw -%}
# {{ version }}, {{ id }}, {{ date }}, {{ time }}, {{ datetime }}
# {{ changes_count }}, {{ tag_url }}, {{ compare_url }}
{% endraw -%}
#
# Defaults:
# Primary versioning: "{{ version }} ({{ date }})"
# Namespaced versioning: "{{ id }} {{ version }} ({{ date }})"
#
{% raw -%}
# release_title = "{{ version }} ({{ date }})"
{% endraw %}
# Default changelog_version_title controls how changelog version headings render.
# This is markdown-capable and supports links.
#
# Available placeholders: same as release_title above.
#
# Defaults:
# Primary: "[{{ version }}]({{ tag_url }}) ({{ date }})" (linked when source configured)
# Namespaced: "{{ id }} [{{ version }}]({{ tag_url }}) ({{ date }})"
#
# To restore headings without dates (the previous default), set:
{% raw -%}
# changelog_version_title = "{{ version }}"
{% endraw -%}
#
{% raw -%}
# changelog_version_title = "[{{ version }}]({{ tag_url }}) ({{ date }})"
{% endraw %}
# =============================================================================
# [release_notes] — workspace-wide release-note rendering settings
# =============================================================================
# [release_notes]
# Templates that control how individual change entries render in changelogs.
# Each template is tried in order; the first one whose required variables are
# all present wins (uses minijinja strict mode — all referenced variables must
{% raw -%}
# be defined). If none match, falls back to "- {{ summary }}".
#
# Available variables:
# {{ summary }} — the change summary from the changeset
# {{ details }} — optional multi-line details block
# {{ package }} — package name
# {{ version }} — planned version
# {{ target_id }} — release owner id (package or group)
# {{ bump }} — bump severity (none, patch, minor, major)
# {{ type }} — optional change type (e.g. "security", "note")
# {{ context }} — rendered context context block
# {{ context }} — alias for {{ context }}
# {{ changeset_path }} — path to the changeset file
# {{ change_owner }}, {{ change_owner_link }}
# {{ review_request }}, {{ review_request_link }}
# {{ introduced_commit }}, {{ introduced_commit_link }}
# {{ last_updated_commit }}, {{ last_updated_commit_link }}
# {{ related_issues }}, {{ related_issue_links }}
# {{ closed_issues }}, {{ closed_issue_links }}
#
# Default: ["#### {{ summary }}\n\n{{ details }}", "- {{ summary }}"]
# change_templates = [
# "#### {{ summary }}\n\n{{ details }}\n\n{{ context }}",
# "#### {{ summary }}\n\n{{ context }}",
# "#### {{ summary }}\n\n{{ details }}",
# "- {{ summary }}",
# ]
{% endraw %}
# =============================================================================
# [package.*] — declare each release-managed package explicitly
# =============================================================================
#
# Required fields:
# path — relative path from repo root to the package directory
#
# Optional fields:
# type — "cargo", "npm", "deno", "dart", "flutter"
# (not needed when defaults.package_type is set)
# changelog — true, false, "path/to/changelog.md", or a table
# with { path, format }; overrides [defaults.changelog]
# extra_changelog_sections — custom changelog sections with type routing
# empty_update_message — per-package fallback text for transitive bumps
# versioned_files — additional files to update with the new version
# package-scoped string entries infer the package ecosystem,
# e.g. ["Cargo.toml"] or ["**/crates/*/Cargo.toml"]
# explicit typed entries remain supported, e.g.
# [{ path = "group.toml", type = "cargo" }]
# typed manifest entries can update dependency
# sections and arbitrary string fields inside TOML
# or JSON manifests, e.g.
# [{ path = "Cargo.toml", type = "cargo", fields = ["workspace.metadata.bin.monochange.version"], prefix = "" }]
# regex entries update plain-text files and must include a
# named `version` capture group, e.g.
# [{ path = "README.md", regex = 'v(?<version>\d+\.\d+\.\d+)' }]
# regex entries cannot set `type`, `prefix`, `fields`, or `name`
# lockfiles can still be listed explicitly, but
# ecosystem-level lockfile refresh now prefers
# [ecosystems.<name>].lockfile_commands
# ignore_ecosystem_versioned_files — opt out of inherited [ecosystems.<name>].versioned_files
# defaults for this package (default: false)
# ignored_paths — glob patterns for paths within this package to
# exclude from changeset verification
# additional_paths — glob patterns for paths outside the package
# directory that should trigger changeset verification
# tag — whether to create a git tag for this package (default: false)
# release — whether to create a provider release (default: false)
# version_format — "namespaced" (default: "pkg/v1.0.0") or
# "primary" (just "v1.0.0"); only one package/group
# may use "primary"
{% for pkg in packages %}
[{{ pkg.id }}]
= "{{ pkg.path }}"
= "{{ pkg.type }}"
{% if pkg.changelog %}
= "{{ pkg.changelog }}"
{% endif %}
{% endfor %}
# =============================================================================
# [group.*] — version groups that share a single release identity
# =============================================================================
#
# When packages belong to a group, they share a synchronized version and a
# single release tag/identity. If any member bumps, all members bump to the
# group's highest severity.
#
# Required fields:
# packages — list of [package.*] ids that belong to this group
#
# Optional fields:
# changelog — path or table for the group-level changelog;
# tables may also set `include = "all"`,
# `include = "group-only"`, or
# `include = ["package-id"]` to control which
# member-targeted changesets appear in the group
# changelog (direct group-targeted changesets are
# always included; default: "all")
# extra_changelog_sections — custom changelog sections with type routing
# empty_update_message — fallback text when the group bumps but a
# specific member has no direct changeset entries
# versioned_files — additional files to version-bump with the group
# groups must use explicit typed entries because the
# ecosystem cannot be inferred from a bare string;
# regex entries are also supported, e.g.
# [{ path = "**/install.sh", regex = 'SDK_VERSION="(?<version>\d+\.\d+\.\d+)"' }]
# tag — create a git tag for the group release (default: false)
# release — create a provider release for the group (default: false)
# version_format — "namespaced" (default) or "primary"
#
# Rules:
# - group members must be declared under [package.*]
# - package and group ids share one namespace (no collisions)
# - a package may belong to only one group
# - only one package or group may use version_format = "primary"
# - group tag/release/version_format override member package settings
# - prefer package ids in authored changesets when possible; dependents and
# grouped members propagate automatically, so group ids are best for
# intentionally group-owned releases
{% if has_group %}
[]
= [{ package_ids_toml }}]
= true
= true
= "primary"
# [group.main.changelog]
# path = "changelog.md"
# include = ["package-id"]
{% endif %}
# =============================================================================
# [[deployments]] — deployment intent definitions
# =============================================================================
#
# Deployments are structured intents emitted in the release manifest so
# downstream CI can decide when and how to execute them. monochange does not
# run deployments directly — it declares them.
#
# Fields:
# name — unique deployment name
# trigger — when to deploy: "workflow" (manual), "release_pr_merge",
# or "release_published"
# workflow — CI workflow to trigger
# environment — target environment name (optional)
# release_targets — which release targets activate this deployment (default: all)
# requires — dependencies that must be met before deploying
# metadata — arbitrary key-value pairs passed to the workflow
#
# Example:
# [[deployments]]
# name = "docs"
# trigger = "release_published"
# workflow = "docs-release"
# environment = "github-pages"
# release_targets = ["main"]
# requires = ["main"]
# metadata = { site = "github-pages" }
# =============================================================================
# [ecosystems.*] — per-ecosystem discovery and publishing settings
# =============================================================================
#
# Each supported ecosystem can be configured independently.
#
# Fields:
# enabled — opt-in/opt-out of discovery for this ecosystem (default: none,
# meaning discovery runs when manifests are found)
# roots — restrict discovery to specific directories (default: scan entire repo)
# exclude — glob patterns to exclude from discovery
# dependency_version_prefix — default dependency prefix for typed versioned_files
# versioned_files — ecosystem-wide default versioned_files inherited by matching packages;
# entries may be typed manifest updates (including
# arbitrary TOML/JSON field paths) or plain-text regex
# replacements with a named `version` capture, e.g.
# [{ path = "src/lib.rs", regex = 'VERSION: &str = "(?<version>\d+\.\d+\.\d+)"' }]
# lockfile_commands — optional escape-hatch commands that refresh ecosystem
# lockfiles after a release updates manifest versions.
# By default monochange rewrites supported lockfiles
# directly from the release plan so `mc release` stays on
# the fast path. Cargo is not re-run automatically anymore,
# so incomplete Cargo.lock files should be refreshed with
# explicit commands here or manually afterwards. When set,
# these commands fully own lockfile refresh for that ecosystem.
{% if has_cargo %}
[]
= true
{% else %}
# [ecosystems.cargo]
# enabled = true
{% endif %}
{% if has_npm %}
[]
= true
{% else %}
# [ecosystems.npm]
# enabled = true
{% endif %}
{% if has_deno %}
[]
= true
{% else %}
# [ecosystems.deno]
# enabled = true
{% endif %}
{% if has_dart %}
[]
= true
{% else %}
# [ecosystems.dart]
# enabled = true
{% endif %}
# =============================================================================
# [source] — source-control provider configuration
# =============================================================================
#
# Configures the repository host for release automation: creating releases,
# opening release pull requests, and evaluating changeset policy.
#
# Required fields:
# provider — "github", "gitlab", or "gitea"
# owner — repository owner or organization
# repo — repository name
#
# Optional fields:
# host — custom host URL for self-hosted instances
# api_url — custom API URL (e.g. for GitHub Enterprise)
{% if provider %}
[]
= "{{ provider }}"
= "{{ owner }}"
= "{{ repo }}"
# [source.releases] — provider release settings
#
# Controls whether and how releases are created on the provider when the
# PublishRelease CLI step runs.
[]
= true
= "monochange"
# [source.pull_requests] — release pull request settings
#
# Controls the OpenReleaseRequest CLI step which creates or updates a release
# PR with version bumps, changelog updates, and changeset cleanup.
[]
= true
= "monochange/release"
= "main"
= "chore(release): prepare release"
= ["release", "automated"]
= false
{% else %}
#
# [source]
# provider = "github"
# owner = "your-org"
# repo = "your-repo"
# [source.releases] — provider release settings
#
# Controls whether and how releases are created on the provider when the
# PublishRelease CLI step runs.
#
# Fields:
# enabled — enable/disable release creation (default: true)
# draft — create releases as drafts (default: false)
# prerelease — mark releases as pre-releases (default: false)
# generate_notes — ask the provider to auto-generate release notes (default: false)
# source — release notes source: "monochange" (use monochange-rendered
# notes) or "github_generated" (use provider-generated notes)
# Default: "monochange"
#
# [source.releases]
# enabled = true
# draft = false
# prerelease = false
# source = "monochange"
# [source.pull_requests] — release pull request settings
#
# Controls the OpenReleaseRequest CLI step which creates or updates a release
# PR with version bumps, changelog updates, and changeset cleanup.
#
# Fields:
# enabled — enable/disable release PR creation (default: true)
# branch_prefix — branch name prefix for release PRs (default: "monochange/release")
# base — target branch for the release PR (default: "main")
# title — PR title template (default: "chore(release): prepare release")
# labels — labels applied to the release PR (default: ["release", "automated"]
# auto_merge — enable auto-merge on the PR when supported (default: false)
#
# [source.pull_requests]
# enabled = true
# branch_prefix = "monochange/release"
# base = "main"
# title = "chore(release): prepare release"
# labels = ["release", "automated"]
# auto_merge = false
# [source.bot.changesets] — changeset policy for provider-aware automation
#
# These settings feed the AffectedPackages step when it needs to know which
# paths matter for a pull request on the configured source provider.
#
# For skip_labels, prefer [changesets.verify].skip_labels instead.
#
# Fields:
# enabled — enable provider-aware changeset policy (default: false)
# required — treat missing changesets as errors (default: true)
# skip_labels — PR labels that skip enforcement (default: [])
# comment_on_failure — render a failure comment for CI (default: true)
# changed_paths — glob patterns for paths that require changeset coverage;
# only files matching at least one pattern trigger verification
# ignored_paths — glob patterns for paths to exclude from verification even
# when they match changed_paths
#
# [source.bot.changesets]
# enabled = false
# required = true
# skip_labels = []
# comment_on_failure = true
# changed_paths = []
# ignored_paths = []
{% endif %}
# =============================================================================
# [changesets.verify] — changeset verification settings
# =============================================================================
#
# Controls the `AffectedPackages` CLI step which checks whether pull requests
# include changeset files that cover all changed packages.
#
# This section works independently of any source provider.
[]
# Whether changeset verification is enabled. When false, the AffectedPackages
# step will refuse to run.
# Default: true
= true
# Whether a missing changeset is treated as a failure (true) or just a
# warning (false).
# Default: true
= true
# Pull-request labels that skip verification entirely. When any label on the
# PR matches an entry here, the verify step returns "skipped" instead of
# evaluating coverage.
# Default: []
= []
# Whether to render a failure comment body in the evaluation output for
# CI integrations to post back to the pull request.
# Default: true
= true
# =============================================================================
# [cli.*] — user-defined CLI commands
# =============================================================================
#
# Each [cli.<name>] table becomes a top-level `mc <name>` command.
#
# monochange starts from its built-in default command set. If you redefine a
# built-in command like [cli.release], your definition fully replaces the
# default for that command. You can delete unchanged built-in command tables
# from your real monochange.toml and keep only the overrides you care about.
#
# Reserved names that cannot be used: "init", "help", "version"
#
# Fields:
# help_text — description shown in `mc --help`
# inputs — command-line arguments/flags
# steps — ordered list of step definitions to execute
#
# Input types:
# "string" — single string value
# "string_list" — repeatable string value (--flag a --flag b)
# "path" — file path value
# "choice" — constrained to a set of choices
#
# Available step types:
# Validate — validate monochange.toml and changesets
# Discover — discover packages across ecosystems
# CreateChangeFile — create a .changeset/*.md file
# PrepareRelease — compute release plan, update versions, changelogs,
# and refresh .monochange/release-manifest.json
# CommitRelease — create a local release commit (requires PrepareRelease)
# PublishRelease — create provider releases (requires PrepareRelease)
# OpenReleaseRequest — open/update a release PR (requires PrepareRelease)
# CommentReleasedIssues — comment on issues referenced in changesets
# AffectedPackages — show affected packages and evaluate changeset coverage
# DiagnoseChangesets — render per-changeset commit/PR/context diagnostics
# Deploy — emit deployment intents (reserved, currently unsupported)
# Command — run an arbitrary shell command
#
# Common step fields:
# name — optional human-readable label shown in progress output and
# diagnostics. Useful for long workflows with several steps
# of the same kind.
# when — optional condition controlling whether this step runs (e.g.
#{% raw -%}
# "{{ inputs.enabled }}", "{{ inputs.debug and not inputs.skip }}")
#{% endraw -%}
# If the expression resolves to false, the step is skipped.
# inputs — optional map of step-local input overrides. Values can be
# strings, booleans, or string arrays.
{% raw -%}
# Use direct template references like "{{ inputs.label }}"
{% endraw -%}
# to forward values from command inputs without losing
# list/boolean types.
# show_progress — optional boolean for interactive CreateChangeFile / Command
# steps. Set false when spinner output would interfere with
# prompts or a custom terminal UI.
#
# Command step fields:
# command — the command to run (supports minijinja interpolation)
# dry_run_command — alternative command for --dry-run mode (optional;
# if omitted, the step is skipped in dry-run)
# shell — run through a shell: true (sh -c), "bash" (bash -c),
# "zsh" (zsh -c), or false/omitted (direct exec)
# id — optional step identifier; when set, stdout and stderr are
# captured and available to later steps via
# steps.ID.stdout and steps.ID.stderr
# variables — map of placeholder → variable for interpolation
#
# Step output namespaces (available in Command step templates):
# release.* — from PrepareRelease: version, group_version, dry_run,
# released_packages, changed_files, updated_changelogs,
# deleted_changesets, changeset_paths, targets
# manifest.path — from PrepareRelease: path to the cached release manifest
# release_commit.* — from CommitRelease: subject, body, commit, tracked_paths, status
# affected.* — from AffectedPackages: status, summary
# steps.ID.* — from Command steps with id: stdout, stderr
#
{% raw -%}
# Built-in command variables (available as {{ var }} in command templates):
# {{ version }}, {{ group_version }}, {{ released_packages }},
# {{ changed_files }}, {{ changesets }}
# {{ released_packages_list }} — array form, supports filters like
# {{ released_packages_list | join(", ") }}
# {{ inputs.name }} — namespaced CLI inputs for any step override
{% endraw -%}
{% raw -%}
# CLI inputs are available as {{ inputs.name }} in command templates.
{% endraw -%}
[]
= "Validate monochange configuration and changesets"
= [{ = "validate workspace", = "Validate" }]
[]
= "Discover packages across supported ecosystems"
= [
{ = "format", = "choice", = ["text", "json"], = "text" },
]
= [{ = "discover packages", = "Discover" }]
[]
= "Create a change file for one or more packages"
= [
{ = "package", = "string_list", = true },
{ = "bump", = "choice", = ["none", "patch", "minor", "major"], = "patch" },
{ = "reason", = "string", = true },
{ = "type", = "string" },
{ = "details", = "string" },
{ = "output", = "path" },
]
= [{ = "create change file", = "CreateChangeFile" }]
[]
= "Prepare a release from discovered change files"
= [
{ = "format", = "choice", = ["markdown", "text", "json"], = "markdown" },
]
= [{ = "prepare release", = "PrepareRelease" }]
[]
= "Evaluate pull-request changeset policy"
= [
{ = "format", = "choice", = ["text", "json"], = "text" },
{ = "changed_paths", = "string_list", = true },
{ = "label", = "string_list" },
]
{% raw -%}
# Step inputs example: { changed_paths = "{{ inputs.changed_paths }}", label = "{{ inputs.label }}", verify = true }
{% endraw -%}
= [{ = "evaluate affected packages", = "AffectedPackages" }]
[]
= "Show changeset diagnostics and context"
= [
{ = "format", = "choice", = ["text", "json"], = "text" },
{ = "changeset", = "string_list", = "changeset path(s), e.g. .changeset/feature.md (omit for all changesets)" },
]
= [{ = "diagnose changesets", = "DiagnoseChangesets" }]
[]
= "Repair a recent release by moving its release tags to a later commit"
= [
{ = "from", = "string", = "tag or commit-ish used to locate the release record", = true },
{ = "target", = "string", = "commit-ish the release set should move to", = "HEAD" },
{ = "force", = "boolean", = "allow non-descendant retargets", = "false" },
{ = "sync_provider", = "boolean", = "sync hosted release state after tag movement (disable with --sync-provider=false)", = "true" },
{ = "format", = "choice", = ["text", "json"], = "text" },
]
= [{ = "retarget release", = "RetargetRelease" }]
{% if provider %}
[]
= "Prepare a release, commit it, and open or update a release PR"
= [
{ = "format", = "choice", = ["text", "json"], = "text" },
]
= [
{ = "PrepareRelease" },
{ = "CommitRelease" },
{ = "OpenReleaseRequest" },
]
{% endif %}