diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..571e207 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,35 @@ +# AGENTS.md — dashback (Express API) + +ESM (`type: module`), Express 5, Node. Depends on `libdashstore` via `file:../dashdbschema`. + +## Architecture + +- Entry: `src/index.js` → `src/api/index.js` (`startApi`/`stopApi`, `loadRoutes()` walks `src/api/routes/**/*.js` → `register(app, basePath)`). +- Each route file owns its `@openapi` JSDoc + `*ErrorStatus(err)` mapper + `requireSelectedCompany(req)`. Source of truth is code. +- DB: `src/db/store.js` lazy singleton provider+store (timing logs `libstore .`); `src/db/.js` are thin wrappers around `store..`. +- Config: `src/config/env.js` (`.env`; `PORT` 4208, `HTTPS_PORT`, `GOOGLE_CLIENT_ID`, `JWT_SECRET`, `CORS_ORIGINS`, `DB_PROVIDER=mssql|sqlite`, `SQLITE_PATH`, `MSSQL_*`). +- Auth: `src/api/middleware/auth.js` (Google SSO + JWT cookie, `req.user.{id,selectedCompanyId}`); allowlist via `scripts/manageUsers.js`. +- SSE: `src/api/sse.js` (`emit`), `routes/events.js`. Stock adjust emits `stock`, `ledger`, `articles`, `article-`. +- `src/v1/` legacy POS compat — don't touch unless task is POS. `quixpos2jtl/` is a separate Electron/CLI bridge — ignore unless task mentions JTL. +- Docs: generated, never hand-edit — see below. + +## Build / Test / Docs + +```bash +cp .env.example .env && npm install +npm start # PORT 4208 (HTTPS 8443) +npm run docs:api # regenerates docs/api/routes.md + docs/api/routes/ + openapi.json +npm run manage-users # email allowlist +``` + +- No `npm test`. Verify with syntax check or a self-exiting run on a **different port**; never leave a listener running — user keeps their own dev server. +- Store contract lives in sibling repo: `../dashdbschema/API.md` + `API..md`, `../dashdbschema/README.md`. Read-only. + +## Conventions + +- Sibling repos (`../dashdbschema`, `../dashfront`) are **read-only**: may read docs/code + `git -C ../ log --oneline -20`, never write/install/start. Missing contract → ask human, don't guess. No fallbacks/defaults. See `.cursor/rules/sibling-repos.mdc`, `.cursor/rules/dont-start-the-API-server.mdc`. +- After any route change run `npm run docs:api`. Docs index: `docs/api/README.md`. +- HTTP mapping per route file: `No company selected→400`, `Not authorized→403`, `*not found→404`, validation (`includes()`)→400, uniqueness/in-use→409, else 500 + `console.error`. `Stock tracking is disabled…→409`. +- Keep error strings stable/greppable — mapping depends on exact messages from `libdashstore`. +- Stock/ledger invariants belong in `dashdbschema/src/store/`, not routes, so both `stock.adjust` and direct `ledger.add` are covered. +- Full backend/store conventions: `.agents/skills/project-overview/SKILL.md`.