- Fork and clone the repository
go mod downloadmake testto verify everything works- Create a branch, make changes, submit a PR
make build # Build binary
make test # Run all tests
make lint # Run linter
make fmt # Format code
make test-coverage # Coverage report- Open an issue before starting work — describe what and why
- Get approval — wait for maintainer to add
status:approvedlabel - Open a PR linking the issue:
Closes #Nin the PR body - Add a type label:
type:bug,type:feature,type:docs,type:refactor,type:chore
Follow Conventional Commits:
feat(graph): add BFS path finding between observations
fix(search): handle empty FTS5 query gracefully
refactor(store): extract common scan helpers
docs(readme): update installation instructions
- Follow existing patterns in the codebase
- Table-driven tests with
t.Run()subtests - Domain services depend on repository interfaces, stores implement them
- Use
testutil.NewTestDBWithMigrations()for store tests - Error wrapping:
fmt.Errorf("package: operation: %w", err)
- Target 70%+ coverage
- Store tests: use in-memory SQLite with inline migration SQL
- Domain tests: use mocks or real stores
- CLI tests: call
Run()with args, capture stdout/stderr - MCP tests: call handler functions directly with test
Stores
| Category | Labels |
|---|---|
| Type (required on PR) | type:bug, type:feature, type:docs, type:refactor, type:chore, type:breaking-change |
| Status | status:needs-review, status:approved, status:in-progress, status:blocked |
| Priority | priority:high, priority:medium, priority:low |
By contributing, you agree that your contributions will be licensed under the MIT License.