Split-пакеты Flutter: три исхода одного промпта в Cursor

Три исхода у одного промпта в Cursor: агент оставит монолитные импорты package:flutter/material.dart, придумает пути к несуществующим пакетам или пройдёт split-миграцию по сценарию из репозитория навыков. Material и Cupertino во Flutter переехали в отдельные pub-пакеты, и без слоя навыков модель не знает новых точек входа; в посте автор собирает это в воспроизводимый pipeline.
Почему split-миграция — задача для агента, а не для памяти модели
Архитектурный сдвиг прост в описании и коварен в коде: дизайн-системы Material и Cupertino больше не живут внутри монолитного flutter SDK. Они ушли в standalone-пакеты material_ui и cupertino_ui с независимыми релизными циклами, меньшим core footprint и возможностью собирать headless UI только на package:flutter/widgets.dart.
Для coding agent это не «ещё один рефакторинг импортов». Модели обучены на старом мире: в обучающей выборке по-прежнему доминирует package:flutter/material.dart. Без внешнего слоя знаний агент будет уверенно генерировать устаревшие точки входа, даже если вы явно просите мигрировать проект.
Миграция зависимостей здесь не ручная замена строк, а сценарий делегирования агенту, где навыки подменяют дырявую память модели точными пошаговыми инструкциями.
dart-sdk-skills: навыки поверх Cursor и соседних агентов
Ответ на проблему не MCP и не единый CLI, а набор skill-файлов в открытом репозитории dart-sdk-skills. Репозиторий собран по спецификации Agent Skill (SKILL.md): версионные правила, API-матрицы и пошаговые инструкции для апгрейдов Dart и Flutter SDK. Цель — дать агенту точные знания и сценарии выполнения вместо угадывания по обрезанному обучению.
Сценарий задуман универсальным: Claude Code, Google Antigravity, Cursor, GitHub Copilot и Cline — любой coding agent, куда можно подключить skills. Отдельного «единственного правильного» агента нет.
Установка — три пути:
# Universal (Node / npx)
npx skills add RandalSchwartz/dart-sdk-skills -g
# Dart Skills CLI
skills add https://github.com/RandalSchwartz/dart-sdk-skills --global --all
Для Google Antigravity или ручной настройки — git clone репозитория и symlink на каталог skills/flutter-sdk-changelog в конфиге агента.
Для соло-разработчика на Cursor это практичный паттерн: один раз поставить skills глобально, дальше не копировать длинный контекст про split-миграцию в каждый чат.
Пять шагов pipeline после одного промпта
После установки skills агенту достаточно формулировки уровня «Migrate this project to the new split Material and Cupertino packages.» Дальше не магия промпта, а зафиксированная цепочка.
| Шаг | Действие |
|---|---|
| 1 | Анализ и data-driven transforms: dart fix --apply --code=migrate_design_widgets (правила из material_ui/lib/fix_data/) |
| 2 | Зависимости в pubspec.yaml: material_ui: ^1.1.0, cupertino_ui: ^1.0.1; минимум SDK — Flutter >=3.44.0, Dart ^3.12.0 |
| 3 | Переписывание импортов: package:flutter/material.dart → package:material_ui/material_ui.dart, package:flutter/cupertino.dart → package:cupertino_ui/cupertino_ui.dart |
| 4 | Localization delegates: GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, GlobalWidgetsLocalizations.delegate через экспорты standalone-пакетов |
| 5 | Верификация: dart analyze --fatal-infos и dart test |
Пакеты на pub.dev: material_ui ^1.1.0 (entrypoint package:material_ui/material_ui.dart), cupertino_ui ^1.0.1 (entrypoint package:cupertino_ui/cupertino_ui.dart).
Навыки здесь работают как слой между вашим промптом и пятью шагами: агент не выбирает путь наугад, а следует версионным инструкциям из репозитория.
Где агенты обычно ломают миграцию
Даже с skills остаются типичные точки отказа неподготовленного агента:
- Галлюцинации путей импорта — выдуманные package URI вместо реальных entrypoint'ов standalone-пакетов.
- Игнорирование automated fix rules — пропуск
dart fixс кодомmigrate_design_widgets, хотя анализатор уже знает правила трансформации. - Пропуск breaking changes в localization delegates — особенно
GlobalMaterialLocalizations, которые после split приходят из экспортовmaterial_ui/cupertino_ui, а не из монолитного SDK.
Цена ошибки не один красный импорт, а цепочка: агент «успешно» перепишет половину файлов, dart analyze упадёт на delegates, и следующие ходы уйдут на ручную правку того, что пошаговый сценарий уже описывает.
Без skills модель продолжит генерировать монолитные импорты и не знает, как выполнить новую split-миграцию.
Headless UI как следствие decoupling
После отделения design-system пакетов открывается второй сценарий для агентного цикла: приложение на чистом package:flutter/widgets.dart без подтягивания material_ui / cupertino_ui. Пример кастомного BrandButton показывает headless-слой, который раньше был сложнее отделить от Material-темы внутри монолита.
Для vibe coding это означает: skills закрывают не только миграцию legacy-проектов, но и дают агенту контекст, когда design system вообще не нужен в зависимостях.
Источники
- Automate Flutter's New Split Package Migration with AI Agent Skills — Dev.to, автор randalschwartz, 31 августа 2026
- RandalSchwartz/dart-sdk-skills — репозиторий agent skills (ссылка из поста)
- material_ui на pub.dev
- cupertino_ui на pub.dev