- Build:
go build .orgo run . - Test:
task testorgo test ./...(run single test:go test ./internal/llm/prompt -run TestGetContextFromPaths) - Update Golden Files:
go test ./... -update(regenerates .golden files when test output changes)- Update specific package:
go test ./internal/tui/components/core -update(in this case, we're updating "core")
- Update specific package:
- Lint:
task lint:fix - Format:
task fmt(gofumpt -w .) - Dev:
task dev(runs with profiling enabled)
- Imports: Use goimports formatting, group stdlib, external, internal packages
- Formatting: Use gofumpt (stricter than gofmt), enabled in golangci-lint
- Naming: Standard Go conventions - PascalCase for exported, camelCase for unexported
- Types: Prefer explicit types, use type aliases for clarity (e.g.,
type AgentName string) - Error handling: Return errors explicitly, use
fmt.Errorffor wrapping - Context: Always pass context.Context as first parameter for operations
- Interfaces: Define interfaces in consuming packages, keep them small and focused
- Structs: Use struct embedding for composition, group related fields
- Constants: Use typed constants with iota for enums, group in const blocks
- Testing: Use testify's
requirepackage, parallel tests witht.Parallel(),t.SetEnv()to set environment variables. Always uset.Tempdir()when in need of a temporary directory. This directory does not need to be removed. - JSON tags: Use snake_case for JSON field names
- File permissions: Use octal notation (0o755, 0o644) for file permissions
- Comments: End comments in periods unless comments are at the end of the line.
When writing tests that involve provider configurations, use the mock providers to avoid API calls:
func TestYourFunction(t *testing.T) {
// Enable mock providers for testing
originalUseMock := config.UseMockProviders
config.UseMockProviders = true
defer func() {
config.UseMockProviders = originalUseMock
config.ResetProviders()
}()
// Reset providers to ensure fresh mock data
config.ResetProviders()
// Your test code here - providers will now return mock data
providers := config.Providers()
// ... test logic
}- ALWAYS format any Go code you write.
- First, try
gofumpt -w .. - If
gofumptis not available, usegoimports. - If
goimportsis not available, usegofmt. - You can also use
task fmtto rungofumpt -w .on the entire project, as long asgofumptis on thePATH.
- First, try
- Comments that live on their own lines should start with capital letters and end with periods. Wrap comments at 78 columns.
- ALWAYS use semantic commits (
fix:,feat:,chore:,refactor:,docs:,sec:, etc). - Try to keep commits to one line, not including your attribution. Only use multi-line commits when additional context is truly necessary.