dart-package-maintenance · git:20261014.3975f56 · 2026-10-14 · sha256 bb7c97d0e5b10549
dart-package-maintenance git:20261014.3975f56A
Immutable. This exact content never changes and is served at /api/v1/blob/bb7c97d0e5b10549.
---
name: dart-package-maintenance
description: |-
Guidelines for maintaining external Dart packages, covering versioning,
publishing workflows, and pull request management. Use when updating Dart
packages, preparing for a release, or managing collaborative changes in a
repository.
key_features:
- Versioning & CHANGELOG sync
- Publishing workflow guidelines
- Pull request management
---
# Dart Package Maintenance
Guidelines for maintaining Dart packages in alignment with the canonical Dart
team
[External Package Maintenance](https://github.com/dart-lang/sdk/blob/main/docs/External-Package-Maintenance.md)
specification.
## When to use this skill
Use this skill when:
- Updating Dart packages, preparing for a release, or managing collaborative
changes in a repository.
- Managing versioning, `CHANGELOG.md` synchronization, and publishing workflows.
- Ensuring published packages comply with Dart team conventions.
### When NOT to use (Abstention Guardrails)
Do NOT apply package maintenance version bumps or changelog updates when:
- **Internal / Private Packages**: Packages marked `publish_to: none` in
`pubspec.yaml` that are not published to `pub.dev` (e.g., application root
packages or internal monorepo tooling).
- **Repository-Root Files or Historical `CHANGELOG.md` Typos**: Pull requests
that only modify repository-level files outside a published package (such as
`.github/workflows/`, repo-root `SKILL.md`, or root docs in a monorepo) or
that only fix typos/formatting in historical `CHANGELOG.md` sections.
- **In-Flight PR Commits**: Intermediate commits on an active feature branch
where the version already carries an appropriate `-wip` suffix.
## Versioning
### Semantic Versioning
Dart packages use [semantic versioning](https://semver.org) with a
[pre-`1.0.0` variation](https://dart.dev/tools/pub/dependencies#caret-syntax)
where the version numbers are shifted to the right before a `1.0.0` release; see
also the
[`package:pub_semver` semantics](https://pub.dev/packages/pub_semver#semantics):
- **Packages at `1.0.0` or later**: `major.minor.patch`.
- **Packages not yet at `1.0.0`**: `0.major.minor`, where the second number is
bumped for breaking changes, such as `0.4.2` to `0.5.0-wip`, and the third
number is bumped for non-breaking features and bug fixes, such as `0.4.2` to
`0.4.3-wip`. Avoid `+1` build suffixes (in `package:pub_semver`, `0.4.2+1-wip`
parses `+1-wip` as build metadata rather than a `-wip` pre-release).
- **Recommendation**: Aim to publish `1.0.0` as soon as the package is stable.
Choose the version bump based on the impact of the change:
- **Major**: Breaking changes, including removing or renaming a `pubspec.yaml`
`executables` entry.
- **Minor**: New features and non-breaking API changes, such as introducing a
new class or adding a `pubspec.yaml` `executables` entry.
- **Patch**: Bug fixes, minimum `environment.sdk` or runtime `dependencies`
constraint updates, or any other change that does not impact calling code.
### Updating the Version
Whenever the code in the repo differs from the latest version published on
`pub.dev`, both `pubspec.yaml` and `CHANGELOG.md` must use a `-wip` version. We
bump to `-wip` on the _first_ change after a release, even if we don't plan on
publishing the code in that state or if the change doesn't impact consumers.
When opening or merging a PR, check the current version in `pubspec.yaml` and
`CHANGELOG.md`:
- **Currently at a published version**, such as `1.2.3`: Perform the appropriate
version bump, append `-wip` in `pubspec.yaml`, and add a matching
`## <version>-wip` section at the top of `CHANGELOG.md`.
- **Already at a `-wip` version**, such as `1.2.4-wip`: Compare the existing
`-wip` bump against the bump required for your change. If your change requires
a larger bump, such as from a _patch_ bump to a _minor_ bump when adding a
feature, update `pubspec.yaml` and rename the existing `## <version>-wip`
heading in `CHANGELOG.md` in place.
- **Not yet published to `pub.dev`**, at `0.1.0-wip`: Keep `0.1.0-wip` and the
`- Initial release.` entry without adding per-PR changelog entries until after
the first release.
### Updating `CHANGELOG.md`
- **User-visible changes**: Add an entry under the top `-wip` section.
- **Internal or non-user-visible changes**, such as safe refactorings, lint
cleanups, `test/`, `tool/`, or `README.md` updates, or `dev_dependencies` and
`dependency_overrides` changes:
- If your PR creates the new `-wip` section, add the `## <version>-wip`
heading with no bullet items below it.
- If the package is already at a `-wip` version, leave `CHANGELOG.md`
untouched and apply the `skip-changelog-check` PR label.
- **Follow-up edits to unreleased work**: If a subsequent PR modifies or reverts
an unreleased change in the current `-wip` section, such as bumping an SDK or
dependency constraint again before publishing, update or remove the existing
`-wip` bullet in place instead of adding a duplicate entry.
- **Already-published sections**: Never add new entries under an
already-published version heading, especially after merging `main` when a
release landed while your PR was open.
### Breaking Changes
- Evaluate the impact on dependent packages and internal projects.
- Consider running changes through internal presubmits if possible.
- Prefer incremental rollouts (e.g., new behavior as opt-in) to minimize
downstream breakage.
## Publishing Process
1. **Preparation**: Remove the `-wip` suffix from `pubspec.yaml` and
`CHANGELOG.md` in a dedicated pull request.
2. **Execution**: Run `dart pub publish` (or `flutter pub publish`) and resolve
all warnings and errors.
3. **Tagging**: Create and push a git tag for the published version:
- For single-package repos: `v1.2.3`
- For monorepos: `package_name-v1.2.3`
- Example: `git tag v1.2.3 && git push --tags`
## Pull Request Management
- **Commits**: Each PR should generally correspond to a single squashed commit
upon merging.
- **Shared History**: Once a PR is open, avoid force pushing to the branch.
- **Conflict Resolution**: Prefer merging `main` into the PR branch rather than
rebasing to resolve conflicts. This preserves the review history and comments.
- **Reviewing**: Add comments from the "Files changed" view to batch them.
- **Local Inspection**: Use `gh pr checkout <number>` to inspect changes locally
in your IDE.