71 lines
2.0 KiB
Markdown
71 lines
2.0 KiB
Markdown
# AGENTS.md
|
|
|
|
## Quick Commands
|
|
```bash
|
|
pnpm dev:backend # Backend on https://localhost:3443
|
|
pnpm dev:frontend # Frontend on https://localhost:5174
|
|
pnpm build:backend # Build backend only (TypeScript -> dist/)
|
|
pnpm build:frontend # Build frontend only (Vite -> dist/client)
|
|
pnpm build # Build backend only (use pnpm -r build from root for full build)
|
|
pnpm -r build # Build everything (all workspace packages, run from root)
|
|
pnpm test # Vitest unit tests
|
|
npx playwright test # E2E tests (requires running backend + frontend)
|
|
```
|
|
|
|
## Prerequisites
|
|
- Node.js 22+, pnpm 10+
|
|
- MongoDB on localhost:27017
|
|
- Redis on localhost:6379
|
|
- SSL certificates in `ssl/` directory
|
|
|
|
## Path Aliases
|
|
`@/*` maps to `src/*` (defined in tsconfig.json)
|
|
|
|
## Test quirks
|
|
- Vitest runs unit tests in `tests/**/*.test.ts` excluding `tests/e2e/`
|
|
- Playwright e2e tests target `https://code-dev.g4dge7.com:5174` (requires running dev servers)
|
|
|
|
## Build output
|
|
- Backend compiles to `dist/` (TypeScript)
|
|
- Frontend builds to `dist/client/` (Vite, from `frontend/` vite.config.ts)
|
|
|
|
## TypeScript strictness
|
|
strict, noUnusedLocals, noUnusedParameters, noUncheckedIndexedAccess all enabled
|
|
|
|
## Architecture
|
|
- Backend: Express 5 + Socket.io + Mongoose + Redis sessions
|
|
- Frontend: React 19 + Vite 8 + Tailwind CSS 4
|
|
- Entry points: `src/web-app.ts` (backend), `frontend/src/main.tsx` (frontend)
|
|
|
|
## GadgetId
|
|
|
|
All entity IDs use `GadgetId` (a string alias) from `@gadget/api`. Never use `ObjectId`.
|
|
|
|
### Interfaces
|
|
|
|
```ts
|
|
import { GadgetId } from "@gadget/api";
|
|
|
|
interface IMyEntity {
|
|
_id: GadgetId;
|
|
// ...
|
|
}
|
|
```
|
|
|
|
### Mongoose Schemas
|
|
|
|
```ts
|
|
import { nanoid } from "nanoid";
|
|
|
|
const MySchema = new Schema<IMyEntity>({
|
|
_id: { type: String, default: () => nanoid() },
|
|
// ...
|
|
});
|
|
```
|
|
|
|
### Critical: Never add `unique` or `required` to `_id`
|
|
|
|
- `unique: true` → duplicate index error at startup (MongoDB auto-creates unique index on `_id`)
|
|
- `required: true` → save fails because default is assigned AFTER validation
|
|
|
|
See `docs/gadget-id.md` for full documentation. |