flutter-mcp-toolkit repo maintainer
Golden path for this repository (not end-user Flutter apps). Prefer
release-please on main; use manual steps only when the Release PR path is blocked.
When to use
- Cutting a release or promoting
## [Unreleased] in CHANGELOG.md
- Adding/editing contributor docs, AI agent install docs, or plugin skills
- Verifying version sync or skill asset drift before merge
- Troubleshooting release-please,
release.yml binaries, or install.sh version pins
Version touchpoints (must match root VERSION)
After any version bump: run make sync-version, then make sync-skills, then make check-contracts (includes check_version_sync.sh and check_skill_assets_drift.sh). tool/release/sync_version.sh derives all version touchpoints from root VERSION.
Harness / video (separate repos): flutter_harness, flutter_mcp_video — not maintained in this plugin tree. Three-repo layout: flutter_harness/docs/RELATED_REPOS.md.
Changelog workflow
- Add user-facing notes under
## [Unreleased] in CHANGELOG.md (Keep a Changelog sections: Added, Changed, Fixed, Documentation).
- Use conventional commit titles on
main (feat:, fix:, docs:) so release-please can aggregate.
- Do not edit the plan file in
.cursor/plans/.
Markdown lint (MD052)
Keep a Changelog requires version headings like ## [3.0.1]. Linters treat [3.0.1] as an undefined reference link (MD052: "No link definition found").
- Do not remove the file-top
<!-- markdownlint-disable MD052 --> in CHANGELOG.md (release-please must keep it when prepending sections).
- In bullet text, use backticks for code identifiers:
`AgentCallEntry`, not [AgentCallEntry].
- Before merge:
bash tool/contracts/check_changelog_markdown.sh (also in make check-contracts).
Automated release (preferred)
flowchart LR
main[merge_to_main] --> rp[release-please.yml]
rp --> pr[Release_PR]
pr --> sync[release_pr_sync_versions.yml]
pr --> assets[release_pr_sync_skills.yml]
pr --> tag[vX_Y_Z_tag]
tag --> rel[release.yml_binaries]
tag --> pub[pub_publish.yml_pubdev]
- Merge PRs to
main with conventional commits.
- Wait for Release PR from release-please.yml.
- version train: release_pr_sync_versions.yml runs
tool/release/sync_version.sh on Release PRs and commits any drift from root VERSION.
- skill assets: release_pr_sync_skills.yml auto-commits
skill_assets.g.dart on Release PRs when drift is detected; posts a checklist comment on PR open. If skill-assets-drift still fails, run make sync-skills locally and push.
- Review VERSION, CHANGELOG, pubspecs, plugin pins in that PR → merge.
- release-please creates
vX.Y.Z + GitHub release notes.
- release.yml asserts tag ==
VERSION, then attaches flutter_mcp_* tarballs (does not overwrite release body).
- pub_publish.yml publishes pub.dev packages in dependency order through OIDC:
flutter_mcp_toolkit_core → flutter_mcp_toolkit_capability_kernel → flutter_mcp_toolkit_capability_core → mcp_toolkit.
Before automated pub.dev publishing can run, each package must already have a first manual publish and pub.dev Admin must enable GitHub Actions publishing for this repository with tag pattern v{{version}}. Use GitHub environment pub.dev with required reviewers.
Config: release-please-config.json.
Manual release (fallback)
Use when release-please is unavailable or you must ship from a branch:
- Move
## [Unreleased] bullets into ## [X.Y.Z] (add date), leave empty ## [Unreleased].
- Update
VERSION to X.Y.Z.
make sync-version to derive all version touchpoints and .release-please-manifest.json.
make sync-skills (required whenever plugin manifests or skills change).
make check-contracts
- Commit:
chore: release X.Y.Z
- Optional pub.dev preflight:
make publish-pub-dry-run.
- Tag:
git tag vX.Y.Z and push tag (triggers binary and pub.dev workflows).
Build artifacts locally: make release-artifacts or bash tool/release/build_release_artifacts.sh --version X.Y.Z.
Publish pub.dev packages locally only as a fallback: make publish-pub.
Docs map (single sources of truth)
Avoid duplicating install tables in README — link to overview.
Skills maintenance
- Canonical skills:
plugin/skills/ (repo root skills/ → symlink for npx skills).
- New bundled skill: add
plugin/skills/<id>/SKILL.md, append id to expectedSkillIds in build_skill_assets.dart, run make sync-skills.
- Local Cursor copy:
.cursor/skills/<id>/ may symlink to plugin/skills/<id>/.
- Platform dogfood skills:
flutter-mcp-toolkit-maintain-web, flutter-mcp-toolkit-maintain-macos, flutter-mcp-toolkit-dogfood-iterations.
HyperFrames promo (flutter_mcp_video repo)
Video skill and projects live in flutter_mcp_video (skills/hyperframes-video/, projects/video-projects/<id>/). Not bundled in toolkit make sync-skills.
When shipping a promo there: edit the video repo; run bash tool/check_doc_paths.sh in that repo before merge. Toolkit repo only hosts shared brand assets under plugin/assets/ (symlink targets for v7-weaver).
IntentCall consumer maintainer gate
When changing IntentCall consumer integration in mcp_flutter:
- Append
flutter-mcp-toolkit-intentcall-migration to expectedSkillIds in build_skill_assets.dart if not already present.
make sync-skills — commit skill_assets.g.dart with skill edits.
bash tool/contracts/check_intentcall_skills_grep.sh — no legacy call-entry symbol outside migration skill.
cd mcp_server_dart && dart test test/contract/
flutter-mcp-toolkit migrate agent-entries --check flutter_test_app/lib (expect exit 0)
- Keep canonical IntentCall design links pointed at the IntentCall repository; keep this repo focused on hosted dependency and regression proof.
Pre-merge checklist
1---2name: flutter-mcp-toolkit-repo-maintainer3description: Maintain mcp_flutter releases, CHANGELOG, version pins, docs, and CI. Use when cutting a release, editing CHANGELOG.md, bumping VERSION, running release-please, sync-skills, check-contracts, or updating install/docs for npx skills and flutter-mcp-toolkit init.4---56<!-- @FMT_MODE_PRELUDE -->78# flutter-mcp-toolkit repo maintainer910Golden path for **this repository** (not end-user Flutter apps). Prefer11release-please on `main`; use manual steps only when the Release PR path is blocked.1213## When to use1415- Cutting a release or promoting `## [Unreleased]` in CHANGELOG.md16- Adding/editing contributor docs, AI agent install docs, or plugin skills17- Verifying version sync or skill asset drift before merge18- Troubleshooting release-please, `release.yml` binaries, or `install.sh` version pins1920## Version touchpoints (must match root `VERSION`)2122| File | Field |23| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- |24| [VERSION](https://github.com/Arenukvern/mcp_flutter/blob/main/VERSION) | repo pin |25| [plugin/EXPECTED_SERVER_VERSION](https://github.com/Arenukvern/mcp_flutter/blob/main/plugin/EXPECTED_SERVER_VERSION) | installer pin |26| [packages/core/lib/src/runtime_version.dart](https://github.com/Arenukvern/mcp_flutter/blob/main/packages/core/lib/src/runtime_version.dart) | `kFlutterMcpVersion` (`x-release-please-version`) |27| [packages/server_capability_core/lib/src/fmt_capability.dart](https://github.com/Arenukvern/mcp_flutter/blob/main/packages/server_capability_core/lib/src/fmt_capability.dart) | `version` getter |28| [mcp_server_dart/pubspec.yaml](https://github.com/Arenukvern/mcp_flutter/blob/main/mcp_server_dart/pubspec.yaml) | `version:` |29| [mcp_toolkit/pubspec.yaml](https://github.com/Arenukvern/mcp_flutter/blob/main/mcp_toolkit/pubspec.yaml) | `version:` |30| [packages/core/pubspec.yaml](https://github.com/Arenukvern/mcp_flutter/blob/main/packages/core/pubspec.yaml) | `version:` |31| [packages/server_capability_kernel/pubspec.yaml](https://github.com/Arenukvern/mcp_flutter/blob/main/packages/server_capability_kernel/pubspec.yaml) | `version:` + same-train dependency constraints |32| [packages/server_capability_core/pubspec.yaml](https://github.com/Arenukvern/mcp_flutter/blob/main/packages/server_capability_core/pubspec.yaml) | `version:` + same-train dependency constraints |33| [plugin/.cursor-plugin/plugin.json](https://github.com/Arenukvern/mcp_flutter/blob/main/plugin/.cursor-plugin/plugin.json) | `version` |34| [plugin/.codex-plugin/plugin.json](https://github.com/Arenukvern/mcp_flutter/blob/main/plugin/.codex-plugin/plugin.json) | `version` |35| [plugin/.claude-plugin/plugin.json](https://github.com/Arenukvern/mcp_flutter/blob/main/plugin/.claude-plugin/plugin.json) | `version` |36| [.claude-plugin/marketplace.json](https://github.com/Arenukvern/mcp_flutter/blob/main/.claude-plugin/marketplace.json) | `plugins[0].version` |37| [.release-please-manifest.json](https://github.com/Arenukvern/mcp_flutter/blob/main/.release-please-manifest.json) | `"."` key |38| [mcp_server_dart/lib/src/skill_assets.g.dart](https://github.com/Arenukvern/mcp_flutter/blob/main/mcp_server_dart/lib/src/skill_assets.g.dart) | **generated** — embeds `plugin/.cursor-plugin/plugin.json`, `plugin/.codex-plugin/plugin.json`, `plugin/mcp.json`, and all `plugin/skills/*/SKILL.md` |3940After any version bump: run `make sync-version`, then `make sync-skills`, then `make check-contracts` (includes `check_version_sync.sh` and `check_skill_assets_drift.sh`). `tool/release/sync_version.sh` derives all version touchpoints from root `VERSION`.4142**Harness / video (separate repos):** [flutter_harness](https://github.com/Arenukvern/flutter_harness), [flutter_mcp_video](https://github.com/Arenukvern/flutter_mcp_video) — not maintained in this plugin tree. Three-repo layout: [flutter_harness/docs/RELATED_REPOS.md](https://github.com/Arenukvern/flutter_harness/blob/main/docs/RELATED_REPOS.md).4344## Changelog workflow45461. Add user-facing notes under `## [Unreleased]` in [CHANGELOG.md](https://github.com/Arenukvern/mcp_flutter/blob/main/CHANGELOG.md) (Keep a Changelog sections: Added, Changed, Fixed, Documentation).472. Use conventional commit titles on `main` (`feat:`, `fix:`, `docs:`) so release-please can aggregate.483. Do **not** edit the plan file in `.cursor/plans/`.4950### Markdown lint (MD052)5152Keep a Changelog **requires** version headings like `## [3.0.1]`. Linters treat `[3.0.1]` as an undefined **reference link** (MD052: "No link definition found").5354- **Do not remove** the file-top `<!-- markdownlint-disable MD052 -->` in CHANGELOG.md (release-please must keep it when prepending sections).55- In bullet text, use **backticks** for code identifiers: `` `AgentCallEntry` ``, not `[AgentCallEntry]`.56- Before merge: `bash tool/contracts/check_changelog_markdown.sh` (also in `make check-contracts`).5758## Automated release (preferred)5960```mermaid61flowchart LR62 main[merge_to_main] --> rp[release-please.yml]63 rp --> pr[Release_PR]64 pr --> sync[release_pr_sync_versions.yml]65 pr --> assets[release_pr_sync_skills.yml]66 pr --> tag[vX_Y_Z_tag]67 tag --> rel[release.yml_binaries]68 tag --> pub[pub_publish.yml_pubdev]69```70711. Merge PRs to `main` with conventional commits.722. Wait for **Release PR** from [release-please.yml](https://github.com/Arenukvern/mcp_flutter/blob/main/.github/workflows/release-please.yml).733. **version train:** [release_pr_sync_versions.yml](https://github.com/Arenukvern/mcp_flutter/blob/main/.github/workflows/release_pr_sync_versions.yml) runs `tool/release/sync_version.sh` on Release PRs and commits any drift from root `VERSION`.744. **skill assets:** [release_pr_sync_skills.yml](https://github.com/Arenukvern/mcp_flutter/blob/main/.github/workflows/release_pr_sync_skills.yml) auto-commits `skill_assets.g.dart` on Release PRs when drift is detected; posts a checklist comment on PR open. If **skill-assets-drift** still fails, run `make sync-skills` locally and push.755. Review VERSION, CHANGELOG, pubspecs, plugin pins in that PR → merge.766. release-please creates `vX.Y.Z` + GitHub release notes.777. [release.yml](https://github.com/Arenukvern/mcp_flutter/blob/main/.github/workflows/release.yml) asserts tag == `VERSION`, then attaches `flutter_mcp_*` tarballs (does not overwrite release body).788. [pub_publish.yml](https://github.com/Arenukvern/mcp_flutter/blob/main/.github/workflows/pub_publish.yml) publishes pub.dev packages in dependency order through OIDC: `flutter_mcp_toolkit_core` → `flutter_mcp_toolkit_capability_kernel` → `flutter_mcp_toolkit_capability_core` → `mcp_toolkit`.7980Before automated pub.dev publishing can run, each package must already have a first manual publish and pub.dev Admin must enable GitHub Actions publishing for this repository with tag pattern `v{{version}}`. Use GitHub environment `pub.dev` with required reviewers.8182Config: [release-please-config.json](https://github.com/Arenukvern/mcp_flutter/blob/main/release-please-config.json).8384## Manual release (fallback)8586Use when release-please is unavailable or you must ship from a branch:87881. Move `## [Unreleased]` bullets into `## [X.Y.Z]` (add date), leave empty `## [Unreleased]`.892. Update `VERSION` to `X.Y.Z`.903. `make sync-version` to derive all version touchpoints and `.release-please-manifest.json`.914. `make sync-skills` (required whenever plugin manifests or skills change).925. `make check-contracts`936. Commit: `chore: release X.Y.Z`947. Optional pub.dev preflight: `make publish-pub-dry-run`.958. Tag: `git tag vX.Y.Z` and push tag (triggers binary and pub.dev workflows).9697Build artifacts locally: `make release-artifacts` or `bash tool/release/build_release_artifacts.sh --version X.Y.Z`.98Publish pub.dev packages locally only as a fallback: `make publish-pub`.99100## Docs map (single sources of truth)101102| Topic | Canonical doc |103| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |104| End-user agent install | [docs/ai_agents/overview.mdx](https://github.com/Arenukvern/mcp_flutter/blob/main/docs/ai_agents/overview.mdx) |105| `npx skills` + lockfile | overview § Install via `npx skills`; [.skills.json.example](https://github.com/Arenukvern/mcp_flutter/blob/main/.skills.json.example) |106| Contributor / releases | [docs/contributing/contribution_guide.mdx](https://github.com/Arenukvern/mcp_flutter/blob/main/docs/contributing/contribution_guide.mdx) |107| Plugin layout | [plugin/README.md](https://github.com/Arenukvern/mcp_flutter/blob/main/plugin/README.md) |108| Marketplace copy SSOT | [docs/ai_agents/marketplace_copy.yaml](https://github.com/Arenukvern/mcp_flutter/blob/main/docs/ai_agents/marketplace_copy.yaml) |109| Distribution / stores | [docs/ai_agents/marketplace_distribution.mdx](https://github.com/Arenukvern/mcp_flutter/blob/main/docs/ai_agents/marketplace_distribution.mdx) |110| Store submission runbook | [docs/contributing/marketplace_submission_runbook.mdx](https://github.com/Arenukvern/mcp_flutter/blob/main/docs/contributing/marketplace_submission_runbook.mdx) |111| Skill bodies | `plugin/skills/<id>/SKILL.md` → `make sync-skills` |112113Avoid duplicating install tables in README — link to overview.114115## Skills maintenance116117- Canonical skills: `plugin/skills/` (repo root `skills/` → symlink for `npx skills`).118- New bundled skill: add `plugin/skills/<id>/SKILL.md`, append `id` to `expectedSkillIds` in [build_skill_assets.dart](https://github.com/Arenukvern/mcp_flutter/blob/main/mcp_server_dart/tool/build_skill_assets.dart), run `make sync-skills`.119- Local Cursor copy: `.cursor/skills/<id>/` may symlink to `plugin/skills/<id>/`.120- Platform dogfood skills: `flutter-mcp-toolkit-maintain-web`, `flutter-mcp-toolkit-maintain-macos`, `flutter-mcp-toolkit-dogfood-iterations`.121122### HyperFrames promo (flutter_mcp_video repo)123124Video skill and projects live in **[flutter_mcp_video](https://github.com/Arenukvern/flutter_mcp_video)** (`skills/hyperframes-video/`, `projects/video-projects/<id>/`). Not bundled in toolkit `make sync-skills`.125126When shipping a promo there: edit the video repo; run `bash tool/check_doc_paths.sh` in that repo before merge. Toolkit repo only hosts shared brand assets under `plugin/assets/` (symlink targets for v7-weaver).127128## IntentCall consumer maintainer gate129130When changing IntentCall consumer integration in `mcp_flutter`:1311321. Append `flutter-mcp-toolkit-intentcall-migration` to `expectedSkillIds` in `build_skill_assets.dart` if not already present.1332. `make sync-skills` — commit `skill_assets.g.dart` with skill edits.1343. `bash tool/contracts/check_intentcall_skills_grep.sh` — no legacy call-entry symbol outside migration skill.1354. `cd mcp_server_dart && dart test test/contract/`1365. `flutter-mcp-toolkit migrate agent-entries --check flutter_test_app/lib` (expect exit 0)1376. Keep canonical IntentCall design links pointed at the IntentCall repository; keep this repo focused on hosted dependency and regression proof.138139## Pre-merge checklist140141- [ ] `make check-contracts`142- [ ] `make sync-skills` if `plugin/skills/` or `plugin/*-plugin/plugin.json` changed143- [ ] CHANGELOG `[Unreleased]` updated for user-visible changes144- [ ] No secrets in committed configs