Fork channel

Create a new channel as a copy of main.

Rename channel

Rename main to:

Delete channel

Delete main? This cannot be undone.

.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