Coding Conventions
Drill-down dari Technical Standards. Kalau standards
ngasih ringkasan satu baris per-stack, halaman ini isinya aturan konkret yang
dipakai pas nulis kode. Source of truth tetap AGENTS.md tiap repo —
halaman ini nyalin yang paling sering kepake biar gampang di-scan.
Prinsip lintas-layer: match konvensi lokal (conformance > selera), perubahan kecil & reviewable, jangan refactor di luar scope ticket, jangan nambah dependency tanpa approval.
Frontend
Repo: haer-platform-web (Next.js App Router + Turborepo) & haer-claims-mobile (Expo / React Native).
TypeScript
- Hindari
any— preferunknownlalu narrow. - ESLint bersih (
--max-warnings=0) + Prettier. Pre-commit jalaninlint-staged. - Komentar cuma buat workaround atau business logic kritis, pakai JSDoc di parent function — bukan inline. Kode harus self-documenting.
Arsitektur & imports
page.tsxtipis — cuma mount feature module. Jangan pindahin ownership antaraapps/webdanpackages/*.- Import feature package cuma lewat entrypoint publik (
@haer/feature-*atau subpath yang didokumentasiin).@haer/feature-*/src/*dilarang. - Nambah
packages/*baru = tiga edit terkoordinasi (kalau nggak, Docker build production gagal walau localpnpm buildlolos):apps/web/next.config.mjs→ tambah ketranspilePackages.Dockerfile→ tambah barisCOPY packages/<name>/package.json.pnpm installbiarpnpm-lock.yamlkerekam. Verifikasi lewat clean build, bukan cuma local.
UI
- Urutan reuse: export
@haer/ui→ komponenpackages/ui/src/app-base/*→ bikin app-base baru. - Pakai token semantik (
tokens.css/design-system.css). Nggak ada literal warna / spacing / tipografi / z-index kalau token-nya udah ada. - Handle state loading / empty / error / success eksplisit (skeleton /
spinner dari design system). Hormati
prefers-reduced-motion; prefertransform+opacity. - Baca
/DESIGN.mdsebelum bikin atau ubah UI.
Data & kalkulasi
- Semua math uang / business logic di backend. Frontend cuma format (currency, tanggal) — jangan hitung sendiri.
- Call backend dari browser lewat
apps/web/src/lib/api/api-client.ts+/api/proxy; dari server lewatbackend-server.ts. Kontrak lintas-package taruh dipackages/types.
Backend
haer-platform-api (NestJS / TypeScript)
- Pola
module / controller / service / DTO. - Entity TypeORM = source of truth schema.
synchronize: falseselalu, di semua environment. - Migrasi: generate lawan scratch DB lokal yang bersih, jangan pernah lawan DB remote/shared. Pair migrasi Postgres + Oracle di PR yang sama. Jangan pernah edit migrasi yang udah ke-merge — bikin yang baru.
- Auth (Zitadel JWT) & tenant resolve server-side; jangan percaya tenant/user/role dari client.
haer-platform-bgjobs (Go)
- Idiomatik Go,
go vetbersih, error di-wrap dengan konteks. - Migrasi pakai golang-migrate (up / down / up di DB bersih).
haer-connector (Python 3.12)
ruffstrict (lint + format). FastAPI + SQLAlchemy 2 async.
Lintas backend
- Kontrak API entity-based, ikut konvensi OData / REST.
- Perubahan kontrak (endpoint / shape / auth berubah) wajib ditulis di PR bagian “API contract impact” + kabarin konsumer (web & mobile). Lihat merge order.
- Validasi input di trust boundary (route handler, handler backend). Audit log buat CREATE / UPDATE / DELETE di data tenant. Nggak ada PII di log.
Scripts
Repo: scripts + tooling .claude/ di tiap repo.
- Prefix semua command CLI dengan
rtk(Rust Token Killer) — kalau ada filter dipakai, kalau nggak passthrough. Aman selalu. Termasuk di dalam chain&&:rtk git add . && rtk git commit. rtkoutput itu ringkasan buat dibaca manusia, bukan input mesin. Jangan pipertk git diff > x.patch— bukan patch valid.- Verifikasi test scoped ke file yang berubah (
--changed/--filter/go test ./internal/<pkg>/), bukan full suite. Full run = laptop nge-lag. - Shell script tetep POSIX-friendly dan idempoten kalau bisa.
Source of truth:
AGENTS.mdtiap repo,.ai/instructions/*(haer-platform-web), dandocs/engineering-development-standard.md.