From 971bafe19169bc3c928f3488184474bcf3a2dded Mon Sep 17 00:00:00 2001 From: Yuri Petrov <48598325+petrovyuri@users.noreply.github.com> Date: Tue, 27 Jan 2026 09:31:01 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B9=20skill=20f?= =?UTF-8?q?lutter=5Fdev=20=D0=B8=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D1=8F=20(#46)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .agent/skills/dist/flutter_dev.skill | Bin 0 -> 6066 bytes .agent/skills/flutter_dev/SKILL.md | 32 +++++++++++++++++ .../flutter_dev/references/codestyle.md | 34 ++++++++++++++++++ .../flutter_dev/references/documentation.md | 29 +++++++++++++++ .../skills/flutter_dev/references/gitflow.md | 26 ++++++++++++++ .../references/project_standards.md | 26 ++++++++++++++ .../references/project_structure.md | 33 +++++++++++++++++ .metadata | 12 +++---- 8 files changed, 186 insertions(+), 6 deletions(-) create mode 100644 .agent/skills/dist/flutter_dev.skill create mode 100644 .agent/skills/flutter_dev/SKILL.md create mode 100644 .agent/skills/flutter_dev/references/codestyle.md create mode 100644 .agent/skills/flutter_dev/references/documentation.md create mode 100644 .agent/skills/flutter_dev/references/gitflow.md create mode 100644 .agent/skills/flutter_dev/references/project_standards.md create mode 100644 .agent/skills/flutter_dev/references/project_structure.md diff --git a/.agent/skills/dist/flutter_dev.skill b/.agent/skills/dist/flutter_dev.skill new file mode 100644 index 0000000000000000000000000000000000000000..706b9a2371179158adb69a4dcccdf040b7012ef2 GIT binary patch literal 6066 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 literal 0 HcmV?d00001 diff --git a/.agent/skills/flutter_dev/SKILL.md b/.agent/skills/flutter_dev/SKILL.md new file mode 100644 index 0000000..76a6c38 --- /dev/null +++ b/.agent/skills/flutter_dev/SKILL.md @@ -0,0 +1,32 @@ +--- +name: flutter_dev +description: Скилл для разработки Flutter-приложений по стандартам компании Friflex. Используйте этот скилл при написании кода, создании новых фич, проведении ревью или настройке архитектуры проекта. Включает правила именования, структуру слоев (data/domain/presentation) и стандарты Git. +--- + +# Flutter Dev Skill (Friflex Standards) + +Этот скилл содержит набор правил и инструкций для разработки Flutter-приложений. Основная цель — соблюдение единого стиля кода, архитектурных подходов и процессов разработки. + +## Основные принципы + +1. **Архитектура**: Проект делится на слои: `data`, `domain` и `presentation`. +2. **Именование**: Интерфейсы всегда начинаются с префикса `I`. Экраны имеют постфикс `Screen`. +3. **Документация**: Весь публичный API должен быть покрыт документацией `///`. +4. **Git**: Коммиты и PR на русском языке по стандарту Conventional Commits. + +## Справочники (References) + +Для получения детальной информации по конкретным областям обращайтесь к следующим файлам: + +- [Правила именования и стиль кода](references/codestyle.md) — именование классов, методов, переменных и структура файлов. +- [Структура проекта и слои](references/project_structure.md) — детальное описание папок и взаимодействия между уровнями архитектуры. +- [Работа с Git и ветками](references/gitflow.md) — типы коммитов, именование веток и процессы релизов. +- [Документирование кода](references/documentation.md) — стандарты `///`, использование шаблонов и правила для TODO. +- [Стандарты проекта](references/project_standards.md) — управление сгенерированными файлами, `pubspec.lock` и сборка. + +## Когда использовать этот скилл + +- При создании новых классов или файлов (проверка именования). +- При реализации новой feature (выбор структуры папок). +- Перед созданием Pull Request (проверка соответствия стандартам). +- При возникновении вопросов по архитектурному взаимодействию слоев. diff --git a/.agent/skills/flutter_dev/references/codestyle.md b/.agent/skills/flutter_dev/references/codestyle.md new file mode 100644 index 0000000..dc2b547 --- /dev/null +++ b/.agent/skills/flutter_dev/references/codestyle.md @@ -0,0 +1,34 @@ +# Правила именования и стиль кода + +Мы придерживаемся рекомендаций **Effective Dart** и внутренних правил компании. + +## Именование + +### Интерфейсы +- Начинаются с заглавной буквы **I**. +- Пример: `IAuthRepository`, `IUserRepository`. + +### Классы и файлы +- **Классы**: `UpperCamelCase`. Приватные — с префиксом `_`. Должны содержать тип в конце (например, `UserEntity`). +- **Файлы**: `snake_case`. Структура: `[раздел]_[тип].dart`. Пример: `user_details_screen.dart`. + +### Репозитории +- Основная реализация — без постфикса (`AuthRepository`). +- Альтернативные реализации — с постфиксами: `Network`, `Local`, `Mock`. + +### Виджеты +- **Экраны**: Постфикс `Screen` (`ShopListScreen`). +- **Контент экрана**: Постфикс `View` (`ShopListView`). +- **Глобальные виджеты**: Префикс `App` (`AppButton`). +- В названии **не должно** быть слова `widget`. + +## Методы и переменные +- **Методы**: Начинаются с глагола (`fetch`, `put`, `update`, `delete`). Не должны содержать `And/Or`. +- **Переменные/Константы**: `lowerCamelCase`. + +## Структура класса (порядок элементов) +1. Конструкторы (default, named, factory). +2. Static элементы (methods, const fields). +3. Инстанс-поля (final, потом обычные; public, потом private). +4. Геттеры/Сеттеры. +5. Методы (overridden, public, protected, private). diff --git a/.agent/skills/flutter_dev/references/documentation.md b/.agent/skills/flutter_dev/references/documentation.md new file mode 100644 index 0000000..f89bb84 --- /dev/null +++ b/.agent/skills/flutter_dev/references/documentation.md @@ -0,0 +1,29 @@ +# Документирование кода + +## Документация (///) +- Оформляется с использованием `///` над объектом. +- Обязательна для всех классов, конструкторов, полей, методов и фабрик. +- Должна быть краткой, емкой и указывать на назначение. + +### Шаблоны +- **Классы**: Используйте `{@template name}` и `{@endtemplate}`. +- **Конструкторы**: Если один — `{@macro name}`. +- **Параметры**: Используйте ссылки в квадратных скобках `[paramName]`. + +### Пример метода +```dart +/// Метод для расчета температуры. +/// Принимает: +/// - [grad] - параметр для расчета. +/// Возвращает температуру в градусах. Null при ошибке. +int? calcTemperature({required int grad}) { ... } +``` + +## Комментарии (//) +- Используются только там, где код не очевиден. +- Не должны повторять то, что и так понятно из имен переменных или структуры. + +## TODO +- Формат определяется линтером. +- Указывать имя разработчика в контексте. +- Указывать ссылку на задачу в скобках, если она известна. diff --git a/.agent/skills/flutter_dev/references/gitflow.md b/.agent/skills/flutter_dev/references/gitflow.md new file mode 100644 index 0000000..af2ad7d --- /dev/null +++ b/.agent/skills/flutter_dev/references/gitflow.md @@ -0,0 +1,26 @@ +# Работа с Git и ветками + +## Pull Requests +- Язык описания — **Русский**. +- Описание должно содержать суть изменений, ссылку на задачу и список deprecated-кода. + +## Коммиты (Conventional Commits) +Типы: +- `feat`: Новая функциональность. +- `fix`: Исправление ошибок. +- `refactor`: Рефакторинг без смены логики. +- `docs`: Документация. +- `chore`: Инструменты, зависимости (`pubspec.yaml`). +- `test`, `build`, `ci`. + +## Именование веток +Формат: `тип/PRIME-номер_описание` +- `feat/PRIME-123_auth` +- `fix/PRIME-456_typo` + +## Процесс Feature-разработки +1. Создаем ветку от `main`. +2. Вносим изменения, делаем коммиты. +3. PR с названием по правилам (например, `feat(auth): PRIME-17 Добавить вход`). +4. После Review — **squash commit** в `main`. +5. Удаление ветки. diff --git a/.agent/skills/flutter_dev/references/project_standards.md b/.agent/skills/flutter_dev/references/project_standards.md new file mode 100644 index 0000000..4d2e422 --- /dev/null +++ b/.agent/skills/flutter_dev/references/project_standards.md @@ -0,0 +1,26 @@ +# Стандарты проекта + +## Управление файлами + +### Сгенерированные файлы (*.g.dart, *.freezed.dart) +- **Хранить в репозитории**. +- Это обеспечивает работоспособность `main` ветки сразу после чекаута без долгого ожидания генерации. +- Нужно контролировать конфликты при слиянии и периодически актуализировать. + +### pubspec.lock +- **Хранить** для приложений (applications). +- **Не хранить** для пакетов (packages). +- По умолчанию хранить GMS версию как базовую. + +## Сборка и запуск +- Используйте анализатор `friflex_lint_rules`. +- Перед созданием PR обязательно: + 1. Форматирование кода (`dart format`). + 2. Проверка анализатором на отсутствие ошибок. + +## Технологический стек +- Роутинг: `go_router`. +- State Manager: `flutter_bloc`. +- DI: Ручная реализация через `InheritedWidget`. +- API: `dio`. +- Ресурсы: `flutter_gen`. diff --git a/.agent/skills/flutter_dev/references/project_structure.md b/.agent/skills/flutter_dev/references/project_structure.md new file mode 100644 index 0000000..0e0fb37 --- /dev/null +++ b/.agent/skills/flutter_dev/references/project_structure.md @@ -0,0 +1,33 @@ +# Структура проекта + +Проект строится на основе фич и слоев. + +## Общая иерархия +- `/assets` — графические ресурсы. +- `/lib` — основной код. + - `/app` — глобальные настройки, интерфейсы и реализации. + - `/di` — конфигурация зависимостей. + - `/routing` — описание путей. + - `/features` — функциональные модули приложения. + - `/gen` — сгенерированный код. + +## Структура Feature-папки +Каждая фича делится на три слоя: + +1. **Data** (Поставщик данных): + - `/dto` — модели данных для API. + - `/repository` — реализация интерфейсов репозиториев. +2. **Domain** (Бизнес-логика): + - `/entity` — чистые модели для использования в UI. + - `/repository` — **интерфейсы** репозиториев. + - `/state` — управление состоянием (BLoC). + - `/service` — реализации бизнес-сервисов. +3. **Presentation** (Представление): + - `/screens` — виджеты экранов (`*Screen`). + - `/components` — переиспользуемые компоненты внутри фичи. + +## Правила взаимодействия +- **Data** → доступ к **Entity** (для маппинга), не знает про UI. +- **Domain** → не знает про **Data** (работает через интерфейсы) и **Presentation**. +- **Presentation** → работает через **Domain**, не знает про **Data**. +- Объекты внутри фичи инкапсулированы. Глобальные объекты выносятся в `/app`. diff --git a/.metadata b/.metadata index 2b7c01b..dedebf9 100644 --- a/.metadata +++ b/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: "be698c48a6750c8cb8e61c740ca9991bb947aba2" + revision: "66dd93f9a27ffe2a9bfc8297506ce066ff51265f" channel: "stable" project_type: app @@ -13,11 +13,11 @@ project_type: app migration: platforms: - platform: root - create_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2 - base_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2 - - platform: android - create_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2 - base_revision: be698c48a6750c8cb8e61c740ca9991bb947aba2 + create_revision: 66dd93f9a27ffe2a9bfc8297506ce066ff51265f + base_revision: 66dd93f9a27ffe2a9bfc8297506ce066ff51265f + - platform: web + create_revision: 66dd93f9a27ffe2a9bfc8297506ce066ff51265f + base_revision: 66dd93f9a27ffe2a9bfc8297506ce066ff51265f # User provided section