| Requirement | Version | Installation |
|---|---|---|
| Go | 1.25.4+ | asdf install golang 1.25.4 or golang.org |
| Git | 2.40+ | System package manager |
| just | Latest | brew install just or just.systems |
| gofumpt | 0.7.0 | go install mvdan.cc/gofumpt@latest |
| golangci-lint | 1.61.0 | brew install golangci-lint or docs |
-
Clone the repository:
git clone https://github.com/arcavenae/ThreeDoors.git cd ThreeDoors -
Verify Go version:
go version # Should show go1.25.4 or higher -
No environment variables or
.envfiles required — this is a local-only application. -
Application data directory:
~/.threedoors/(created automatically on first run)
| Command | Description |
|---|---|
just build |
Compile to bin/threedoors |
just run |
Build and run |
just test |
Run all tests (go test -v ./...) |
just lint |
Run golangci-lint |
just fmt |
Format code with gofumpt |
just clean |
Remove build artifacts (bin/) |
- Always run
gofumpt -l -w .before committing - Always ensure
golangci-lint run ./...passes with zero warnings - Import ordering: stdlib > external > internal (auto-handled by gofumpt)
- Packages: lowercase single word (
tui,tasks) - Files: lowercase snake_case (
task_pool.go,doors_view.go) - Exported types/functions: PascalCase (
TaskPool,NewTaskPool) - Private types/functions: camelCase (
validateTask,renderDoor)
- No
fmt.Printlnin TUI code — output via BubbleteaView()only - All file writes use atomic write pattern (write .tmp, sync, rename)
- Always validate status transitions via
StatusManagerbefore applying - Wrap errors with context:
fmt.Errorf("operation failed: %w", err) - No panics in user-facing code
- Task IDs are immutable after creation
- Timestamps always in UTC (
time.Now().UTC()) - YAML field tags must match schema exactly
- Pragmatic testing — focus on domain logic, minimal TUI testing
- Table-driven tests for multiple scenarios
- No mocking frameworks — use interfaces and simple stubs
| Package | Target |
|---|---|
internal/tasks/* |
70%+ |
internal/tui/* |
20%+ |
| Overall | 50%+ |
- 70% Unit tests (fast, isolated)
- 20% Integration tests (component interactions, file I/O via
t.TempDir()) - 10% Manual testing (end-to-end TUI workflows)
go test ./... # All tests
go test ./internal/tasks/... # Domain tests only
go test -cover ./... # With coverage report
go test -v ./... # Verbose output- Strategy: Direct binary distribution (no cloud infrastructure)
- Build:
make buildcompiles tobin/threedoors - Install: Copy binary to
/usr/local/bin/or run viamake run - CI/CD: None configured for Technical Demo phase (deferred to Epic 2)
- Future: Homebrew tap planned (
brew install arcavenae/tap/threedoors)
- YAML schema must remain backward compatible
- Forward migrations add fields with defaults
- Never break existing
tasks.yamlformat