{
"event": "PreToolUse",
"tool_name": "Bash",
"tool_input": {
"command": "mysql -u root -pv8mFLmkF2fth_r -D ki_dev -e \"SELECT yaml_content FROM contracts WHERE name = 'View Structure Contract' AND status = 'active';\" 2>\/dev\/null | tail -n +2",
"description": "Get View Structure Contract"
}
}
{
"tool_response": {
"stdout": "contract:\\n name: \"View Structure Contract\"\\n version: \"1.0\"\\n status: active\\n created: \"2025-12-20\"\\n scope:\\n description: \"Gilt für CRUD-Ressourcen mit Standard-Views (index, show, new, edit)\"\\n includes:\\n - \"\/src\/View\/tasks\/*.php\"\\n - \"\/src\/View\/content\/*.php\"\\n # Bei neuer CRUD-Ressource hier hinzufügen: \"\/src\/View\/{resource}\/*.php\"\\n excludes:\\n - \"\/src\/View\/docs\/**\/*.php\" # Eigener Contract: Betriebsdokumentation\\n - \"\/src\/View\/chat\/**\/*.php\" # Interaktives Tool, kein CRUD\\n - \"\/src\/View\/home\/**\/*.php\" # Landing Pages\\n - \"\/src\/View\/layout.php\" # Layout-Template\\n onboarding: |\\n Neue CRUD-Ressource hinzufügen:\\n 1. Verzeichnis erstellen: \/src\/View\/{resource}\/\\n 2. Views anlegen: index.php, show.php, new.php, edit.php\\n 3. Contract-Scope erweitern: includes += \"\/src\/View\/{resource}\/*.php\"\\n 4. Referenz: \/src\/View\/tasks\/* als Vorlage kopieren\\n principles:\\n - KISS # Keep It Simple, Stupid\\n - DRY # Don't Repeat Yourself\\n - REST # Representational State Transfer\\n - SRP # Single Responsibility Principle\\n\\n# =============================================================================\\n# RESTful URL Schema\\n# =============================================================================\\nrestful_urls:\\n description: \"Jede Ressource folgt dem gleichen URL-Pattern\"\\n pattern:\\n index: \"\/{resource}\"\\n show: \"\/{resource}\/{id}\"\\n new: \"\/{resource}\/new\"\\n edit: \"\/{resource}\/{id}\/edit\"\\n\\n rules:\\n - id: URL-001\\n severity: critical\\n rule: \"Keine \/create URLs - verwende \/new\"\\n example:\\n wrong: \"\/content\/create\"\\n correct: \"\/content\/new\"\\n\\n - id: URL-002\\n severity: critical\\n rule: \"Keine \/update oder \/delete URLs - verwende HTTP-Methoden\"\\n example:\\n wrong: \"\/tasks\/1\/update\"\\n correct: \"PUT \/api\/v1\/tasks\/1\"\\n\\n - id: URL-003\\n severity: major\\n rule: \"Ressourcen-Namen im Plural\"\\n example:\\n wrong: \"\/task\/1\"\\n correct: \"\/tasks\/1\"\\n\\n# =============================================================================\\n# View-Dateien pro Ressource\\n# =============================================================================\\nview_files:\\n description: \"Jede Ressource hat 4 Standard-Views\"\\n required:\\n - index.php # Liste aller Einträge\\n - show.php # Detail-Ansicht eines Eintrags\\n - new.php # Formular für neuen Eintrag\\n - edit.php # Formular zum Bearbeiten\\n\\n directory_pattern: \"\/src\/View\/{resource}\/\"\\n\\n examples:\\n - \"\/src\/View\/tasks\/index.php\"\\n - \"\/src\/View\/tasks\/show.php\"\\n - \"\/src\/View\/content\/new.php\"\\n - \"\/src\/View\/content\/edit.php\"\\n\\n# =============================================================================\\n# Seitenstruktur: INDEX (Liste)\\n# =============================================================================\\nindex_structure:\\n description: \"Listenansicht aller Einträge einer Ressource\"\\n\\n elements_order:\\n 1: h1 # Titel der Ressource\\n 2: stats-grid # Statistik-Karten (optional)\\n 3: page-actions # Button für \"Neu erstellen\"\\n 4: h2 # Untertitel vor Tabelle\\n 5: filters # Suchfeld + Filter-Dropdowns\\n 6: table # Datentabelle\\n 7: links-bar # Links zu Dokumentation\\n\\n template: |\\n <?php ob_start(); ?>\\n\\n <h1>{Ressource}<\/h1>\\n\\n <div class=\"stats-grid\">\\n <div class=\"stat-card\">...<\/div>\\n <div class=\"stat-card stat-card--warning\">...<\/div>\\n <div class=\"stat-card stat-card--info\">...<\/div>\\n <div class=\"stat-card stat-card--success\">...<\/div>\\n <\/div>\\n\\n <div class=\"page-actions\">\\n <a href=\"\/{resource}\/new\" class=\"btn btn--primary\">Neu erstellen<\/a>\\n <\/div>\\n\\n <h2>{Einträge}<\/h2>\\n <div class=\"filters\">\\n <input type=\"search\" id=\"{resource}-search\" class=\"form-input\" placeholder=\"Durchsuchen...\">\\n <select id=\"filter-status\" class=\"form-select--inline\">...<\/select>\\n <\/div>\\n\\n <table id=\"{resource}-table\" data-sortable>\\n <thead>\\n <tr>\\n <th data-sort=\"id\">ID<\/th>\\n <th data-sort=\"title\">Titel<\/th>\\n ...\\n <\/tr>\\n <\/thead>\\n <tbody>...<\/tbody>\\n <\/table>\\n\\n <p class=\"links-bar\">\\n <a href=\"\/docs\/{resource}\">Dokumentation<\/a> |\\n <a href=\"\/docs\/api\/{resource}\">API<\/a>\\n <\/p>\\n\\n <script src=\"\/js\/components\/data-table.js\"><\/script>\\n <script>\\n document.addEventListener('DOMContentLoaded', () => {\\n new DataTable('{resource}-table', {...});\\n });\\n <\/script>\\n\\n <?php $content = ob_get_clean(); ?>\\n <?php require VIEW_PATH . '\/layout.php'; ?>\\n\\n rules:\\n - id: IDX-001\\n severity: critical\\n rule: \"Kein page-container Wrapper\"\\n example:\\n wrong: '<div class=\"page-container\">...'\\n correct: \"<h1>Tasks<\/h1>\"\\n\\n - id: IDX-002\\n severity: critical\\n rule: \"Keine verschachtelten Cards\"\\n example:\\n wrong: '<div class=\"card\"><div class=\"card\">...'\\n correct: \"Flache Struktur ohne Card-Wrapper\"\\n\\n - id: IDX-003\\n severity: major\\n rule: \"stats-grid hat genau 4 Karten\"\\n cards:\\n - stat-card (neutral\/gesamt)\\n - stat-card--warning (offen\/pending)\\n - stat-card--info (in Arbeit)\\n - stat-card--success (fertig\/abgeschlossen)\\n\\n - id: IDX-004\\n severity: major\\n rule: \"Tabelle muss DataTable-Komponente verwenden\"\\n requires:\\n - data-sortable Attribut\\n - Suchfeld\\n - JavaScript-Initialisierung\\n\\n# =============================================================================\\n# Seitenstruktur: SHOW (Detail)\\n# =============================================================================\\nshow_structure:\\n description: \"Detail-Ansicht eines einzelnen Eintrags\"\\n\\n elements_order:\\n 1: breadcrumb # Navigation zurück\\n 2: h1 # Titel des Eintrags\\n 3: table # Metadaten-Tabelle\\n 4: h2+content # Inhaltsbereiche (Beschreibung, etc.)\\n 5: h2+actions # Aktions-Buttons\\n 6: h2+tables # Verknüpfte Daten (optional)\\n 7: back-link # Link zurück zur Liste\\n\\n template: |\\n <?php ob_start(); ?>\\n\\n <nav class=\"breadcrumb\">\\n <a href=\"\/{resource}\">{Ressource}<\/a> » {Eintrag} #{id}\\n <\/nav>\\n\\n <h1><?= htmlspecialchars($item['title']) ?><\/h1>\\n\\n <table>\\n <tr><th>ID<\/th><td><?= $item['id'] ?><\/td><\/tr>\\n <tr><th>Status<\/th><td><span class=\"badge badge--<?= $item['status'] ?>\"><?= $item['status'] ?><\/span><\/td><\/tr>\\n <tr><th>Erstellt<\/th><td><?= $item['created_at'] ?><\/td><\/tr>\\n <\/table>\\n\\n <?php if ($item['description']): ?>\\n <h2>Beschreibung<\/h2>\\n <p><?= nl2br(htmlspecialchars($item['description'])) ?><\/p>\\n <?php endif; ?>\\n\\n <h2>Aktionen<\/h2>\\n <div class=\"action-bar\">\\n <a href=\"\/{resource}\/<?= $item['id'] ?>\/edit\" class=\"btn\">Bearbeiten<\/a>\\n <button class=\"btn btn--success\">Aktion 1<\/button>\\n <button class=\"btn btn--danger\">Aktion 2<\/button>\\n <\/div>\\n\\n <?php if (!empty($related_items)): ?>\\n <h2>Verknüpfte Daten<\/h2>\\n <table data-sortable>...<\/table>\\n <?php endif; ?>\\n\\n <p style=\"margin-top: 2rem;\"><a href=\"\/{resource}\">← Zurück zur Übersicht<\/a><\/p>\\n\\n <?php $content = ob_get_clean(); ?>\\n <?php require VIEW_PATH . '\/layout.php'; ?>\\n\\n rules:\\n - id: SHW-001\\n severity: critical\\n rule: \"Breadcrumb als erstes Element\"\\n format: '<nav class=\"breadcrumb\">...<\/nav>'\\n\\n - id: SHW-002\\n severity: critical\\n rule: \"Metadaten in einfacher Tabelle, keine Cards\"\\n example:\\n wrong: '<div class=\"card\"><div class=\"config-grid\">...'\\n correct: \"<table><tr><th>ID<\/th><td>1<\/td><\/tr>...\"\\n\\n - id: SHW-003\\n severity: major\\n rule: \"Aktionen in action-bar, nicht verstreut\"\\n example:\\n wrong: \"Buttons an verschiedenen Stellen der Seite\"\\n correct: '<div class=\"action-bar\">alle Buttons hier<\/div>'\\n\\n - id: SHW-004\\n severity: major\\n rule: \"Zurück-Link am Ende der Seite\"\\n format: '<p style=\"margin-top: 2rem;\"><a href=\"\/{resource}\">← Zurück zur Übersicht<\/a><\/p>'\\n\\n# =============================================================================\\n# Seitenstruktur: NEW (Erstellen)\\n# =============================================================================\\nnew_structure:\\n description: \"Formular zum Erstellen eines neuen Eintrags\"\\n\\n elements_order:\\n 1: breadcrumb # Navigation\\n 2: h1 # \"Neu erstellen\"\\n 3: form # Formular\\n\\n template: |\\n <?php ob_start(); ?>\\n\\n <nav class=\"breadcrumb\">\\n <a href=\"\/{resource}\">{Ressource}<\/a> » Neu\\n <\/nav>\\n\\n <h1>Neuer {Eintrag}<\/h1>\\n\\n <form class=\"form\" method=\"post\" action=\"\/{resource}\" style=\"max-width: 600px;\">\\n <div class=\"form-group\">\\n <label for=\"title\">Titel *<\/label>\\n <input type=\"text\" id=\"title\" name=\"title\" class=\"form-input\" required>\\n <\/div>\\n <div class=\"form-group\">\\n <label for=\"description\">Beschreibung<\/label>\\n <textarea id=\"description\" name=\"description\" class=\"form-textarea\" rows=\"4\"><\/textarea>\\n <\/div>\\n <div class=\"form-group\">\\n <label for=\"type\">Typ<\/label>\\n <select id=\"type\" name=\"type\" class=\"form-select\">\\n <option value=\"\">-- Auswählen --<\/option>\\n <\/select>\\n <\/div>\\n <div class=\"form-actions\">\\n <button type=\"submit\" class=\"btn btn--primary\">Erstellen<\/button>\\n <a href=\"\/{resource}\" class=\"btn\">Abbrechen<\/a>\\n <\/div>\\n <\/form>\\n\\n <?php $content = ob_get_clean(); ?>\\n <?php require VIEW_PATH . '\/layout.php'; ?... [TRUNCATED-ae9da28c0d2a7ed5]",
"stderr": "",
"interrupted": false,
"isImage": false
}
}