mcpbeat

Monthly Release

flutter/monthly-release

Step-by-step guide for performing monthly releases of the Dart IntelliJ plugin.

1k tokens
context cost
the whole folder, loaded on every use
1
files
instructions only
0
copies elsewhere
how many repositories repackaged it
24
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/flutter/dart-intellij-third-party --skill monthly-release

The instruction itself

6 sections, as written by the author

Monthly Plugin Release Process

Use this skill when preparing, testing, validating, and publishing a new monthly release of the Dart IntelliJ plugin (dart-intellij-third-party).

> [!NOTE]

> Platform Compatibility Policy: untilBuild is intentionally omitted in gradle.properties and build.gradle.kts to maintain open-ended compatibility with future IDE builds without artificial version caps. Do NOT add untilBuild caps during monthly releases.


Release Process Checklist

1. Update Changelog for the Release

  • Branch: changelog (created off upstream/main)
  • Goal: Collect unreleased user-facing PRs into the release version header and set up a new ## Unreleased block.
  • Steps:
  • Review commits merged since the previous release (git log <last-release-commit>..upstream/main).
  • Identify missing user-facing PRs (bug fixes, new features, performance enhancements).
  • In third_party/CHANGELOG.md, rename ## Unreleased to ## <new-version> (e.g. ## 508.0.0).
  • Follow changelog formatting conventions:
  • Entries must strictly use descriptive, state-based phrases (typically starting with gerunds, nouns, or verbs like *Avoid* / *Support* / *Log* / *Prevent*) rather than starting with imperative verbs like *Fix* or *Add*.
  • Under ### Removed, do NOT repeat action verbs like "Remove" (e.g., - untilBuild restriction (#553)).
  • Add a fresh empty ## Unreleased section at the top of third_party/CHANGELOG.md with standard subheaders (### Added, ### Changed, ### Removed, ### Fixed).
  • Create PR (e.g. Update changelog for <version> (#<PR>)) and merge it to main.
  • Delete local and remote changelog branch upon merge (git branch -D changelog).

2. Build & Validate

  • Compilation & Structure Verification:
  • Ensure local main is checked out and updated (git fetch upstream && git checkout main && git reset --hard upstream/main), and navigate to the third_party directory (cd third_party).
  • Run compilation check:
     ./gradlew testClasses
  • Run plugin structure validation:
     ./gradlew verifyPluginStructure
  • Run unit tests:
     ./gradlew test
  • Build Prospective Release Zip Artifact:
  • Run the Gradle build with -PversionedName (from the third_party directory):
     ./gradlew buildPlugin -PversionedName
  • Behavior:
  • Gradle reads the release version (<version>) directly from CHANGELOG.md.
  • The -PversionedName flag instructs build.gradle.kts to output Dart-<version>-<commitHash>.zip.
  • Generated zip location: third_party/build/distributions/Dart-<version>-<commitHash>.zip.

3. Upload Release Candidate to Google Drive

4. Perform Manual Testing Across IDE Versions

Perform manual sanity checks across all supported IDE platform versions (IntelliJ IDEA Ultimate/Community and Android Studio):

  • Baseline Smoke Tests:
  • [ ] Create New Project: Verify new Dart project creation succeeds.
  • [ ] Open Existing Project: Verify existing Dart project opens cleanly.
  • [ ] Run & Debug: Run a Dart app/script, hit breakpoints, inspect variables.
  • Targeted Release Tests:
  • [ ] Verify all new features and bug fixes introduced in the release (e.g. LSP Go to Definition navigation, LSP diagnostics server error clearing, Windows path URI casing, DTD connection ping interval resilience).
  • [ ] Verify installation on latest EAP / Canary IDE builds without version incompatibility warnings.

How to use it

Copy the folder

Take flutter/monthly-release from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.