# AGENTS.md - Coding Agent Guidelines for golib ## Project Overview This is a Go library repository containing multiple independent packages: - **cookies**: HTTP cookie utilities - **env**: Environment variable helpers - **ezconf**: Configuration loader with ENV parsing - **hlog**: Logging with zerolog - **hws**: HTTP web server - **hwsauth**: Authentication middleware for hws - **jwt**: JWT token generation and validation - **tmdb**: The Movie Database API client Each package has its own `go.mod` and can be used independently. ## Interactive Questions All questions in plan mode should use the opencode interactive question prompter for user interaction. ## Build, Test, and Lint Commands ### Running Tests ```bash # Test all packages from repo root go test ./... # Test a specific package cd && go test # Run a single test function cd && go test -run TestFunctionName # Run tests with verbose output cd && go test -v # Run tests matching a pattern cd && go test -run "TestName.*" ``` ### Building ```bash # Each package is a library - no build needed # Verify code compiles: go build ./... # Or for specific package: cd && go build ``` ### Linting ```bash # Use standard go tools go vet ./... go fmt ./... # Check formatting without changing files gofmt -l . ``` ## Code Style Guidelines ### Package Structure - Each package must have its own `go.mod` with module path: `git.haelnorr.com/h/golib/` - Go version should be current (1.23.4+) - Each package should have a `doc.go` file with package documentation ### Imports - Use standard library imports first - Then third-party imports - Then local imports from this repo (e.g., `git.haelnorr.com/h/golib/hlog`) - Group imports with blank lines between groups - Example: ```go import ( "context" "net/http" "github.com/pkg/errors" "github.com/stretchr/testify/require" "git.haelnorr.com/h/golib/hlog" ) ``` ### Formatting - Use `gofmt` standard formatting - No tabs for alignment, use spaces inside structs - Line length: no hard limit, but prefer readability ### Types - Use explicit types for struct fields - Config structs must have ENV comments (see below) - Prefer named return values for complex functions - Use generics where appropriate (see `hwsauth.Authenticator[T Model, TX DBTransaction]`) ### Naming Conventions - Packages: lowercase, single word (e.g., `cookies`, `ezconf`) - Exported functions: PascalCase (e.g., `NewServer`, `ConfigFromEnv`) - Unexported functions: camelCase (e.g., `isValidHostname`, `waitUntilReady`) - Test functions: `Test` or `Test_` (underscore for sub-cases) - Variables: camelCase, descriptive names - Constants: PascalCase or UPPER_CASE depending on scope ### Error Handling - Use `github.com/pkg/errors` for error wrapping - Wrap errors with context: `errors.Wrap(err, "context message")` - Return errors, don't panic (except in truly exceptional cases) - Validate inputs and return descriptive errors - Example: ```go if config == nil { return nil, errors.New("Config cannot be nil") } ``` ### Configuration Pattern - Each package with config should have a `Config` struct - Provide `ConfigFromEnv() (*Config, error)` function - ENV comment format for Config struct fields: ```go type Config struct { Host string // ENV HWS_HOST: Host to listen on (default: 127.0.0.1) Port uint64 // ENV HWS_PORT: Port to listen on (default: 3000) SSL bool // ENV HWS_SSL: Enable SSL (required when using production) } ``` - Format: `// ENV ENV_NAME: Description (required ) (default: )` - Include "required" only if no default - Include "default" only if one exists ### Testing - Use `testing` package from standard library - Use `github.com/stretchr/testify` for assertions (`require`, `assert`) - Table-driven tests for multiple cases: ```go tests := []struct { name string input string wantErr bool }{ {"valid case", "input", false}, {"error case", "", true}, } ``` - Test files use `_test` for black-box tests or `` for white-box - Helper functions should use `t.Helper()` ### Documentation - All exported functions, types, and constants must have godoc comments - Comments should start with the name being documented - Example: `// NewServer returns a new hws.Server with the specified configuration.` - Keep doc.go files up to date with package overview - Follow RULES.md for README and wiki documentation ## Version Control (from RULES.md) - Do NOT make changes to master branch - Checkout a branch for new features - Version numbers use git tags - do NOT change manually - When updating docs, append branch name to version - Changes to golib-wiki repo should use same branch name ## Testing Requirements (from RULES.md) - All features MUST have tests - Update existing tests when modifying features - New features require new tests ## Documentation Requirements (from RULES.md) - Document via: docstrings, README.md, doc.go, wiki - README structure: Title+version, Features (NO EMOTICONS), Installation, Quick Start, Docs links, Additional info, License, Contributing, Related projects - Wiki location: `~/projects/golib-wiki` - Docstrings must conform to godoc standards ## License - All modules use MIT License