run: timeout: 5m tests: true skip-dirs-use-default: true linters: enable: # Core linters - staticcheck # Go vet on steroids - gosec # Security analyzer - revive # Linter alternative to golint - errcheck # Unchecked error returns - ineffassign # Ineffectual assignments - unused # Unused variables/constants/functions - misspell # Common misspellings - gofmt # Code formatting - goimports # Import organization - typecheck # Type checking (catches bugs) # Code quality - goprintffunc # Printf-style functions - godox # TODO/FIXME comments - testableexample # Testable examples - gocritic # Advanced linter - cyclop # Cyclomatic complexity - dupl # Code duplication - stylecheck # Style consistency # Performance - prealloc # Slice pre-allocation hints - unconvert # Unnecessary type conversions # Best practices - exportloopref # Loop variable capture - nolintlint # Invalid nolint directives # Disable problematic linters for MVP disable: - exhaustruct # Too strict for initial development - wsl # Whitespace linting (style preference) - gocyclo # Using cyclop instead linters-settings: staticcheck: checks: - all - -SA5008 # Wrong number of type parameters - -SA1019 # Using deprecated function gosec: severity: high confidence: high revive: rules: - name: unused-parameter disabled: true # Allow unused params in interfaces - name: receiver-naming arguments: ["skipInterface"] cyclop: max-complexity: 10 package-average: 5 gocritic: enabled-checks: - rangeValCopy - appendAssign - captLocal - caseOrder - deferInLoop - duplicateImport - evalOrder - ifElseChain - regexpMust - uncheckedInlineErr - unnamedResult - unnecessaryBlock - weakCond issues: exclude-rules: # Test files are allowed more lenient rules - path: _test\.go linters: - gosec - gocritic - errcheck max-issues-per-linter: 50 max-same-issues: 5