From 4a9b276d3cac25ad64cfa113a6fc72ba758c381c Mon Sep 17 00:00:00 2001 From: mARTin-B78 Date: Mon, 7 Sep 2026 08:57:20 +0200 Subject: [PATCH] fix: Build meldet wieder ESLint-Fehler eslint.ignoreDuringBuilds stand auf true, der Build verschluckte also jede Lint-Meldung. Im gesamten Projekt gab es genau zwei echte Errors -- beide "let json" statt "const json" in SettingsSidebar.tsx. Behoben, Schalter aus, next lint endet mit Exit 0. Die 695 Warnungen (470 no-explicit-any, 209 ungenutzte Variablen, 11 unvollstaendige Hook-Abhaengigkeiten) blockieren den Build nicht. Die Hook-Warnungen sind davon die interessantesten, weil daraus echte Bugs entstehen -- stehen als eigener Punkt in TODO.md. Naechster Schritt ist typescript.ignoreBuildErrors; der volle tsc-Lauf dauert wegen WeeklyView.tsx ueber 15 Minuten und laeuft noch. v1.117.4 Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 9 +++++ TODO.md | 54 ++++++++++++++++++++++++++++-- next.config.js | 4 ++- package-lock.json | 4 +-- package.json | 2 +- src/components/SettingsSidebar.tsx | 4 +-- 6 files changed, 68 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f4b5713..557305a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,15 @@ All notable changes to this project are documented in this file. +## [1.117.4] - 2026-09-07 + +### Fixed +- Der Build meldet wieder ESLint-Fehler: `eslint.ignoreDuringBuilds` steht auf `false`. + Es waren nur **zwei** echte Errors im gesamten Projekt (`let json` statt `const json` in + `SettingsSidebar.tsx`), beide behoben. `next lint` endet jetzt mit Exit 0. + Die 695 Warnungen — 470-mal `no-explicit-any`, 209 ungenutzte Variablen, 11 unvollständige + Hook-Abhängigkeiten — blockieren den Build nicht und werden fortlaufend abgebaut. + ## [1.117.3] - 2026-09-06 ### Security diff --git a/TODO.md b/TODO.md index 42f476a..93a1090 100644 --- a/TODO.md +++ b/TODO.md @@ -97,12 +97,16 @@ Anleitung siehe [`docs/secret-rotation.md`](docs/secret-rotation.md). ## Block C — Build und Typsicherheit ### C1. Build darf Fehler nicht mehr verschlucken (Audit 1) -- [ ] **Schritt 1:** `eslint.ignoreDuringBuilds` in `next.config.js` auf `false` -- [ ] Gemeldete ESLint-Fehler abarbeiten +- [x] **Schritt 1:** `eslint.ignoreDuringBuilds` in `next.config.js` auf `false` +- [x] Gemeldete ESLint-Fehler abarbeiten — es waren nur **2** (`prefer-const` in + `SettingsSidebar.tsx`), verifiziert: `next lint` endet jetzt mit Exit 0 - [ ] **Schritt 2:** `npm run type-check` laufen lassen, Fehlerzahl notieren - [ ] Fehler abarbeiten — modulweise, nicht auf einmal - [ ] **Schritt 3:** `typescript.ignoreBuildErrors` auf `false` -- [ ] `any`-Stellen reduzieren (aktuell **452**) — fortlaufend, kein Blocker +- [ ] `any`-Stellen reduzieren — ESLint zählt **470** `no-explicit-any` — fortlaufend, kein Blocker +- [ ] **209** ungenutzte Variablen (`no-unused-vars`) aufräumen — fortlaufend +- [ ] **11** unvollständige Hook-Abhängigkeiten (`react-hooks/exhaustive-deps`) prüfen — + die sind die gefährlichsten der Warnungen, weil daraus echte Bugs entstehen **Warum:** `next.config.js` hat `ignoreDuringBuilds: true` **und** `ignoreBuildErrors: true`. `tsconfig.json` sagt zwar `strict: true`, das ist aber wirkungslos, weil der Build die Fehler @@ -229,6 +233,50 @@ F1. Kommt etwas anderes heraus, wurde es längst getauscht und du kannst F1 abha --- +## Block G — Infrastruktur (Supabase-LXC 201) + +### G1. Container läuft privilegiert *(Sicherheitsthema)* +- [ ] Entscheiden, ob `unprivileged: 0` so bleiben soll +- [ ] Falls nicht: Container neu aufsetzen und Daten übernehmen + +**Warum:** `pct config 201` meldet `unprivileged: 0`. Wer aus diesem Container ausbricht, ist +**root auf dem NUC** — bei einem Container, der die Datenbank betreibt, die relevantere +Baustelle als ein fehlendes Root-Passwort. Meist wird das umgestellt, weil Docker im +unprivilegierten Container zickt; nachvollziehbar, aber ein bewusster Kompromiss. + +### G2. Besitzverhältnisse im Dateisystem sind schief +- [ ] Kurzfix, falls SSH-Zugang zum Container gebraucht wird: + `pct exec 201 -- chown 0:0 /etc/passwd` und `pct exec 201 -- chown 0:42 /etc/shadow` +- [ ] Langfristig: Container sauber neu aufsetzen + +**Warum:** Das Dateisystem stammt aus einem **unprivilegierten** Container (alles liegt mit +UID 100000 auf der Platte), läuft aber jetzt **privilegiert**, also ohne UID-Mapping. root +besitzt dadurch praktisch keine Datei im System. Zeitstempel belegen es: alles vom 26.02.2026 +mit UID 100000, nur `/etc/hostname` vom 06.09. mit `0:0` — das schreibt Proxmox von außen. + +Symptom war `passwd: Authentication token manipulation error`. Das System läuft trotzdem, +weil root per `CAP_DAC_OVERRIDE` die Rechteprüfung überspringt; Werkzeuge wie `passwd`, die +strenger prüfen, fallen darüber. Weitere solche Merkwürdigkeiten sind zu erwarten. + +⚠️ **Kein `chown -R` über das ganze Dateisystem** — nicht am laufenden Container und schon +gar nicht mit Docker darin. Postgres und die Supabase-Container haben eigene UIDs (999, 70, …), +die dabei zerschossen würden. + +**Kein Blocker:** `pct enter 201` gibt jederzeit eine Root-Shell ohne Passwort. Ein +Root-Passwort wird nur für direkten SSH-Zugang gebraucht. + +### G3. Supabase Studio ist nicht erreichbar +- [ ] Auf 201 prüfen: `docker compose ps` — laufen die Container? +- [ ] Port klären: Studio hängt hinter Kong auf **8000**, nicht 8001 +- [ ] `scripts/supabase-setup.sh` korrigieren: falsche Port-Ausgabe und Shebang `#!/bash` + +**Warum:** `http://:8001` antwortet nicht. Die Zahl stammt aus einer `echo`-Zeile in +`scripts/supabase-setup.sh`, die nirgends eine Portfreigabe setzt — beim offiziellen +`supabase/docker`-Stack ist Studio nur über Kong auf 8000 erreichbar. Zusätzlich hat das +Skript `#!/bash` statt `#!/bin/bash` und ist so gar nicht direkt ausführbar. + +--- + ## Kleinkram (ohne Eile) - [ ] 114 `console.log` aus dem Produktionscode entfernen (die 275 `console.error` sind in Ordnung) diff --git a/next.config.js b/next.config.js index 81b715f..3aaa26d 100644 --- a/next.config.js +++ b/next.config.js @@ -4,7 +4,9 @@ const { version } = require('./package.json'); const nextConfig = { output: 'standalone', eslint: { - ignoreDuringBuilds: true, + // Aus: Der Build soll ESLint-Fehler melden. Warnungen (aktuell ~695, überwiegend + // no-explicit-any) blockieren den Build nicht — nur Errors tun das. + ignoreDuringBuilds: false, }, typescript: { ignoreBuildErrors: true, diff --git a/package-lock.json b/package-lock.json index 543f97b..72e51ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "my-weekly-todo-list", - "version": "1.117.3", + "version": "1.117.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "my-weekly-todo-list", - "version": "1.117.3", + "version": "1.117.4", "license": "MIT", "dependencies": { "@auth/prisma-adapter": "^2.11.1", diff --git a/package.json b/package.json index 52a5f11..b54c83a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "my-weekly-todo-list", - "version": "1.117.3", + "version": "1.117.4", "description": "A web-based weekly task management application that organizes to-dos and calendar events in a single, intuitive weekly view", "main": "index.js", "scripts": { diff --git a/src/components/SettingsSidebar.tsx b/src/components/SettingsSidebar.tsx index 4d3fd71..1079599 100644 --- a/src/components/SettingsSidebar.tsx +++ b/src/components/SettingsSidebar.tsx @@ -3645,7 +3645,7 @@ function SettingsSidebar({ reader.onload = async (evt) => { try { const text = evt.target?.result as string; - let json = JSON.parse(text); + const json = JSON.parse(text); // Normalizing standard terminal formats to a consistent internal format const normalized: any = { @@ -3727,7 +3727,7 @@ function SettingsSidebar({ reader.onload = async (evt) => { try { const text = evt.target?.result as string; - let json = JSON.parse(text); + const json = JSON.parse(text); const normalized: any = { background: json.background,