flutter/monthly-release
Step-by-step guide for performing monthly releases of the Dart IntelliJ plugin.
npx skills add https://github.com/flutter/dart-intellij-third-party --skill monthly-release
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.
changelog (created off upstream/main)## Unreleased block.git log <last-release-commit>..upstream/main).third_party/CHANGELOG.md, rename ## Unreleased to ## <new-version> (e.g. ## 508.0.0).### Removed, do NOT repeat action verbs like "Remove" (e.g., - untilBuild restriction (#553)).## Unreleased section at the top of third_party/CHANGELOG.md with standard subheaders (### Added, ### Changed, ### Removed, ### Fixed).Update changelog for <version> (#<PR>)) and merge it to main.changelog branch upon merge (git branch -D changelog).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). ./gradlew testClasses
./gradlew verifyPluginStructure
./gradlew test
-PversionedName (from the third_party directory): ./gradlew buildPlugin -PversionedName
<version>) directly from CHANGELOG.md.-PversionedName flag instructs build.gradle.kts to output Dart-<version>-<commitHash>.zip.third_party/build/distributions/Dart-<version>-<commitHash>.zip.Dart-<version>-<commitHash>.zip to the designated Google Drive folder for team testing prior to public Marketplace release.Perform manual sanity checks across all supported IDE platform versions (IntelliJ IDEA Ultimate/Community and Android Studio):
Take flutter/monthly-release from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
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.