Перейти к содержимому
Экосистема AI Vibe

Разборы

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

Редакция 1 сентября 2026 г.

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.dartpackage:material_ui/material_ui.dart, package:flutter/cupertino.dartpackage: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 вообще не нужен в зависимостях.


Источники