diff --git a/AGENTS.md b/AGENTS.md
index 1224d8f..b48b50c 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -11,8 +11,9 @@ 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`.
+ tab via `openProjectPlan()` in `js/gantt.js`. Loads the shared helper modules
+ (`globals`, `utils`, `ui`, `date-picker`, `csv`, `server`, `gantt`) plus the
+ plan modules under `js/plan/` — NOT the full main module set.
All UI strings/comments/CSV content are German. Preserve German in
user-facing text.
@@ -29,9 +30,32 @@ user-facing text.
├── .vscode/extensions.json
├── public/
│ ├── Test.html # main app (served at /)
-│ ├── main.v2.js # entire main client app (~3200 lines)
+│ ├── js/ # main app modules (classic scripts, global fns)
+│ │ ├── globals.js # Konstanten (LPHS, ROLES, LPH-Farben, DEPARTMENTS) + db/currentDepartment
+│ │ ├── utils.js # esc, uid, Datum-/Differenz-Helfer, personIdForName, weekSortKey-Quelle
+│ │ ├── ui.js # LocalStorage-UI-State, Header-Collapse, Theme
+│ │ ├── date-picker.js # Datums-/Bereichspicker-Overlays
+│ │ ├── csv.js # CSV-Parser/Serializer + weekSortKey, filenameForWeek
+│ │ ├── server.js # baseUrl, sendCsvToServer, deleteCsvFromServer, blobToDataUrl
+│ │ ├── store.js # save/syncAllToServer, switchDepartment, load, seed
+│ │ ├── weeks.js # Wochen-Auswahl, -Erzeugung, -Klonen, Auto-Lock, -Löschung
+│ │ ├── board.js # Projektboard-Rendering, Status-Editor, Anwesenheit, Zuordnung
+│ │ ├── people.js # Personen-Tab-Rendering + Drag-and-Drop + Abwesenheiten
+│ │ ├── projects.js # Projekte-Tab-Rendering + Drag-and-Drop
+│ │ ├── load.js # Auslastungs-Tab, LP-Modal, Neues-Projekt-Modal
+│ │ ├── gantt.js # GANTT-Diagramm (buildGanttHtml, openProjectPlan), geshared
+│ │ ├── showmode.js # Show-Mode (Präsentationsmodus)
+│ │ ├── tabs-auth.js # showTab, confirmPassword (SHA256-Passwortschutz)
+│ │ ├── pdf.js # PDF-Export (pdfmake, A3 quer)
+│ │ └── init.js # renderAll/initUiState + Seiteneinstieg (nur Test.html)
│ ├── project-plan.html # Gantt/TODO planning view
-│ ├── project-plan.js # planning logic (~1500 lines)
+│ ├── js/plan/ # planning modules (nur von project-plan.html geladen)
+│ │ ├── plan-state.js # PlanApp-Zustand, Datenladepath, savePlan, Toasts
+│ │ ├── plan-build-gantt.js # buildGanttHtml-Erweiterung (TODO- und Meilensteinzeilen)
+│ │ ├── plan-gantt.js # renderPlanGantt, Abhängigkeitslinien, Zoom, Ressourcen-Load
+│ │ ├── plan-drag.js # GANTT-Balken-Drag/Resize + TODO-/Meilenstein-Zeilen-Drag
+│ │ ├── plan-modals.js # TODO-, Meilenstein- und Abwesenheits-Modals
+│ │ └── plan-schedule.js # Kritischer Pfad, Auto-Schedule, Mail-Link
│ ├── styles.css
│ └── dein_bild.ico
└── sessions/ # data; bind-mounted into Docker container
@@ -47,7 +71,7 @@ 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
+- Frontend must be served over HTTP: `baseUrl()` in `js/server.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.
@@ -61,7 +85,7 @@ docker compose up --build # Docker variant (compose file is at repo root)
- `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`.
+ `DEPARTMENTS` in `js/globals.js`.
- `safeName()` strictly validates filenames (path traversal protection);
static assets get `Cache-Control: no-store`.
- JSON body limit is 2 MB.
@@ -79,13 +103,23 @@ docker compose up --build # Docker variant (compose file is at repo root)
into the current week. Historical weeks keep their own person copies, so
deleting a global person leaves old sessions unaffected no matter what.
- Don't change the column layout without updating both `weekToCsv()` and
- `parseSessionCsv()` (`main.v2.js`), which must stay inverse of each other.
+ `parseSessionCsv()` (`js/csv.js`), which must stay inverse of each other.
## Frontend architecture
-- `main.v2.js` is loaded as a classic non-module `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+