{
"event": "PreToolUse",
"tool_name": "Write",
"tool_input": {
"file_path": "\/var\/www\/mcp-servers\/mcp-contracts\/tools\/contract_tools\/contract_parser.py",
"content": "\"\"\"Contract YAML Parser Module\"\"\"\nfrom typing import Any, Optional\nimport yaml\n\n\nclass ContractParseError(Exception):\n \"\"\"Raised when contract YAML cannot be parsed\"\"\"\n pass\n\n\nclass ContractParser:\n \"\"\"Handles parsing and validation of contract YAML content\"\"\"\n\n @staticmethod\n def parse_yaml(yaml_content: str) -> dict[str, Any]:\n \"\"\"\n Parse YAML content into a dictionary.\n\n Args:\n yaml_content: Raw YAML string\n\n Returns:\n Parsed YAML as dictionary\n\n Raises:\n ContractParseError: If YAML is invalid\n \"\"\"\n try:\n data = yaml.safe_load(yaml_content)\n if data is None:\n raise ContractParseError(\"Empty YAML content\")\n return data\n except yaml.YAMLError as e:\n raise ContractParseError(f\"Invalid YAML: {e}\") from e\n\n @staticmethod\n def validate_yaml_syntax(yaml_content: str) -> tuple[bool, Optional[str]]:\n \"\"\"\n Validate YAML syntax without parsing into domain object.\n\n Args:\n yaml_content: Raw YAML string\n\n Returns:\n Tuple of (is_valid, error_message)\n \"\"\"\n try:\n ContractParser.parse_yaml(yaml_content)\n return True, None\n except ContractParseError as e:\n return False, str(e)\n\n @staticmethod\n def extract_scope(contract_data: dict[str, Any]) -> Optional[str]:\n \"\"\"\n Extract scope from parsed contract data.\n\n Args:\n contract_data: Parsed contract dictionary\n\n Returns:\n Scope path or None if not found\n \"\"\"\n return contract_data.get(\"scope\")\n\n @staticmethod\n def extract_rules(contract_data: dict[str, Any]) -> list[dict[str, Any]]:\n \"\"\"\n Extract rules from parsed contract data.\n\n Args:\n contract_data: Parsed contract dictionary\n\n Returns:\n List of rule dictionaries\n \"\"\"\n return contract_data.get(\"rules\", [])\n"
}
}
{
"tool_response": {
"type": "create",
"filePath": "\/var\/www\/mcp-servers\/mcp-contracts\/tools\/contract_tools\/contract_parser.py",
"content": "\"\"\"Contract YAML Parser Module\"\"\"\nfrom typing import Any, Optional\nimport yaml\n\n\nclass ContractParseError(Exception):\n \"\"\"Raised when contract YAML cannot be parsed\"\"\"\n pass\n\n\nclass ContractParser:\n \"\"\"Handles parsing and validation of contract YAML content\"\"\"\n\n @staticmethod\n def parse_yaml(yaml_content: str) -> dict[str, Any]:\n \"\"\"\n Parse YAML content into a dictionary.\n\n Args:\n yaml_content: Raw YAML string\n\n Returns:\n Parsed YAML as dictionary\n\n Raises:\n ContractParseError: If YAML is invalid\n \"\"\"\n try:\n data = yaml.safe_load(yaml_content)\n if data is None:\n raise ContractParseError(\"Empty YAML content\")\n return data\n except yaml.YAMLError as e:\n raise ContractParseError(f\"Invalid YAML: {e}\") from e\n\n @staticmethod\n def validate_yaml_syntax(yaml_content: str) -> tuple[bool, Optional[str]]:\n \"\"\"\n Validate YAML syntax without parsing into domain object.\n\n Args:\n yaml_content: Raw YAML string\n\n Returns:\n Tuple of (is_valid, error_message)\n \"\"\"\n try:\n ContractParser.parse_yaml(yaml_content)\n return True, None\n except ContractParseError as e:\n return False, str(e)\n\n @staticmethod\n def extract_scope(contract_data: dict[str, Any]) -> Optional[str]:\n \"\"\"\n Extract scope from parsed contract data.\n\n Args:\n contract_data: Parsed contract dictionary\n\n Returns:\n Scope path or None if not found\n \"\"\"\n return contract_data.get(\"scope\")\n\n @staticmethod\n def extract_rules(contract_data: dict[str, Any]) -> list[dict[str, Any]]:\n \"\"\"\n Extract rules from parsed contract data.\n\n Args:\n contract_data: Parsed contract dictionary\n\n Returns:\n List of rule dictionaries\n \"\"\"\n return contract_data.get(\"rules\", [])\n",
"structuredPatch": [],
"originalFile": null
}
}