{
"event": "PostToolUse",
"tool_name": "Read",
"tool_response": {
"type": "text",
"file": {
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/src\/View\/docs\/code.php",
"content": "<?php\n\ndeclare(strict_types=1);\n\n\/\/ @responsibility: View für Code-Analyse-Übersicht\n\nob_start(); ?>\n\n<h1>Code Hygiene<\/h1>\n\n<div class=\"stats-grid\">\n <div class=\"stat-card\">\n <span class=\"stat-card__value\"><?= $stats['total_files'] ?? 0 ?><\/span>\n <span class=\"stat-card__label\">Dateien<\/span>\n <\/div>\n <div class=\"stat-card stat-card--info\">\n <span class=\"stat-card__value\"><?= $stats['total_classes'] ?? 0 ?><\/span>\n <span class=\"stat-card__label\">Klassen<\/span>\n <\/div>\n <div class=\"stat-card stat-card--success\">\n <span class=\"stat-card__value\"><?= $stats['total_functions'] ?? 0 ?><\/span>\n <span class=\"stat-card__label\">Funktionen<\/span>\n <\/div>\n <div class=\"stat-card stat-card--warning\">\n <span class=\"stat-card__value\"><?= number_format(($stats['total_lines'] ?? 0)) ?><\/span>\n <span class=\"stat-card__label\">Zeilen<\/span>\n <\/div>\n<\/div>\n\n<div class=\"page-actions\" style=\"margin: 1.5rem 0; display: flex; align-items: center; gap: 0.75rem; flex-wrap: wrap;\">\n <button id=\"scan-btn\"\n class=\"btn btn--primary\"\n hx-post=\"\/docs\/code-hygiene\/scan\"\n hx-headers='{\"X-CSRF-TOKEN\": \"<?= $csrfToken ?>\"}'\n hx-target=\"#scan-result\"\n hx-swap=\"innerHTML\"\n hx-indicator=\"#scan-spinner\">\n Jetzt scannen\n <\/button>\n <a href=\"\/docs\/code-hygiene\/graph\" class=\"btn btn--secondary\">Projekt-Graph<\/a>\n <span id=\"scan-spinner\" class=\"htmx-indicator\">Scanning...<\/span>\n <span id=\"scan-result\"><\/span>\n <?php if ($stats['last_scan']): ?>\n <small style=\"color: var(--text-muted);\">\n Letzter Scan: <?= substr($stats['last_scan'], 0, 16) ?>\n <\/small>\n <?php endif; ?>\n<\/div>\n\n<h2>Dateien<\/h2>\n\n<div class=\"filters\" style=\"margin-bottom: 1rem; display: flex; gap: 0.5rem; flex-wrap: wrap;\">\n <input type=\"search\"\n id=\"file-search\"\n class=\"form-input\"\n placeholder=\"Suche...\"\n value=\"<?= htmlspecialchars($currentFilters['search'] ?? '') ?>\"\n style=\"max-width: 200px;\">\n\n <select id=\"filter-directory\" class=\"form-select--inline\">\n <option value=\"\">Alle Verzeichnisse<\/option>\n <?php foreach ($filterOptions['directories'] ?? [] as $dir): ?>\n <option value=\"<?= htmlspecialchars($dir) ?>\" <?= ($currentFilters['directory'] ?? '') === $dir ? 'selected' : '' ?>>\n <?= htmlspecialchars(str_replace('\/var\/www\/dev.campus.systemische-tools.de\/', '', $dir)) ?>\n <\/option>\n <?php endforeach; ?>\n <\/select>\n\n <select id=\"filter-namespace\" class=\"form-select--inline\">\n <option value=\"\">Alle Namespaces<\/option>\n <?php foreach ($filterOptions['namespaces'] ?? [] as $ns): ?>\n <option value=\"<?= htmlspecialchars($ns) ?>\" <?= ($currentFilters['namespace'] ?? '') === $ns ? 'selected' : '' ?>>\n <?= htmlspecialchars($ns) ?>\n <\/option>\n <?php endforeach; ?>\n <\/select>\n\n <select id=\"filter-has-classes\" class=\"form-select--inline\">\n <option value=\"\">Alle<\/option>\n <option value=\"1\" <?= ($currentFilters['has_classes'] ?? '') === '1' ? 'selected' : '' ?>>Mit Klassen<\/option>\n <option value=\"0\" <?= ($currentFilters['has_classes'] ?? '') === '0' ? 'selected' : '' ?>>Ohne Klassen<\/option>\n <\/select>\n\n<\/div>\n\n<?php if (empty($files)): ?>\n<div class=\"empty-state\" style=\"padding: 2rem; text-align: center; background: var(--bg-secondary); border-radius: 8px;\">\n <p>Keine Dateien gefunden. Klicke auf \"Jetzt scannen\" um die Hygiene-Analyse zu starten.<\/p>\n<\/div>\n<?php else: ?>\n<table id=\"code-table\" data-sortable class=\"data-table\">\n <thead>\n <tr>\n <th data-sort=\"file_name\">Datei<\/th>\n <th data-sort=\"namespace\">Namespace<\/th>\n <th data-sort=\"directory\">Verzeichnis<\/th>\n <th data-sort=\"classes_count\" style=\"text-align: center;\">Klassen<\/th>\n <th data-sort=\"functions_count\" style=\"text-align: center;\">Funktionen<\/th>\n <th data-sort=\"line_count\" style=\"text-align: right;\">Zeilen<\/th>\n <th data-sort=\"hygiene_score\" style=\"text-align: center;\">Score<\/th>\n <th data-sort=\"issues_count\" style=\"text-align: center;\">Issues<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <?php foreach ($files as $file):\n $classes = json_decode($file['classes'] ?? '[]', true);\n $functions = json_decode($file['functions'] ?? '[]', true);\n $shortDir = str_replace('\/var\/www\/dev.campus.systemische-tools.de\/', '', $file['directory']);\n $hygieneScore = $file['hygiene_score'] ?? null;\n ?>\n <tr>\n <td>\n <a href=\"\/docs\/code-hygiene\/<?= $file['id'] ?>\">\n <?= htmlspecialchars($file['file_name']) ?>\n <\/a>\n <?php if ($file['parse_error']): ?>\n <span class=\"badge badge--danger\" title=\"<?= htmlspecialchars($file['parse_error']) ?>\">!<\/span>\n <?php endif; ?>\n <\/td>\n <td><?= htmlspecialchars($file['namespace'] ?? '-') ?><\/td>\n <td title=\"<?= htmlspecialchars($file['directory']) ?>\"><?= htmlspecialchars($shortDir) ?><\/td>\n <td style=\"text-align: center;\">\n <?php if (count($classes) > 0): ?>\n <span class=\"badge badge--info\"><?= count($classes) ?><\/span>\n <?php else: ?>\n -\n <?php endif; ?>\n <\/td>\n <td style=\"text-align: center;\">\n <?php if (count($functions) > 0): ?>\n <span class=\"badge badge--success\"><?= count($functions) ?><\/span>\n <?php else: ?>\n -\n <?php endif; ?>\n <\/td>\n <td style=\"text-align: right;\"><?= number_format($file['line_count']) ?><\/td>\n <td style=\"text-align: center;\">\n <?php if ($hygieneScore !== null): ?>\n <?= $hygieneScore ?>\n <?php else: ?>\n -\n <?php endif; ?>\n <\/td>\n <td style=\"text-align: center;\">\n <?php if (($file['issues_count'] ?? 0) > 0): ?>\n <span class=\"badge badge--danger\"><?= $file['issues_count'] ?><\/span>\n <?php else: ?>\n <span class=\"badge badge--success\">0<\/span>\n <?php endif; ?>\n <\/td>\n <\/tr>\n <?php endforeach; ?>\n <\/tbody>\n<\/table>\n<?php endif; ?>\n\n<script type=\"module\">\nimport { init } from '\/js\/components\/data-table.js';\n\nconst dataTable = init({\n clock: { now_epoch_ms_utc: () => Date.now() },\n logger: console,\n ui: { showMessage: (msg) => console.log(msg) }\n});\n\ndataTable.create('code-table', {\n searchInput: 'file-search',\n pageSize: 50,\n filters: {\n 'filter-directory': 2,\n 'filter-namespace': 1,\n 'filter-has-classes': 3\n }\n});\n\ndocument.body.addEventListener('htmx:afterRequest', function(evt) {\n if (evt.detail.elt.id === 'scan-btn') {\n try {\n const response = JSON.parse(evt.detail.xhr.responseText);\n if (response.success) {\n document.getElementById('scan-result').innerHTML =\n '<span class=\"badge badge--success\">' +\n response.files_scanned + ' Dateien, ' +\n response.total_classes + ' Klassen, ' +\n response.total_functions + ' Funktionen (' +\n response.duration_ms + 'ms)<\/span>';\n setTimeout(() => location.reload(), 1500);\n }\n } catch (e) {\n document.getElementById('scan-result').innerHTML =\n '<span class=\"badge badge--danger\">Fehler beim Scan<\/span>';\n }\n }\n});\n<\/script>\n\n<?php $content = ob_get_clean(); ?>\n<?php require VIEW_PATH . '\/layout.php'; ?>\n",
"numLines": 199,
"startLine": 1,
"totalLines": 199
}
}
}