version: 2

run:
  timeout: 5m
  tests: false

linters:
  disable:
    - dupl
    - goconst
    - revive
  enable:
    - errcheck
    - gosec
    # - gocyclo  # Disabled: high complexity acceptable for large functions (see LINTING.md)
    - misspell
    - unconvert
    - unparam

linters-settings:
  dupl:
    threshold: 100
  errcheck:
    check-type-assertions: false
    check-blank: false
    exclude-functions:
      - (*database/sql.DB).Close
      - (*database/sql.Rows).Close
      - (*database/sql.Tx).Rollback
      - (*database/sql.Stmt).Close
      - (*database/sql.Conn).Close
      - (*os.File).Close
      - (os).RemoveAll
      - (os).Remove
      - (os).Setenv
      - (os).Unsetenv
      - (os).Chdir
      - (os).MkdirAll
  goconst:
    min-len: 3
    min-occurrences: 3
  gocyclo:
    min-complexity: 15
  misspell:
    locale: US
  revive:
    rules:
      - name: var-naming
      - name: exported

issues:
  exclude-patterns:
    - "var-naming: avoid meaningless package names"
    - "exported.*SQLiteStorage.*stutters"
  exclude-rules:
    # G304: File inclusion via variable in tests is safe (test data)
    - path: _test\.go
      linters:
        - gosec
      text: "G304.*file inclusion via variable"
    # G302/G306: Directory/file permissions 0700/0750 are acceptable
    - linters:
        - gosec
      text: "G302.*0700|G301.*0750"
    # G306: Git hooks must be executable (0700)
    - path: cmd/bd/init\.go
      linters:
        - gosec
      text: "G306.*0700"
    # G204: Safe subprocess launches (git show, bd daemon)
    - linters:
        - gosec
      text: 'G204.*git.*show|G204.*daemon'
    # errcheck: Ignore unchecked errors in test files for common cleanup patterns
    - path: _test\.go
      linters:
        - errcheck
      text: "Error return value of .*(Close|Rollback|RemoveAll|Setenv|Unsetenv|Chdir|MkdirAll|Remove|Write|SetReadDeadline|SetDeadline|Start|Stop).* is not checked"
