Skip to content

Contributing

  1. Create a feature branch from main.
  2. Make focused changes with passing local checks.
  3. Open a merge request on GitLab.
  4. Ensure CI passes (lint, typecheck, test, build).
  5. Squash or merge per team preference after review.

Use Conventional Commits:

TypeWhen
choreTooling, workspace setup, DX
featNew app or package
feat(scope)Scoped feature (e.g. feat(api), feat(web))
docsDocumentation site or content
testTest-only additions
ciCI/CD pipeline changes

Examples:

feat(web): scaffold React frontend shell
ci: add GitLab typecheck jobs for api and web
docs: document deployment variables

Commits should be signed (SSH or GPG) per repository policy.

pnpm install runs lefthook install via the root prepare script.

HookBehavior
pre-commitoxfmt + oxlint on staged files; pnpm typecheck when .ts files change
pre-pushformat:check, lint:check, typecheck

Run hooks manually:

Terminal window
pnpm exec lefthook run pre-commit
pnpm exec lefthook run pre-push
  • Lint: oxlint (type-aware via oxlint-tsgolint)
  • Format: oxfmt (Prettier-compatible)
  • Types: tsgo (@typescript/native-preview) — astro check for docs

Match existing patterns in the package you are editing. Prefer extending shared packages over duplicating logic in apps.

From the web app, install shared primitives into packages/ui:

Terminal window
pnpm --filter @quiz-builder/web exec shadcn add card

App-local components stay in apps/web/src/components/.