Protokoll #14613
| ID | 14613 |
|---|---|
| Zeitstempel | 2025-12-25 11:06:33.965400 |
| Client | root |
| IP | Warning: Undefined array key "request_ip" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 13 Deprecated: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 13 |
| Modell | claude-sonnet-4-20250514 |
| Status | completed |
| Tokens | 2,708 (Input: 0, Output: 0) |
| Dauer | 94 ms |
| Request-Zeit | Warning: Undefined array key "request_timestamp" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 18 |
| Response-Zeit | - |
Warning: Undefined array key "error_message" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 22
Request
{
"event": "PreToolUse",
"tool_name": "Read",
"tool_input": {
"file_path": "\/var\/www\/scripts\/contract-check.sh"
}
}
Response
{
"tool_response": {
"type": "text",
"file": {
"filePath": "\/var\/www\/scripts\/contract-check.sh",
"content": "#!\/bin\/bash\n# =============================================================================\n# CONTRACT VALIDATION - Pre-Sync Hook\n# =============================================================================\n# Validiert alle aktiven Contracts vor dem Sync zu Produktion\n# Verwendung: \/var\/www\/scripts\/contract-check.sh [path]\n# Exit-Codes: 0 = OK, 1 = Critical Violations, 2 = Major Violations\n# =============================================================================\n\nset -e\n\n# Konfiguration\nTARGET=\"${1:-\/var\/www\/dev.campus.systemische-tools.de}\"\nCONTRACTS_DIR=\"\/var\/www\/docs\/contracts\"\n\n# Farben\nRED='\\033[0;31m'\nGREEN='\\033[0;32m'\nYELLOW='\\033[1;33m'\nBLUE='\\033[0;34m'\nNC='\\033[0m'\n\n# Zähler\nCRITICAL_COUNT=0\nMAJOR_COUNT=0\nMINOR_COUNT=0\n\necho -e \"${BLUE}=== Contract Validation ===${NC}\"\necho \"Target: $TARGET\"\necho \"Contracts: $CONTRACTS_DIR\"\necho \"\"\n\n# =============================================================================\n# 1. VIEW STRUCTURE CONTRACT v1.0\n# =============================================================================\necho -e \"${BLUE}[1\/6] View Structure Contract v1.0${NC}\"\n\ncheck_view_structure() {\n local resource=$1\n local view_dir=\"$TARGET\/src\/View\/$resource\"\n local errors=0\n\n # Prüfe ob alle 4 Views existieren\n for view in index.php show.php new.php edit.php; do\n if [[ ! -f \"$view_dir\/$view\" ]]; then\n echo -e \" ${RED}CRITICAL:${NC} $resource\/$view fehlt\"\n ((CRITICAL_COUNT++))\n ((errors++))\n fi\n done\n\n # Prüfe verbotene Elemente\n if [[ -f \"$view_dir\/index.php\" ]]; then\n if grep -q 'class=\"page-container\"' \"$view_dir\/index.php\" 2>\/dev\/null; then\n echo -e \" ${RED}CRITICAL:${NC} $resource\/index.php enthält page-container (FRB-001)\"\n ((CRITICAL_COUNT++))\n ((errors++))\n fi\n if grep -q 'class=\"page-header\"' \"$view_dir\/index.php\" 2>\/dev\/null; then\n echo -e \" ${RED}CRITICAL:${NC} $resource\/index.php enthält page-header (FRB-002)\"\n ((CRITICAL_COUNT++))\n ((errors++))\n fi\n fi\n\n # Prüfe show.php auf Breadcrumb\n if [[ -f \"$view_dir\/show.php\" ]]; then\n if ! grep -q 'class=\"breadcrumb\"' \"$view_dir\/show.php\" 2>\/dev\/null; then\n echo -e \" ${RED}CRITICAL:${NC} $resource\/show.php fehlt Breadcrumb (SHW-001)\"\n ((CRITICAL_COUNT++))\n ((errors++))\n fi\n fi\n\n # Prüfe new.php auf Formular-Struktur\n if [[ -f \"$view_dir\/new.php\" ]]; then\n if ! grep -q 'class=\"form\"' \"$view_dir\/new.php\" 2>\/dev\/null; then\n echo -e \" ${RED}CRITICAL:${NC} $resource\/new.php fehlt class=\\\"form\\\" (NEW-001)\"\n ((CRITICAL_COUNT++))\n ((errors++))\n fi\n if grep -q 'class=\"form-section\"' \"$view_dir\/new.php\" 2>\/dev\/null; then\n echo -e \" ${RED}CRITICAL:${NC} $resource\/new.php enthält form-section (NEW-002)\"\n ((CRITICAL_COUNT++))\n ((errors++))\n fi\n fi\n\n # Prüfe edit.php auf Breadcrumb mit Link\n if [[ -f \"$view_dir\/edit.php\" ]]; then\n if ! grep -q 'class=\"breadcrumb\"' \"$view_dir\/edit.php\" 2>\/dev\/null; then\n echo -e \" ${RED}CRITICAL:${NC} $resource\/edit.php fehlt Breadcrumb (EDT-001)\"\n ((CRITICAL_COUNT++))\n ((errors++))\n fi\n fi\n\n if [[ $errors -eq 0 ]]; then\n echo -e \" ${GREEN}OK${NC} $resource\/*\"\n fi\n}\n\n# Prüfe alle CRUD-Ressourcen aus dem Contract\nfor resource in tasks content; do\n check_view_structure \"$resource\"\ndone\n\necho \"\"\n\n# =============================================================================\n# 2. HTML TABLES CONTRACT v1.0\n# =============================================================================\necho -e \"${BLUE}[2\/6] HTML Tables Contract v1.0${NC}\"\n\ncheck_html_tables() {\n local file=$1\n local name=$(basename \"$file\")\n local errors=0\n\n # NAV-001: Keine Aktionen-Spalte mit Details-Button\n if grep -qE '<th[^>]*>Aktionen<\/th>' \"$file\" 2>\/dev\/null; then\n echo -e \" ${RED}CRITICAL:${NC} $name enthält Aktionen-Spalte (NAV-001)\"\n ((CRITICAL_COUNT++))\n ((errors++))\n fi\n\n # NAV-002: Keine Modals\n if grep -qE 'id=\"modal\"|class=\"modal\"' \"$file\" 2>\/dev\/null; then\n echo -e \" ${RED}CRITICAL:${NC} $name enthält Modal (NAV-002)\"\n ((CRITICAL_COUNT++))\n ((errors++))\n fi\n\n # COL-001: Tabellen sollten data-sortable haben\n if grep -q '<table' \"$file\" 2>\/dev\/null; then\n if ! grep -q 'data-sortable' \"$file\" 2>\/dev\/null; then\n # Nur warnen wenn es keine einfache Metadaten-Tabelle ist\n if grep -qE '<th[^>]*>ID<\/th>' \"$file\" 2>\/dev\/null; then\n echo -e \" ${YELLOW}MAJOR:${NC} $name Tabelle fehlt data-sortable (COL-001)\"\n ((MAJOR_COUNT++))\n ((errors++))\n fi\n fi\n fi\n\n return $errors\n}\n\n# Prüfe CRUD Views\nfor resource in tasks content; do\n for view in \"$TARGET\/src\/View\/$resource\"\/*.php; do\n if [[ -f \"$view\" ]]; then\n check_html_tables \"$view\"\n fi\n done\ndone\n\necho -e \" ${GREEN}OK${NC} HTML Tables geprüft\"\necho \"\"\n\n# =============================================================================\n# 3. CSS CONTRACT v1.0 (via css-check.sh)\n# =============================================================================\necho -e \"${BLUE}[3\/6] CSS Contract v1.0${NC}\"\n\nif [[ -x \/var\/www\/scripts\/css-check.sh ]]; then\n if \/var\/www\/scripts\/css-check.sh \"$TARGET\" > \/dev\/null 2>&1; then\n echo -e \" ${GREEN}OK${NC} Stylelint passed\"\n else\n echo -e \" ${YELLOW}MAJOR:${NC} CSS-Fehler gefunden (siehe css-check.sh)\"\n ((MAJOR_COUNT++))\n fi\nelse\n echo -e \" ${YELLOW}SKIP${NC} css-check.sh nicht verfügbar\"\nfi\n\necho \"\"\n\n# =============================================================================\n# 4. PYTHON PIPELINE CONTRACT v1.0 (via python-check.sh)\n# =============================================================================\necho -e \"${BLUE}[4\/6] Python Pipeline Contract v1.0${NC}\"\n\nif [[ -x \/var\/www\/scripts\/python-check.sh ]]; then\n if \/var\/www\/scripts\/python-check.sh > \/dev\/null 2>&1; then\n echo -e \" ${GREEN}OK${NC} Ruff + mypy passed\"\n else\n echo -e \" ${YELLOW}MAJOR:${NC} Python-Fehler gefunden (siehe python-check.sh)\"\n ((MAJOR_COUNT++))\n fi\nelse\n echo -e \" ${YELLOW}SKIP${NC} python-check.sh nicht verfügbar\"\nfi\n\necho \"\"\n\n# =============================================================================\n# 5. LAYERED ARCHITECTURE CONTRACT v1.0\n# =============================================================================\necho -e \"${BLUE}[5\/6] Layered Architecture Contract v1.0${NC}\"\n\ncheck_layer_violations() {\n local errors=0\n\n # Prüfe: Domain darf nicht Infrastructure importieren\n if grep -rq 'use Infrastructure\\\\' \"$TARGET\/src\/Domain\/\" 2>\/dev\/null; then\n echo -e \" ${RED}CRITICAL:${NC} Domain importiert Infrastructure\"\n ((CRITICAL_COUNT++))\n ((errors++))\n fi\n\n # Prüfe: src darf nicht app importieren\n if grep -rq 'use App\\\\' \"$TARGET\/src\/\" 2>\/dev\/null; then\n echo -e \" ${RED}CRITICAL:${NC} src importiert App\"\n ((CRITICAL_COUNT++))\n ((errors++))\n fi\n\n # Prüfe: Presenter nicht in src\n if find \"$TARGET\/src\" -name \"*Presenter*.php\" 2>\/dev\/null | grep -q .; then\n echo -e \" ${RED}CRITICAL:${NC} Presenter in \/src gefunden (gehört nach \/app)\"\n ((CRITICAL_COUNT++))\n ((errors++))\n fi\n\n # Prüfe: Controller nicht in app\n if find \"$TARGET\/app\" -name \"*Controller*.php\" 2>\/dev\/null | grep -q .; then\n echo -e \" ${RED}CRITICAL:${NC} Controller in \/app gefunden (gehört nach \/src)\"\n ((CRITICAL_COUNT++))\n ((errors++))\n fi\n\n if [[ $errors -eq 0 ]]; then\n echo -e \" ${GREEN}OK${NC} Layer-Grenzen eingehalten\"\n fi\n}\n\ncheck_layer_violations\n\necho \"\"\n\n# =============================================================================\n# 6. BETRIEBSDOKUMENTATION CONTRACT v1.1\n# =============================================================================\necho -e \"${BLUE}[6\/6] Betriebsdokumentation Contract v1.1${NC}\"\n\ncheck_docs_structure() {\n local docs_dir=\"$TARGET\/src\/View\/docs\"\n local errors=0\n\n # Prüfe: Alle Docs haben Breadcrumb\n for doc in \"$docs_dir\"\/**\/*.php; do\n if [[ -f \"$doc\" && \"$doc\" != *\"layout.php\" && \"$doc\" != *\"index.php\" ]]; then\n if ! grep -q 'class=\"breadcrumb\"' \"$doc\" 2>\/dev\/null; then\n local name=$(echo \"$doc\" | sed \"s|$docs_dir\/||\")\n echo -e \" ${YELLOW}MAJOR:${NC} $name fehlt Breadcrumb\"\n ((MAJOR_COUNT++))\n ((errors++))\n fi\n fi\n done\n\n # Prüfe: Alle Docs haben h1\n for doc in \"$docs_dir\"\/**\/*.php; do\n if [[ -f \"$doc\" && \"$doc\" != *\"layout.php\" ]]; then\n if ! grep -q '<h1>' \"$doc\" 2>\/dev\/null; then\n local name=$(echo \"$doc\" | sed \"s|$docs_dir\/||\")\n echo -e \" ${YELLOW}MAJOR:${NC} $name fehlt h1\"\n ((MAJOR_COUNT++))\n ((errors++))\n fi\n fi\n done\n\n if [[ $errors -eq 0 ]]; then\n echo -e \" ${GREEN}OK${NC} Dokumentation strukturell korrekt\"\n fi\n}\n\ncheck_docs_structure\n\necho \"\"\n\n# =============================================================================\n# ERGEBNIS\n# =============================================================================\necho -e \"${BLUE}=== Ergebnis ===${NC}\"\necho \"Critical: $CRITICAL_COUNT\"\necho \"Major: $MAJOR_COUNT\"\necho \"Minor: $MINOR_COUNT\"\necho \"\"\n\n# Pass-Threshold aus Contracts\n# critical_violations_max: 0\n# major_violations_max: 2\n\nif [[ $CRITICAL_COUNT -gt 0 ]]; then\n echo -e \"${RED}FAILED: $CRITICAL_COUNT kritische Violations${NC}\"\n echo \"Sync zu Produktion BLOCKIERT.\"\n exit 1\nelif [[ $MAJOR_COUNT -gt 2 ]]; then\n echo -e \"${YELLOW}WARNING: $MAJOR_COUNT major Violations (max 2 erlaubt)${NC}\"\n echo \"Sync zu Produ... [TRUNCATED-b7d909d2fa693a5e]",
"numLines": 309,
"startLine": 1,
"totalLines": 309
}
}
}