.golangci.yml
version: "2"
# errcheck stays ENABLED. We exclude only specific method signatures that are
# universally safe to ignore (defer close on read paths, rollback-after-commit,
# test helpers). Real production error paths must still be checked.
linters:
default: standard
enable:
- cyclop
- depguard
settings:
cyclop:
max-complexity: 11
package-average: 8.0
errcheck:
exclude-functions:
# defer Close() on read-only or already-errored resources — the open
# error and read errors are what matter; close errors on these paths
# are non-actionable.
- (*database/sql.DB).Close
- (*database/sql.Rows).Close
- (*database/sql.Stmt).Close
# Rollback after a successful Commit is a no-op; rollback on the error
# path can't meaningfully recover either. Idiomatic pattern:
# `defer tx.Rollback()` right after `BeginTx`.
- (*database/sql.Tx).Rollback
# Our wrapper types around database/sql — same semantics as above.
- (*skraak/db.LoggedTx).Rollback
- (*skraak/db.LoggedStmt).Close
# Test cleanup — failures don't affect test validity.
- os.Remove
- os.RemoveAll
depguard:
rules:
# Package dependency rules — see CLAUDE.md "Package Organization".
# A package may only import packages BELOW it in the layered graph:
# cmd → tools, tools/calls, tools/import, tui, db, config, datafile, audio, wav, spectrogram, astro, mapping, utils
# tools/calls → db, audio, wav, spectrogram, datafile, mapping, utils (filesystem only, no DB in practice)
# tools/import → db, wav, astro, datafile, mapping, utils
# tools → db, audio, wav, spectrogram, datafile, astro, mapping, utils
# tui → audio, wav, spectrogram, datafile, utils (no db, no cmd)
# db → (stdlib only after Placeholders inline; wav alias allowed)
# spectrogram → audio, wav
# wav → audio, astro, utils
# datafile → utils (FindFiles only)
# config → (stdlib only)
# audio, astro, mapping, utils → (no skraak/* imports — true leaves)
utils:
files: ["**/utils/*.go"]
deny:
- { pkg: "skraak/", desc: "utils is the leaf package — no skraak/* imports" }
mapping:
files: ["**/mapping/*.go"]
deny:
- { pkg: "skraak/", desc: "mapping is a leaf package — no skraak/* imports" }
audio:
files: ["**/audio/*.go"]
deny:
- { pkg: "skraak/", desc: "audio is a leaf package — no skraak/* imports" }
astro:
files: ["**/astro/*.go"]
deny:
- { pkg: "skraak/", desc: "astro is a leaf package — no skraak/* imports" }
config:
files: ["**/config/*.go"]
deny:
- { pkg: "skraak/", desc: "config is a leaf package — no skraak/* imports" }
datafile:
files: ["**/datafile/*.go"]
deny:
- { pkg: "skraak/cmd", desc: "datafile must not import cmd" }
- { pkg: "skraak/tools", desc: "datafile must not import tools" }
- { pkg: "skraak/tui", desc: "datafile must not import tui" }
- { pkg: "skraak/db", desc: "datafile must not import db" }
- { pkg: "skraak/wav", desc: "datafile must not import wav" }
- { pkg: "skraak/audio", desc: "datafile must not import audio" }
- { pkg: "skraak/spectrogram", desc: "datafile must not import spectrogram" }
- { pkg: "skraak/astro", desc: "datafile must not import astro" }
wav:
files: ["**/wav/*.go"]
deny:
- { pkg: "skraak/cmd", desc: "wav must not import cmd" }
- { pkg: "skraak/tools", desc: "wav must not import tools" }
- { pkg: "skraak/tui", desc: "wav must not import tui" }
- { pkg: "skraak/db", desc: "wav must not import db" }
- { pkg: "skraak/spectrogram", desc: "wav must not import spectrogram" }
- { pkg: "skraak/datafile", desc: "wav must not import datafile" }
spectrogram:
files: ["**/spectrogram/*.go"]
deny:
- { pkg: "skraak/cmd", desc: "spectrogram must not import cmd" }
- { pkg: "skraak/tools", desc: "spectrogram must not import tools" }
- { pkg: "skraak/tui", desc: "spectrogram must not import tui" }
- { pkg: "skraak/db", desc: "spectrogram must not import db" }
- { pkg: "skraak/utils", desc: "spectrogram should only depend on audio + wav" }
- { pkg: "skraak/astro", desc: "spectrogram should only depend on audio + wav" }
- { pkg: "skraak/mapping", desc: "spectrogram should only depend on audio + wav" }
- { pkg: "skraak/datafile", desc: "spectrogram should only depend on audio + wav" }
db:
files: ["**/db/*.go"]
deny:
- { pkg: "skraak/cmd", desc: "db may only import wav (GainLevel alias)" }
- { pkg: "skraak/tools", desc: "db may only import wav (GainLevel alias)" }
- { pkg: "skraak/tui", desc: "db may only import wav (GainLevel alias)" }
- { pkg: "skraak/utils", desc: "db must not import utils (Placeholders is inlined)" }
- { pkg: "skraak/spectrogram", desc: "db may only import wav (GainLevel alias)" }
- { pkg: "skraak/datafile", desc: "db must not import datafile" }
tui:
files: ["**/tui/*.go"]
deny:
- { pkg: "skraak/cmd", desc: "tui must not import cmd" }
- { pkg: "skraak/db", desc: "tui must not import db" }
- { pkg: "skraak/tools$", desc: "tui must import from tools/calls, not tools" }
- { pkg: "skraak/tools/import", desc: "tui must not import tools/import" }
calls:
files: ["**/tools/calls/*.go"]
deny:
- { pkg: "skraak/cmd", desc: "tools/calls must not import cmd" }
- { pkg: "skraak/db", desc: "tools/calls is filesystem-only — no DB access" }
- { pkg: "skraak/tools$", desc: "tools/calls must not import parent tools package" }
- { pkg: "skraak/tools/import", desc: "tools/calls must not import tools/import (sibling)" }
- { pkg: "skraak/tui", desc: "tools/calls must not import tui" }
import:
files: ["**/tools/import/*.go"]
deny:
- { pkg: "skraak/cmd", desc: "tools/import must not import cmd" }
- { pkg: "skraak/tools$", desc: "tools/import must not import parent tools package" }
- { pkg: "skraak/tools/calls", desc: "tools/import must not import tools/calls (sibling)" }
- { pkg: "skraak/tui", desc: "tools/import must not import tui" }
tools:
files: ["**/tools/*.go"]
deny:
- { pkg: "skraak/cmd", desc: "tools must not import cmd" }
- { pkg: "skraak/tui", desc: "tools must not import tui" }
- { pkg: "skraak/tools/calls", desc: "tools must not import tools/calls (sub-package)" }
- { pkg: "skraak/tools/import", desc: "tools must not import tools/import (sub-package)" }
exclusions:
rules:
# Test files: binary.Write to in-memory buffers cannot fail; json.Unmarshal
# in assertions is checked by subsequent field reads; tx/stmt calls whose
# results are verified by later queries.
- path: _test\.go
linters:
- errcheck
- cyclop