# AGENTS.md ## Overview Single-page app for tracking engineering projects across weekly sessions ("Sitzungen"). Vanilla JS/HTML/CSS frontend + Node.js/Express server. No build step, no bundler, no tests. Data is persisted as semicolon-separated CSVs under `sessions/`. Two HTML entrypoints, both served statically by Express: - `Test.html` — the main app (tabs: Projektboard, Auslastung, Projekte, Projektbeteiligte). Served at `/`. - `project-plan.html` — per-project Gantt/TODO planning view, opened in a new tab via `openProjectPlan()` in `main.v2.js:2358`. Loads `main.v2.js` first, then `project-plan.js`. All UI strings/comments/CSV content are German. Preserve German in user-facing text. ## File structure ``` . ├── server.js # Express server + CSV API ├── package.json # deps: express, cors only ├── docker-compose.yml # at repo ROOT; build context ., dockerfile Docker/Dockerfile ├── Docker/Dockerfile # node:20-alpine ├── .dockerignore ├── .vscode/extensions.json ├── public/ │ ├── Test.html # main app (served at /) │ ├── main.v2.js # entire main client app (~3200 lines) │ ├── project-plan.html # Gantt/TODO planning view │ ├── project-plan.js # planning logic (~1500 lines) │ ├── styles.css │ └── dein_bild.ico └── sessions/ # data; bind-mounted into Docker container ├── ELT/ HLS/ ARCH/ # one folder per department ``` ## Running ```bash npm install npm start # http://localhost:3003, or PORT=3004 if occupied docker compose up --build # Docker variant (compose file is at repo root) ``` - PORT env var overrides default 3003 in `server.js`. - Frontend must be served over HTTP: `baseUrl()` in `main.v2.js` uses `window.location.origin` or falls back to `http://localhost:3003` when opened via `file://` (then only seed/demo data loads). - Check `/health` returns `{ok:true}` after starting. ## Server API (`server.js`) - `GET /` → `Test.html`; `GET /health`. - `GET /load-all?department=` → `{sessions:[{filename,content}], people}` with `_people.csv` content in `people`; sessions sorted by filename. - `POST /save-csv {filename, csv, department}` → writes UTF-8 BOM CSV. - `POST /delete-csv {filename, department}`. - Valid departments hard-coded as `ELT|HLS|ARCH` in `server.js` (`VALID_DEPARTMENTS`); anything else silently falls back to `ELT`. Same set in `DEPARTMENTS` in `main.v2.js`. - `safeName()` strictly validates filenames (path traversal protection); static assets get `Cache-Control: no-store`. - JSON body limit is 2 MB. ## CSV format - Delimiter `;`, UTF-8 with BOM. Hand-editing is possible but risky; the parser reconstructs objects from the fixed column layout. - Week files `