# AGENTS.md — hello-web **FastAPI backend + Vue 3 (Options API) + Vite frontend + PostgreSQL (async SQLAlchemy).** UI text and HTML `lang` attribute are Korean. ## Project structure ``` backend/ app.py — FastAPI app, static mount, CORS, lifespan auto-create tables database.py — async engine + session factory (DATABASE_URL env or default) models.py — Sample model (id, title, content, author, created_at) schemas.py — SampleResponse, SampleCreate(required), SampleUpdate(optional) routers/samples.py— full CRUD: GET list, GET /{id}, POST, PUT /{id}, DELETE /{id} seed.py — creates tables + idempotent INSERT of 5 sample rows frontend/ src/pages/ — SampleListPage, SampleDetailPage, SampleFormPage (+ Home, About) src/router.js — 6 routes: /, /about, /samples, /samples/new, /samples/:id, /samples/:id/edit vite.config.js — proxy /api → localhost:8000, outDir: dist dev.sh — runs uvicorn (:8000) + vite dev (:5173) concurrently, kill both on Ctrl+C ``` ## Commands | Action | From | Command | |--------|------|---------| | Dev (both servers) | root | `./dev.sh` | | Backend dev | `backend/` | `uvicorn app:app --reload --port 8000` | | Frontend dev | `frontend/` | `npm run dev` (port 5173) | | Seed DB | root | `python3 backend/seed.py` | | Frontend build | `frontend/` | `npm run build` (outputs to `dist/`) | | Install backend deps | root | `pip3 install -r backend/requirements.txt` | | Install frontend deps | `frontend/` | `npm install` | ## Workflow - **Dev** (hot-reload): `./dev.sh` — or run uvicorn + `npm run dev` in separate terminals. Visit `localhost:5173`. Vite proxies `/api` → uvicorn on 8000. - **Prod** (FastAPI serves SPA): `npm run build` → uvicorn serves `frontend/dist/` at `localhost:8000`. - **First-time setup**: `python3 backend/seed.py` to create tables and insert sample data. Tables also auto-create on app startup via `lifespan` hook. - **CORS** in `backend/app.py` allows dev server origins only (5173). Not needed when FastAPI serves the SPA directly. ## Constraints - **No tests, no lint, no typecheck.** Zero test infrastructure — do not look for it or run it. - `backend/app.py` mounts `StaticFiles(directory="../frontend/dist")` — `dist` must exist before accessing via uvicorn. - Vue uses **Options API** (`data()`, `methods`, `mounted()`, `computed`) — do not rewrite to Composition API unless asked. - **PostgreSQL** must be reachable at `192.168.0.60:5432` (or override via `DATABASE_URL` env var). - `SampleUpdate` has all-optional fields; `SampleCreate` has all-required fields. - Behavioral guidelines: see [`CLAUDE.md`](./CLAUDE.md) and [`클로드.md`](./클로드.md) (Korean translation).