{
"event": "PreToolUse",
"tool_name": "Bash",
"tool_input": {
"command": "mysql -u root -pv8mFLmkF2fth_r -D ki_dev -e \"SELECT yaml_content FROM contracts WHERE name = 'HTML Tables Contract' AND status = 'active';\" 2>\/dev\/null | tail -n +2",
"description": "Get HTML Tables Contract"
}
}
{
"tool_response": {
"stdout": "contract:\\n name: \"HTML Tables Contract\"\\n version: \"1.0\"\\n status: active\\n scope:\\n - \"\/src\/View\/**\/*.php\"\\n - \"\/public\/js\/**\/*.js\"\\n principles:\\n - DRY # Don't Repeat Yourself\\n - CRUD # Create, Read, Update, Delete\\n - KISS # Keep It Simple, Stupid\\n - OOP # Object-Oriented Programming\\n - MVC # Model-View-Controller\\n - MVP # Model-View-Presenter\\n - YAGNI # You Aren't Gonna Need It\\n - SRP # Single Responsibility Principle\\n\\nrules:\\n navigation:\\n - id: NAV-001\\n severity: critical\\n rule: \"Keine 'Aktionen'-Spalte mit Details-Button\"\\n fix: \"ID oder Titel als Link verwenden\"\\n example:\\n wrong: |\\n <th>Aktionen<\/th>\\n <td><button onclick=\"showDetails(1)\">Details<\/button><\/td>\\n correct: |\\n <th>ID<\/th>\\n <td><a href=\"\/tasks\/1\">1<\/a><\/td>\\n\\n - id: NAV-002\\n severity: critical\\n rule: \"Keine Modals für Detail-Ansichten\"\\n fix: \"Echte URLs mit eigener Route verwenden\"\\n example:\\n wrong: |\\n <div id=\"modal\" style=\"display:none\">...<\/div>\\n onclick=\"openModal()\"\\n correct: |\\n <a href=\"\/resource\/{id}\">Details<\/a>\\n \/\/ Separate View: \/src\/View\/resource\/show.php\\n\\n - id: NAV-003\\n severity: major\\n rule: \"Jede Ressource braucht eigene Detail-URL\"\\n pattern: \"\/{resource}\/{id}\"\\n examples:\\n - \"\/tasks\/1\"\\n - \"\/users\/42\"\\n - \"\/docs\/modul\/ki-tasks\"\\n\\n columns:\\n - id: COL-001\\n severity: major\\n rule: \"Alle Spalten müssen sortierbar sein\"\\n implementation: |\\n <th data-sort=\"id\">ID<\/th>\\n <th data-sort=\"title\">Titel<\/th>\\n <th data-sort=\"status\">Status<\/th>\\n\\n - id: COL-002\\n severity: major\\n rule: \"Tabelle muss Suchfeld haben\"\\n implementation: |\\n <input type=\"search\" id=\"table-search\" placeholder=\"Durchsuchen...\">\\n\\n structure:\\n - id: STR-001\\n severity: minor\\n rule: \"Konsistente Tabellenstruktur\"\\n template: |\\n <div class=\"table-controls\">\\n <input type=\"search\" placeholder=\"Durchsuchen...\">\\n <select id=\"filter-...\">...<\/select>\\n <\/div>\\n <table data-sortable>\\n <thead>\\n <tr><th data-sort=\"...\">...<\/th><\/tr>\\n <\/thead>\\n <tbody>...<\/tbody>\\n <\/table>\\n\\n javascript:\\n - id: JS-001\\n severity: critical\\n rule: \"Wiederverwendbare Table-Komponente\"\\n file: \"\/public\/js\/components\/data-table.js\"\\n features:\\n - sorting\\n - searching\\n - filtering\\n - pagination (optional)\\n\\n - id: JS-002\\n severity: major\\n rule: \"Event Delegation statt inline onclick\"\\n example:\\n wrong: |\\n <button onclick=\"deleteItem(1)\">\\n correct: |\\n table.addEventListener('click', (e) => {\\n if (e.target.matches('[data-action=\"delete\"]')) { ... }\\n });\\n\\n - id: JS-003\\n severity: minor\\n rule: \"ES Modules ohne Build-Tools\"\\n pattern: |\\n <script type=\"module\" src=\"\/js\/components\/data-table.js\"><\/script>\\n\\nvalidation:\\n pass_threshold:\\n critical: 0\\n major: 2\\n minor: 5\\n\\nexamples:\\n task_table:\\n correct: |\\n <input type=\"search\" id=\"task-search\" placeholder=\"Tasks durchsuchen...\">\\n <table data-sortable>\\n <thead>\\n <tr>\\n <th data-sort=\"id\">ID<\/th>\\n <th data-sort=\"title\">Titel<\/th>\\n <th data-sort=\"type\">Typ<\/th>\\n <th data-sort=\"priority\">Priorität<\/th>\\n <th data-sort=\"status\">Status<\/th>\\n <th data-sort=\"created_at\">Erstellt<\/th>\\n <\/tr>\\n <\/thead>\\n <tbody>\\n <tr>\\n <td><a href=\"\/tasks\/1\">1<\/a><\/td>\\n <td><a href=\"\/tasks\/1\">Task-Titel<\/a><\/td>\\n <td>ai_task<\/td>\\n <td>high<\/td>\\n <td><span class=\"status-pending\">pending<\/span><\/td>\\n <td>2025-12-20<\/td>\\n <\/tr>\\n <\/tbody>\\n <\/table>\\n",
"stderr": "",
"interrupted": false,
"isImage": false
}
}