# Конфиг golangci-lint (схема v2; устанавливается через `task setup`). # # Базовый набор v2 (`default: standard`) — errcheck, govet, ineffassign, # staticcheck, unused. Сверх него включены линтеры, которые механизируют # конвенции из docs/conventions/*: то, что проверяет правило, не должно # оставаться прозой в конвенциях и в промптах ревью (см. # .claude/skills/review-pipeline/references/promote.md). version: "2" linters: enable: - misspell # docs/conventions/logging.md: msg — константная категория, данные — в # полях, единый стиль ключ-значение. - sloglint # docs/conventions/logging.md (без fmt.Println), config.md (конфиг только # из TOML, env не используем), database.md (время — только store.Now()). - forbidigo # docs/conventions/errors.md: сравнение ошибок через errors.Is/As, а не # `err == ErrX` и не приведением типа. - errorlint # docs/conventions/errors.md: ошибки — только stdlib. - depguard settings: sloglint: no-mixed-args: true # не мешать пары «ключ-значение» с slog.Attr kv-only: true # принятый в проекте стиль вызова static-msg: true # msg — константа, без fmt.Sprintf и интерполяции # key-naming-case НЕ включаем: словарь полей намеренно смешанный — # доменные поля snake_case, системные домены с точкой (`http.method`, # `ext.service`, адаптация OpenTelemetry). См. logging.md, «Поля». forbidigo: forbid: - pattern: ^fmt\.Print.*$ msg: логируем через slog, в stdout напрямую не пишем (docs/conventions/logging.md) - pattern: ^os\.Getenv$ msg: конфигурация только из TOML, env для конфига не используем (docs/conventions/config.md) - pattern: ^time\.Now$ msg: время генерирует store.Now() (UTC, единая точка) — docs/conventions/database.md errorlint: # Обёртка вида fmt.Errorf("%w: %v", ErrSentinel, err) осознанна: sentinel # раскрываем для errors.Is, причину — намеренно нет (errors.md, «%w vs %v»). errorf: false asserts: true comparison: true depguard: rules: main: deny: - pkg: github.com/pkg/errors desc: ошибки — только stdlib errors + fmt.Errorf (docs/conventions/errors.md) - pkg: github.com/cockroachdb/errors desc: стек-трейсы избыточны, контекст несёт slog (docs/conventions/errors.md) exclusions: generated: lax presets: - comments - common-false-positives - legacy - std-error-handling paths: - third_party$ - builtin$ - examples$ rules: # CLI — другая поверхность: печатает результат в stdout и меряет # длительность своей работы, это не логирование и не время в БД. - path: ^cmd/ linters: [forbidigo] # Интеграционные тесты берут креды внешних сервисов из окружения — # это не конфигурация приложения. - path: _test\.go$ text: os.Getenv linters: [forbidigo] # Единые точки генерации id и времени — им time.Now по определению можно. - path: ^internal/(ident|store)/ text: time.Now linters: [forbidigo] formatters: exclusions: generated: lax paths: - third_party$ - builtin$ - examples$