agent-orchestrator/backend/.golangci.yml

116 lines
4.2 KiB
YAML

# golangci-lint v2 config for the AO backend.
# Run: golangci-lint run ./... (from backend/)
version: "2"
run:
timeout: 5m
issues:
# Report every finding, not the default first-50-per-linter / 3-same.
max-issues-per-linter: 0
max-same-issues: 0
linters:
default: none
enable:
# --- correctness ---
- errcheck # unchecked errors
- govet # suspicious constructs
- ineffassign # ineffectual assignments
- staticcheck # the big static analyzer
- unused # dead code (funcs/vars/types/fields)
- errorlint # error wrapping / comparison bugs
- bodyclose # unclosed HTTP response bodies
- sqlclosecheck # unclosed sql.Rows/Stmt
- rowserrcheck # missing rows.Err()
- nilerr # `return nil` after a non-nil err check
- makezero # append to a non-zero-len make() slice
- gocheckcompilerdirectives # malformed //go: directives
- reassign # reassigning package-level vars from other pkgs
# --- dead code / boilerplate (the "nuke" linters) ---
- unparam # unused function params / always-same returns
- unconvert # unnecessary type conversions
- wastedassign # assignments never read
- copyloopvar # redundant loop-var copies (Go 1.22+)
- prealloc # slices that could be preallocated
- dupl # copy-pasted code blocks
# --- style / quality ---
- revive # configurable golint successor
- gocritic # opinionated diagnostics + style
- misspell # typos in comments/strings
- usestdlibvars # use stdlib consts (http.MethodGet, etc.)
- predeclared # shadowing predeclared identifiers
- nakedret # naked returns in long funcs
# --- security ---
- gosec
settings:
errcheck:
check-type-assertions: true
govet:
enable-all: true
disable:
- fieldalignment # struct field ordering is not worth the churn
- shadow # shadowing `err` in nested scopes is idiomatic Go
revive:
rules:
- { name: exported } # doc comments on every exported symbol
- { name: blank-imports }
- { name: context-as-argument }
- { name: context-keys-type }
- { name: dot-imports }
- { name: error-return }
- { name: error-strings }
- { name: error-naming }
- { name: indent-error-flow }
- { name: errorf }
- { name: empty-block }
- { name: superfluous-else }
- { name: unreachable-code }
- { name: redefines-builtin-id }
- { name: range }
- { name: time-naming }
- { name: var-declaration }
gocritic:
enabled-tags: [diagnostic, performance, style]
disabled-checks:
- ifElseChain # overlaps revive/superfluous-else
- commentedOutCode
- hugeParam # pass-by-pointer micro-opt; hurts clarity, risks nil/aliasing
- rangeValCopy # same — copying a struct in range is usually fine
- unnamedResult # named returns are a style choice, not a defect
dupl:
threshold: 140
gosec:
excludes:
- G104 # unchecked errors — errcheck owns this
- G304 # file inclusion via variable — paths are config/run-file/worktree-derived, not user input
- G703 # path traversal via taint analysis — same as G304: binary-resolution and worktree-derived paths, not user input
exclusions:
generated: lax # skip sqlc/codegen ("Code generated ... DO NOT EDIT")
rules:
# Tests: relax the noisiest checks (deliberate error-drops, repeated setup,
# preallocation, and upgrade-response bodies that don't need closing).
- path: _test\.go
linters: [errcheck, dupl, gosec, unparam, gocritic, prealloc, bodyclose]
# status.go deliberately reports probe failures in the result struct
# (st.State/st.Error) and returns nil — a down daemon is the status being
# reported, not a failure of the status command itself.
- path: internal/cli/status\.go
linters: [nilerr]
# The reflect/unsafe field-inspection test is intentional.
- path: wiring_test\.go
linters: [gosec]
# Spawning git/agent subprocesses with computed args is the point.
- linters: [gosec]
text: "G204"
formatters:
enable:
- goimports
settings:
goimports:
local-prefixes:
- github.com/aoagents/agent-orchestrator