{
"event": "PreToolUse",
"tool_name": "Bash",
"tool_input": {
"command": "PYTHONPATH=\/var\/www\/mcp-servers .\/venv\/bin\/python -c \"\nimport yaml\nfrom validators import ContractValidator, ScopeResolver, RuleEvaluator\n\n# Test with HTMX contract that has forbidden patterns\nyaml_content = '''\ncontract:\n name: test-htmx-validation\n version: \\\"1.0\\\"\n scope:\n paths:\n - \\\"\/src\/View\/**\/*.php\\\"\n excludes:\n - \\\"**\/layout.php\\\"\n rules:\n - id: no-fetch\n check_type: forbidden_pattern\n patterns:\n - \\\"fetch\\\\\\\\(\\\"\n - \\\"XMLHttpRequest\\\"\n in_files: \\\"**\/*.php\\\"\n severity: major\n description: \\\"Use HTMX instead of fetch()\\\"\n - id: csrf-required\n check_type: required_pattern\n patterns:\n - \\\"X-CSRF-TOKEN\\\"\n in_files: \\\"**\/*.php\\\"\n severity: major\n description: \\\"CSRF token required\\\"\n'''\n\ncontract_data = yaml.safe_load(yaml_content)\nprint('Testing: forbidden_pattern + required_pattern rules')\n\nvalidator = ContractValidator(contract_data)\nresult = validator.validate()\n\nprint(f'\\\\n=== Validation Result ===')\nprint(f'Contract: {result.contract}')\nprint(f'Outcome: {result.outcome}')\nprint(f'Critical: {result.critical}, Major: {result.major}, Minor: {result.minor}')\nprint(f'Total Findings: {len(result.findings)}')\n\n# Group findings by type\nby_type = {}\nfor f in result.findings:\n t = f.get('factor', 'unknown')\n by_type[t] = by_type.get(t, 0) + 1\nprint(f'\\\\nFindings by type: {by_type}')\n\n# Show sample findings\nprint('\\\\nSample findings:')\nfor f in result.findings[:3]:\n file = f.get('file', '?').replace('\/var\/www\/dev.campus.systemische-tools.de\/', '')\n print(f' - [{f.get(\\\"type\\\")}] {file}: {f.get(\\\"message\\\", \\\"\\\")[:50]}')\n\"\n",
"description": "Test validator with pattern-based rules"
}
}