Contributing
This guide covers the workflow and conventions for contributing to Proxima Console.
Development Workflow
-
Create a feature branch from
main:git checkout -b MNG-XXX
# or
git checkout -b feat/description -
Read the relevant standards in
docs/standards/*.mdfor the area you are working on. -
Write code with tests. All new features must have at least 70% test coverage before merging to
main. -
Run linters and tests before pushing:
make lint && make test -
Open a merge request. The CI pipeline must pass before merging.
-
No direct commits to
main. All changes go through merge requests.
Key Conventions
No ORM
We use raw SQL with sqlx for all database access. There is no ORM in this project. Queries are explicit and easy to reason about.
REST + Polling + SSE (one WebSocket exception)
The project uses REST endpoints with polling and Server-Sent Events (SSE) only, with a single exception: the interactive terminal at /api/v1/terminal/ws (and /api/v1/terminal/ws/join for collaborative sessions) uses WebSocket.
Config via Environment Variables
All configuration is loaded from environment variables. Never hardcode secrets or connection strings in source code. See docs/standards/config.md for the full configuration loading order.
Structured Logging
Use slog with JSON output for all logging. No fmt.Println or unstructured log calls.
slog.Info("host registered",
"component", "worker",
"host_id", hostID,
)
Error Wrapping
Always wrap errors with context using fmt.Errorf:
if err != nil {
return fmt.Errorf("fetching host by id: %w", err)
}
Pre-commit Hooks
Pre-commit hooks are configured via .pre-commit-config.yaml and run automatically on each commit. They enforce formatting, linting, and other checks before code reaches CI.
Useful Commands
make help # List all available commands
make docker-up # Start the local dev stack (PostgreSQL, NATS, Valkey, VictoriaMetrics, VictoriaLogs, Tempo, Grafana, Vault, …)
make test # Run all tests
make lint # Run all linters
make build # Build all binaries
make migrate-up # Apply database migrations
make seed # Seed development data
make test-e2e # Run end-to-end smoke tests
make run-backend # Start the backend server
make run-agent # Start the agent
make run-frontend # Start the frontend dev server
make test-e2e builds the binaries and frontend, then uploads and runs the BATS + Playwright suites against a remote infrastructure host over SSH (requires E2E_HOST and an SSH key). It is typically CI-only — for local development use make test and make test-integration.
After Completing a Task
- Run
make test && make lint && make test-raceto confirm a clean state. - Run
make test-e2efor any new features that touch NATS messages, API endpoints, or database writes. - Update
CHANGELOG.mdwith entries under## [Unreleased]. - Commit with a conventional commit message:
feat(agent): add host inventory [MNG-101]. - Add a Jira comment summarizing the work, decisions made, and edge cases found.
- Update Confluence if the change involves new architecture, APIs, or runbooks.