# GMW — Agent Development Guide > **Rule #1: No code without a spec.** > Setiap perubahan signifikan dimulai dari spec di `docs/specs/`. > Baca spec → verifikasi facts → implement → verify → commit. > Gunakan `todo.md` (TODO list terdokumentasi) untuk melacak progress. ## Project overview GMW (Go Mod Watch) adalah Discord bot + dashboard untuk AI-powered moderation. Monorepo berisi 3 service utama: | Service | Path | Port | Tech | |---|---|---|---| | **discord-gateway** | `services/discord-gateway/` | 4016 (metrics) | discord.js-selfbot-v13, Piscina, Drizzle ORM, pino | | **backend** | `services/backend/` | 4001 | Express, oRPC, Drizzle ORM, Redis pub/sub, Vitest | | **frontend** | `services/frontend/` | 4017 (standalone) | Next.js 16 App Router, React 19, Tailwind v4, SWR | ## Data flow ``` Discord → discord-gateway → Redis pub/sub → backend (:4001) ←→ frontend Next.js SSR ↑ REST /api/* └ WS /ws ``` - Gateway = event-driven (no HTTP, except Prometheus :4016/metrics) - Backend = HTTP + WebSocket server, serves the frontend - Frontend = SSR (RSC) + client hydration, proxied by nginx :4009 ## Konvensi dokumentasi: `docs/` Semua dokumen kerja ada di `docs/`, bukan di `.hermes/`: ``` docs/ ├── README.md # Panduan workflow (spec-driven + todo) ├── spec-template.md # Template spec standar ├── todo-template.md # Template todo list └── specs/ # Semua spec & implementation plan ├── YYYY-MM-DD_-spec.md # Spec (apa & mengapa) └── YYYY-MM-DD_.md # Plan/fix (spec + plan dalam satu file) ``` Service-specific docs: `services//docs/specs/`. ## Workflow: Spec-Driven Development ### Checklist wajib untuk setiap perubahan signifikan 1. **Tulis spec** → `docs/specs/YYYY-MM-DD_-spec.md` 2. **Tulis `todo.md`** → daftar task konkret yang bisa diceklis 3. **Verifikasi facts** → baca kode aktual, konfirmasi referensi file:line 4. **Keputusan desain** → pilih approach, dokumentasikan alternatif yang ditolak 5. **Implementasi** → ikuti spec + todo step-by-step 6. **Verifikasi** → jalankan semua verification steps dari spec 7. **Commit** → reference spec di commit message ### Todo list (`todo.md`) Setiap tugas berjalan WAJIB punya `todo.md`. Format: ```markdown # Todo — ## Task - [ ] Tulis spec - [ ] Verifikasi facts (baca kode: file:line) - [ ] Implementasi tahap 1: ... - [ ] Implementasi tahap 2: ... - [ ] Verifikasi: pnpm typecheck / lint / build / test - [ ] Commit + push ``` Aturan: - Task harus **konkret & verifiable** — bukan "fix bug", tapi "ubah X di file Y". - Ceklis `[x]` saat selesai, jangan menunggu batch di akhir. - Gunakan `docs/todo-template.md` sebagai template. - Simpan `todo.md` di `docs/` untuk tugas lintas-service, atau di `services//docs/` untuk tugas satu service. ### Spec template Salin `docs/spec-template.md` untuk setiap spec baru. Sections: 1. **Problem** — apa yang rusak/missing, dengan evidence 2. **Root cause** — analisis teknis (bukan symptom) 3. **Behavior target** — perilaku setelah fix, daftar verifiable 4. **Verified facts** — fakta dari pembacaan kode, citation ke file:line 5. **Keputusan desain** — pilihan + rationale + alternatif ditolak 6. **Perubahan file** — semua file yang disentuh, per service 7. **Schema/type changes** — perubahan tipe/DB 8. **Verification** — command executable + expected outcome ### Kapan perlu spec + todo.md Perlu: fitur baru, bug fix non-trivial, refactor behavior-changing, perubahan DB schema, perubahan API contract, perubahan arsitektur. Tidak perlu: typo fix, dep bump, format/lint auto-fix, test-only, README update. Baca selengkapnya di `docs/README.md`. ## Coding conventions ### General - **TypeScript strict mode** — semua service - **Biome** — formatting + linting (`pnpm format`, `pnpm lint`) - **Bun** — package manager (`bun install`, `bun run`) - **Bisa bilingual** — code comments & specs boleh Indonesia/English ### Per-service conventions #### discord-gateway - **Event-driven** — no HTTP server (except metrics). Listeners → Redis pub/sub. - **Module pattern**: `src/modules//` — each module encapsulates own logic. - **Piscina pools**: text pool (4 threads) + media pool (2 threads), each with own pg Pool. - **Logger**: `createChildLogger('module-name')` — never raw `console`. - **Config**: Zod-validated env in `shared/config/index.ts` — single source of truth. - **DB**: Drizzle ORM. Migrations in `drizzle/migrations/`. - **Invariant**: LLM is the only judge. Never reintroduce regex content classification. - **Invariant**: Discord tokens sanitized before reaching LLM. - Lihat `services/discord-gateway/AGENTS.md` untuk detail. #### backend - **Modular MVC**: `modules//` — schema → repository → service → controller → routes. - **No cross-module repo imports** — each module owns its data. - **Data flows up only**: Repository → Service → Controller. - **Error hierarchy**: `AppError` subclasses with code + statusCode. - **Config**: Zod-validated env in `shared/config/index.ts`. - **API**: oRPC for type-safe procedures + standard Express routes. - Lihat `services/backend/AGENTS.md` untuk detail. #### frontend - **SSR-first**: `page.tsx` (server component) → fetch via `src/lib/api/server.ts` → pass to `view.tsx` (client). - **No auth**: all endpoints public. - **Never hardcode host**: same-origin or `GMW_BACKEND_URL` only. - **WebSocket**: `src/lib/ws/` — auto-reconnecting, typed events. - **Local dev**: `NEXT_PUBLIC_API_URL`, `NEXT_PUBLIC_WS_URL`, `GMW_BACKEND_URL`. - Lihat `services/frontend/AGENTS.md` untuk detail Next.js rules. ## Build & Verify ```bash # Per service (run from service root) pnpm typecheck # TypeScript strict pnpm lint # Biome check pnpm build # Compile pnpm test # Vitest (gateway & backend only) pnpm format # Biome auto-format ``` ## Commit conventions ``` (): Ref: docs/specs/.md ``` Types: `feat`, `fix`, `refactor`, `test`, `docs`, `chore`, `build`, `ci` ## Deployment CI/CD: GitHub Actions → build → deploy to production server via Nix flakes. - Gateway: `nixos-rebuild` or `systemctl restart gmw-discord-gateway` - Backend: `nixos-rebuild` or `systemctl restart gmw-backend` - Frontend: Next.js standalone, proxied by nginx :4009 ## Remember - Spec dulu, code belakangan. - Todo list (`todo.md`) wajib untuk tugas yang berjalan — ceklis tiap selesai. - Verified facts harus dari pembacaan kode aktual, bukan asumsi. - Setiap change harus verifiable — tulis command di spec. - One spec = one focused change. Don't mix unrelated features.