# Библиотеки: требования к выносу переиспользуемого кода

Когда выносить в `libs/`:
- нужно минимум в 2 сервисах (повторение уже есть/неизбежно);
- нужен единый стандарт поведения (логирование/метрики/otel/клиенты);
- контракт и поведение должны быть одинаковыми по системе.

Когда НЕ выносить:
- специфично для одного сервиса/домена;
- API “сырой” и будет постоянно ломаться;
- получается “бог-утилита” без чёткой ответственности.

Правила:
- библиотека должна иметь:
    - чёткое назначение,
    - минимальный публичный API,
    - README (контракты + минимальные примеры),
    - правила ошибок и совместимость версий.

## Библиотеки: проектирование и зависимости

Правила:
- Не “утаскивать” фреймворки внутрь бизнес-логики без необходимости.
- Публичный API минимален и стабилен.
- Зависимости осознанные: не тащить тяжёлое ради мелочи; не затягивать инфраструктурные SDK в доменные библиотеки.

## Библиотеки: совместимость и изменение API

Правила:
- По умолчанию изменения обратно совместимы.
- Breaking change допускается только с планом миграции; по возможности — временная поддержка old+new; зафиксировать в changelog/ADR, создать Issue на миграцию.

## Структура `libs/` (общая)

Назначение: в `libs/*` выносим только то, что реально переиспользуется и должно вести себя одинаково в разных сервисах/приложениях.

Рекомендуемые папки:
- `libs/go/*` — общие Go библиотеки.
- `libs/vue/*` — общие Vue-части (SFC-компоненты, composables, плагины, Pinia-plugins).
- `libs/ts/*` — общие TS-утилиты без привязки к Vue (типы, helpers, runtime-валидация, http-клиенты, i18n helpers).
- `libs/js/*` — только если по причинам совместимости нужен JS; по умолчанию предпочтителен `libs/ts/*`.

Запрещено:
- класть в `libs/*` бизнес-логику конкретного домена/продукта;
- тащить тяжёлые зависимости ради “пары функций”;
- делать “god-lib” без чёткой ответственности и владельца.

Профильные требования по языкам:
- Go: `docs/design-guidelines/go/libraries.md`.
- Vue/TS: `docs/design-guidelines/vue/libraries.md`.
