# ITCase Config

Набор готовых конфигураций для инструментов разработки, используемых в проектах ITCase. Этот пакет содержит стандартизированные настройки для commitlint, lint-staged, PostCSS, semantic-release и SVGR.

## Установка

```bash
npm install --save-dev @itcase/config
```

## Доступные конфигурации

Пакет предоставляет следующие конфигурации:

- **Commitlint** — проверка формата сообщений коммитов
  - `createCommitlintProjectConfig(SCOPES)` — для разработки
  - `createCommitlintReleaseConfig(SCOPES)` — для релизных веток
  - `commitlint/commitizenAdapter.js` — адаптер Commitizen (type → scope → subScope → subject)

- **Smart commit** — CLI `smart-commit` (Cursor Agent → preview → commit)

- **Husky** — общие git-хуки в `husky-hooks/`
  - В git только `.husky/config`; обёртки и `_run.sh` создаёт `itcase-config-husky-install` при `npm i`

- **Lint-staged** — запуск линтеров для измененных файлов
  - `lint-staged/index.js` — базовая конфигурация
  - `lint-staged-ts/index.js` — с проверкой типов TypeScript

- **PostCSS** — обработка CSS
  - `postcss/index.js` — стандартная конфигурация
  - `postcss/nextVite.js` — для Next.js/Vite проектов

- **Semantic Release** — автоматическое управление версиями
  - `semantic-release/config.js` — конфигурация
  - `semantic-release/index.js` — стандартная конфигурация
  - `semantic-release/indexLerna.js` — для Lerna монорепозиториев
  - `semantic-release/indexVSMarketplace.js` — для VS Code расширений

- **SVGR** — преобразование SVG в React компоненты
  - `svgr/index.js` — базовая конфигурация
  - `svgr/webpack.js` — интеграция с Webpack

## Подключение Commitlint

1. Установите зависимости в проекте:

```bash
npm install --save-dev @itcase/config @commitlint/cli @commitlint/config-conventional conventional-changelog-conventionalcommits
```

2. Создайте в корне проекта файл `commitlint.config.mjs`:

```js
import {
  createCommitlintProjectConfig,
  createCommitlintReleaseConfig,
} from '@itcase/config/commitlint/index.js'

const SCOPES = {
  auth: [],
  common: [],
  dashboard: [],
  logbook: ['events', 'filters'],
  map: ['layers', 'controls', 'markers'],
  report: ['monitoring', 'analytics', 'export', 'filters'],
  other: [],
}

export default process.env.RELEASE_BRANCH === 'true'
  ? createCommitlintReleaseConfig(SCOPES)
  : createCommitlintProjectConfig(SCOPES)
```

3. Git-хуки подключаются из `husky-hooks/` — см. раздел **Подключение Husky** ниже.

4. **(Опционально)** Интерактивное оформление коммитов через Commitizen. Установите:

```bash
npm install --save-dev commitizen @commitlint/cz-commitlint
```

Добавьте файл `.cz.json`

```json
{ "path": "@itcase/config/commitlint/commitizenAdapter.js" }
```

## Smart commit

`smart-commit` — Cursor Agent (`ask`) планирует коммиты по `SCOPES`, печатает сообщения, спрашивает `[y/N]`.

```text
[yellow pixel banana animation]
Drafting commit messages… (12s)

Commits:
  • feat(other): add smart-commit cli
  • docs(docs): document smart-commit usage

Create 2 commit(s)? [y/N]
```

Нужны Cursor Agent + логин (`agent login` / `CURSOR_API_KEY`) и `commitlint.config.*` с SCOPES.

В проекте с `@itcase/config` добавьте в `package.json`:

```json
{
  "scripts": {
    "smart-commit": "smart-commit",
    "smart-commit:dry": "smart-commit --dry-run"
  }
}
```

Запуск:

```bash
npm run smart-commit:dry
npm run smart-commit
make smart-commit-dry   # если есть Makefile
make smart-commit
```

В самом `@itcase/config` (разработка пакета):

```bash
npm run smart-commit:dry
npm run smart-commit:yes
make smart-commit-dry
```

Если `agent` нет в PATH (`command not found`):

```bash
curl https://cursor.com/install -fsS | bash
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
agent --version
agent login
```

CLI ставится в `~/.local/bin`. Логин в Cursor IDE этот CLI не авторизует.

Без браузера (CI): `export CURSOR_API_KEY=…` вместо `agent login`.

Обновление CLI: `agent update`.

Пока Agent думает, в терминале крутится pixel-анимация dancing banana + статус `(Ns)` на одной области экрана (`log-update`). Для полного лога: `npm run smart-commit -- --verbose --dry-run`.

> **Важно:** в npm есть одноимённый пакет `smart-commit`. Используйте `npm run smart-commit` из проекта с `@itcase/config` — bin берётся из `node_modules`. `npx smart-commit` без локальной установки может подтянуть чужой пакет; CLI перед запуском проверяет, что выполняется именно `@itcase/config`.

## Подключение Husky

В git кладите только `.husky/config`. Обёртки хуков и `_run.sh` создаёт `itcase-config-husky-install` при `npm i`. Логика хуков живёт в `@itcase/config/husky-hooks`.

```json
{
  "scripts": {
    "prepare": "husky && itcase-config-husky-install"
  }
}
```

Пока бинарь ещё не в установленной версии пакета:

```json
{
  "scripts": {
    "prepare": "husky && node node_modules/@itcase/config/husky-hooks/install-launcher.js"
  }
}
```

В `.gitignore`:

```gitignore
.husky/*
!.husky/config
```

`itcase-config-husky-install` копирует `_run.sh`, создаёт обёртки и при отсутствии восстанавливает `config` из `config.example`. Свои полные хуки не перезаписывает. `npm i --ignore-scripts` файлы не создаст.

`.husky/config`:

```bash
PROTECTED_BRANCHES="master"
RELEASE_BRANCHES="master"
```

Образец: `husky-hooks/config.example`.
