# Rules for coding agents Rules for coding agents working in this repository. `CONVENTIONS.md` defines the architecture and `REPO_POLICIES.md` the repository standards. Both are copies of shared documents and are not edited here. ## Before every commit 1. Run `make fmt`. 2. Run `make check`. It runs the tests and the linter in Docker, then the format check. All three must pass with no findings. Never run `go test`, `golangci-lint` or `gofmt` directly. The scripts in `script/` hold the flags and the Docker setup. ## Branches and pull requests - Never commit to `main` or `next` directly. Every change is a pull request from a feature branch into `next`. - Only the owner merges `next` into `main`. - A pull request that closes an issue has the title `Description (closes #N)`. - One logical change per commit. - Commit messages are in the imperative mood and short. ## Code style - Follow `CONVENTIONS.md`. - Every package has a package doc comment. Every exported type, function, method and variable has a doc comment. - JSON tags are camelCase. The HTTP API's `last_id`, `pow_token` and `hashcash_bits` stay as they are, each with a `//nolint:tagliatelle` comment. - No magic numbers. Use named constants. - No inline error handling such as `if err := f(); err != nil`. Assign the error on its own line, then test it. - A blank line before every `return`. - A blank line between the embedded fields of a struct and its other fields. - Every blank import has a comment saying why it is there. ## Architecture - The server uses `go.uber.org/fx` for dependency injection. Each of its components is an `fx` provider, wired together in `cmd/neoircd/main.go`. - Application packages live under `internal/`, one package per concern. `pkg/irc` holds the IRC command names and numeric reply codes. - A handler method returns an `http.HandlerFunc`. - A request struct is defined inside the handler that decodes it. - Database access goes through the methods of `db.Database`. - The database migrations live in `internal/db/schema/` and are embedded with `go:embed`. - The database is SQLite, through the pure Go driver `modernc.org/sqlite`. ## Testing - Prefer table-driven tests. - Use `testing.T` helpers, not assertion libraries. - A test file lives next to the code it tests and ends in `_test.go`. - Tests are in the package's external test package, such as `handlers_test`. When a test needs an unexported name, an `export_test.go` file in the package exposes it. ## Dependencies - The required libraries are listed in `CONVENTIONS.md` ยง1. - No new dependency without a reason given in the pull request. - Prefer dependencies written in pure Go, which build without cgo.