# TaskMate - Projekt-Konfiguration # YAML-Format fuer KI-Assistenten PROJECT: name: TaskMate type: PRODUCTION url: https://taskmate.aegis-sight.de container: taskmate port_external: 3001 port_internal: 3000 gitea: https://gitea-undso.aegis-sight.de/AegisSight/TaskMate USER_PROFILE: programming_skills: NONE support_level: FULL_SERVICE communication: SIMPLE_LANGUAGE COMMUNICATION_RULES: do: - "Alle technischen Aufgaben vollstaendig uebernehmen" - "In einfachen Worten erklaeren was passiert" - "Alle Schritte selbststaendig ausfuehren" - "Status-Updates geben: Aenderung abgeschlossen, teste jetzt..." dont: - "NIEMALS nach technischen Details fragen" - "NIEMALS nach Code-Schnipseln fragen" - "NIEMALS Befehle zum Ausfuehren geben" - "NIEMALS nach Logs oder Console fragen" CRITICAL_RULES: 1_cache_version: "Nach Frontend-Aenderungen: frontend/sw.js CACHE_VERSION erhoehen" 2_changelog_file: "Bei JEDER Aenderung: CHANGELOG.txt aktualisieren" 3_changelog_db: "Bei JEDER Aenderung: Wissensdatenbank Changelog aktualisieren (siehe WORKFLOWS)" 4_no_toISOString: "NIEMALS toISOString() fuer Datums-Operationen (UTC-Problem!)" 5_realtime_updates: "User darf NIE F5 druecken muessen" 6_docker_restart: "Nach Backend-Aenderungen: docker compose up -d --build (NICHT docker restart - das nutzt das alte Image!)" 7_no_css_tricks: "Layout-Aenderungen immer ueber HTML-Struktur loesen, NIEMALS mit CSS-Tricks wie flex-wrap+order, negative margins oder aehnlichem. Wenn ein Element in eine eigene Zeile soll, muss es ein eigenes HTML-Element sein." PROTECTED_DATA: project: "AegisSight" description: "Produktiv im Einsatz - NIEMALS loeschen oder aendern" protected_users: - admin - "Hendrik (hendrik_gebhardt@gmx.de)" - "Monami (momohomma@googlemail.com)" forbidden_actions: - "Nutzerdaten aendern" - "Passwoerter aendern" - "Datenbank-Resets ohne Anweisung" - "Testdaten in Produktivdaten" COMMANDS: restart: "docker restart taskmate" rebuild: "cd /home/claude-dev/TaskMate && docker compose build --no-cache && docker compose up -d" logs: "docker logs taskmate -f --tail 100" health: "curl http://localhost:3000/api/health" copy_frontend: "docker cp frontend/js/ taskmate:/app/public/js/" copy_backend: "docker cp backend/routes/ taskmate:/app/routes/" FILE_STRUCTURE: frontend: core: - "frontend/js/app.js - Hauptanwendung & View-Controller" - "frontend/js/store.js - State Management (Pub-Sub)" - "frontend/js/api.js - API Client mit Auth/CSRF" - "frontend/js/auth.js - Login/Token-Verwaltung" - "frontend/js/sync.js - Socket.io Echtzeit" views: - "frontend/js/board.js - Kanban-Board mit Drag&Drop" - "frontend/js/calendar.js - Kalender (Monat/Woche)" - "frontend/js/list.js - Listenansicht" - "frontend/js/dashboard.js - Statistik-Dashboard" - "frontend/js/proposals.js - Vorschlagssystem" - "frontend/js/knowledge.js - Wissensdatenbank" - "frontend/js/admin.js - Benutzerverwaltung" important: - "frontend/sw.js - Service Worker mit CACHE_VERSION" - "frontend/index.html - Haupt-HTML" backend: core: - "backend/server.js - Express Server mit Socket.io" - "backend/database.js - Datenbankschema (20+ Tabellen)" routes: - "/api/auth - Login/Logout" - "/api/tasks - Aufgaben CRUD" - "/api/projects - Projekte" - "/api/columns - Kanban-Spalten" - "/api/comments - Kommentare" - "/api/files - Datei-Upload" - "/api/proposals - Vorschlaege" - "/api/knowledge - Wissensdatenbank" other: - "CHANGELOG.txt - Aenderungsprotokoll" DATABASE: type: SQLite path: "data/taskmate.db" tables: - users - projects - columns - tasks - task_labels - task_assignees - comments - attachments - proposals - notifications - knowledge_categories - knowledge_entries CODE_PATTERNS: date_formatting: correct: | const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); const dateStr = `${year}-${month}-${day}`; wrong: "date.toISOString().split('T')[0] // NIEMALS - UTC Problem!" toast_messages: correct: | window.dispatchEvent(new CustomEvent('toast:show', { detail: { message: 'Text', type: 'success' } })); wrong: "store.showMessage('Text', 'success') // existiert nicht" realtime_updates: required: | store.subscribe('tasks', () => renderTasks()); window.addEventListener('app:refresh', () => updateView()); TROUBLESHOOTING: frontend_changes_not_visible: problem: "Frontend-Dateien werden beim Build kopiert, nicht live gemountet" solution_dev: "docker cp frontend/js/ taskmate:/app/public/js/" solution_prod: "cd /home/claude-dev/TaskMate && docker compose build --no-cache && docker compose up -d" 401_unauthorized: problem: "Token abgelaufen" solution: "Neu einloggen" csrf_error: problem: "CSRF Token ungueltig" solution: "Browser-Cache/Cookies loeschen, neu einloggen" missing_data: problem: "Daten scheinen verschwunden" first_check: "docker logs taskmate - auf 401/403 Fehler pruefen" note: "NIEMALS sofort Backup/Restore - erst Auth pruefen" WORKFLOWS: changelog_entry: description: "PFLICHT bei jeder Code-Aenderung" step_1: name: "CHANGELOG.txt aktualisieren" file: "/home/claude-dev/TaskMate/CHANGELOG.txt" format: "DD.MM.YYYY - vXXX - Kurzbeschreibung" step_2: name: "Wissensdatenbank Changelog aktualisieren" command: | docker exec taskmate node -e " const Database = require('better-sqlite3'); const db = new Database('/app/data/taskmate.db'); db.prepare(\` INSERT INTO knowledge_entries (category_id, title, notes, position, created_by) VALUES (15, 'DD.MM.YYYY - Beschreibung', 'Markdown-Inhalt', 0, 1) \`).run(); console.log('Changelog erstellt'); " category_id: 15 title_format: "DD.MM.YYYY - Kurze Beschreibung" notes_format: "Markdown mit Details (Problem, Loesung, geaenderte Dateien)" deployment: steps: - "Cache-Version erhoehen: frontend/sw.js" - "CHANGELOG.txt aktualisieren" - "Wissensdatenbank Changelog aktualisieren" - "docker cp oder docker build" - "docker compose up -d (Container mit neuem Image starten)" - "Testen: https://taskmate.aegis-sight.de" - "Browser-Cache leeren (Strg+F5)" CONVENTIONS: language_ui: Deutsch language_code: Englisch umlauts: "ae oe ue verwenden (ä ö ü)" emojis: "Nur in Dokumentation, nicht in Code/UI" auto_save: true SECURITY: auth: type: JWT validity: 24h storage: localStorage csrf: header: "X-CSRF-Token" generated_at: login roles: admin: "Nur Benutzerverwaltung" user: "Alles ausser Admin-Bereich" KNOWN_ISSUES: docker_rebuild: problem: "docker restart nutzt das ALTE Image - Code-Aenderungen werden NICHT uebernommen" wichtig: "docker build allein reicht auch nicht, da docker-compose den alten Container weiter nutzt" solution: "cd /home/claude-dev/TaskMate && docker compose build --no-cache && docker compose up -d" hinweis: "Immer mit --no-cache bauen, da Docker COPY-Layer cached auch wenn Dateien sich geaendert haben" svg_rendering: problem: "createElement() unterstuetzt kein SVG-Namespace" solution: "SVG mit innerHTML oder String-Template einfuegen" field_name_mismatch: problem: "Backend camelCase vs Frontend snake_case" solution: "Fallback-Pattern: data.originalName || data.original_name" file_upload: problem: "Multer Unexpected field Error" solution: "Konsistent 'files' (plural) verwenden" sqlite_wal_mode: problem: "SQLite laeuft im WAL-Modus. Direkte DB-Aenderungen per docker exec werden vom laufenden Server-Prozess nicht sofort gesehen" solution: "Nach direkten DB-Aenderungen immer docker restart taskmate ausfuehren" hinweis: "Betrifft nur manuelle DB-Manipulationen, nicht die API-Endpunkte" ROLLBACK: backup_db: "cp data/taskmate.db data/taskmate.db.backup-$(date +%Y%m%d-%H%M%S)" backup_docker: "docker commit taskmate taskmate-backup-$(date +%Y%m%d-%H%M%S)" restore_code: "git stash && git checkout HEAD~1" Last-Updated: 2026-03-19