diff --git a/.agents/skills/api-and-typing/SKILL.md b/.agents/skills/api-and-typing/SKILL.md new file mode 100644 index 00000000..c2ebd81d --- /dev/null +++ b/.agents/skills/api-and-typing/SKILL.md @@ -0,0 +1,35 @@ +--- +name: api-and-typing +description: Use when defining or reviewing massCode renderer types that come from generated API clients or DTOs, especially when deciding whether to reuse existing API shapes, derive narrower local types, or introduce a UI-only model. +--- + +# API And Typing + +## Overview + +Для massCode API types считаются generated-first. Если данные пришли из `~/renderer/services/api/generated` или соответствуют DTO из `src/main/api/dto`, сначала используй существующие типы и utility typing, а не придумывай новый interface рядом с компонентом. + +## Core Rules + +- Ручные дубли API response types не пиши. +- Сначала ищи тип в `~/renderer/services/api/generated`. +- Если прямого export нет, выводи нужный shape через `Pick`, `Omit`, indexed access, `Parameters`, `ReturnType`, `Awaited`, `NonNullable`. +- Локальный тип допустим только как UI-only model, form model, derived display model или narrow type после нормального data narrowing. + +## Good Uses Of Local Types + +- Узкий renderer shape после того, как nullable API data уже очищена в одном месте. +- View-model для dashboard card, graph node, readonly row или editor-side helper, если он не равен transport shape. +- Тип аргумента, выводимый из существующего composable или API method через `Parameters` / `ReturnType`. + +## Bad Uses Of Local Types + +- Полный дубль `SnippetsResponse`, `NotesDashboardResponse`, `TagsResponse` и других generated types. +- Новый interface “для удобства”, если можно взять одну ветку из existing response type. +- Копирование DTO shape в renderer file, хотя он уже импортируемый. + +## Common Mistakes + +- Сначала придумать локальный interface, а потом уже искать generated type. +- Смешать transport shape и UI view-model без явного adapter step. +- Тащить глубоко в UI сырые nullable API поля вместо одного нормального normalization place. diff --git a/.agents/skills/architecture-standards/SKILL.md b/.agents/skills/architecture-standards/SKILL.md new file mode 100644 index 00000000..0eae35f0 --- /dev/null +++ b/.agents/skills/architecture-standards/SKILL.md @@ -0,0 +1,73 @@ +--- +name: architecture-standards +description: Use when working in massCode and you need repo-wide architecture rules, naming conventions, decomposition boundaries, or guidance on which massCode skill to load next. +--- + +# Architecture Standards + +## Overview + +Базовый принцип проекта: **YAGNI и простота прежде всего**. Не усложняй код ради гипотетических сценариев, не строй абстракции без повторяющейся потребности и не размывай границы между renderer, API и main. + +## Core Rules + +- Соблюдай разделение слоёв: + - Renderer: только UI, composables, вызовы `api.*` и `ipc.invoke(...)`. + - API: маршруты Elysia, DTO, orchestration и доступ к сервисам и данным приложения. + - Main: системные интеграции, IPC handlers, lifecycle и слой данных приложения. +- Data flow по умолчанию: Renderer → API / IPC → service / data layer → response. +- Vue-компоненты называй в `PascalCase`. +- TypeScript-файлы называй в `camelCase`. +- Composables именуй с префиксом `use`, а имя файла должно совпадать с экспортируемой функцией. + +## YAGNI Guardrails + +Признаки overengineering: + +- функция страхуется от кейса, которого реально не существует; +- factory или wrapper используется ровно в одном месте и не скрывает состояние; +- abstraction-for-abstraction без повторяющейся боли; +- константы, паттерны и конфигурации придуманы заранее, а не из реальной потребности. + +## Component Decomposition + +- Если компонент становится больше примерно `300` строк или держит `3+` несвязанных обязанности, дели его. +- Порядок разбиения: + 1. вынеси константы и статические данные; + 2. вынеси чистые функции в utils, только если это реально переиспользуется; + 3. перемести состояние и эффекты в composable; + 4. разбей шаблон на локальные child components. +- Не держи в `