Skip to main content

Git Workflow

Branching Model

Trunk-based development with main as the protected branch. All changes go through Merge Requests.

Branch Naming

Feature branches are named after the Jira ticket:

INV-001
INV-042-add-pdf-generation

Commit Format

<type>(<scope>): <description> [INV-XXX]

Types

TypeDescription
featNew feature
fixBug fix
docsDocumentation only
refactorCode restructuring
testAdding or updating tests
choreBuild, tooling, dependencies
perfPerformance improvement
styleFormatting, no logic change
ciCI/CD pipeline changes

Scopes

ScopeDescription
backendGo backend code
frontendReact frontend code
dbDatabase migrations
invoiceInvoice-specific changes
calculatorPricing calculator
pdfPDF generation
integrationExternal service integrations
clickhouseClickHouse queries/client
infraInfrastructure, Docker, deployment

Examples

feat(backend): add prefill pipeline for invoice generation [INV-001]
fix(frontend): correct overtime calculation display [INV-042]
test(backend): add handler tests for invoice endpoints [INV-001]
docs(backend): update API documentation
refactor(invoice): extract rate tier calculation [INV-015]

Changelog

Changes tagged with feat, fix, refactor, or perf require a CHANGELOG.md update. Add [skip-changelog] to bypass:

chore(deps): update Go dependencies [skip-changelog]

Pre-Commit Hooks

The following checks run before each commit:

  1. gofmt — Go formatting
  2. golangci-lint — Go linting
  3. eslint — TypeScript linting
  4. prettier — Frontend formatting
  5. Changelog validation

Code Review

  • All changes via MR to main
  • At least one approval required
  • CI must pass (lint + test + build)
  • Squash merge preferred for clean history