# METADATA # scope: package # title: Block Code Quality Test (Serena Plugin) # description: Blocks Serena plugin edits to src/test/code-quality.test.ts # custom: # routing: # required_events: ["PreToolUse"] # required_tools: # - McpPluginSerenaSerenaReplaceContent # - McpPluginSerenaSerenaReplaceSymbolBody # - McpPluginSerenaSerenaCreateTextFile # - McpPluginSerenaSerenaInsertBeforeSymbol # - McpPluginSerenaSerenaInsertAfterSymbol # - McpPluginSerenaSerenaRenameSymbol package cupcake.policies.opencode.block_code_quality_test_serena_plugin import rego.v1 tool_name := input.tool_name tool_input := input.tool_input resolved_file_path := input.resolved_file_path if { input.resolved_file_path != null } else := tool_input.file_path if { tool_input.file_path != null } else := tool_input.filePath if { tool_input.filePath != null } else := tool_input.path if { tool_input.path != null } else := tool_input.notebook_path if { tool_input.notebook_path != null } else := tool_input.notebookPath if { tool_input.notebookPath != null } else := "" new_content := tool_input.new_string if { tool_input.new_string != null } else := tool_input.newText if { tool_input.newText != null } else := tool_input.new_text if { tool_input.new_text != null } else := tool_input.content if { tool_input.content != null } else := "" old_content := tool_input.old_string if { tool_input.old_string != null } else := tool_input.oldText if { tool_input.oldText != null } else := tool_input.old_text if { tool_input.old_text != null } else := tool_input.previousContent if { tool_input.previousContent != null } else := "" patch_content := tool_input.patch if { tool_input.patch != null } else := tool_input.patchText if { tool_input.patchText != null } else := tool_input.patch_text if { tool_input.patch_text != null } else := "" edit_path(edit) := path if { edit.resolved_file_path != null path := edit.resolved_file_path } else := path if { edit.file_path != null path := edit.file_path } else := path if { edit.filePath != null path := edit.filePath } else := path if { edit.path != null path := edit.path } else := "" edit_new_content(edit) := content if { edit.new_string != null content := edit.new_string } else := content if { edit.newText != null content := edit.newText } else := content if { edit.new_text != null content := edit.new_text } else := content if { edit.content != null content := edit.content } else := "" edit_old_content(edit) := content if { edit.old_string != null content := edit.old_string } else := content if { edit.oldText != null content := edit.oldText } else := content if { edit.old_text != null content := edit.old_text } else := "" file_path_pattern := `(^|/)src/test/code-quality\.test\.ts$` get_relative_path := path if { path := tool_input.relative_path } else := path if { path := tool_input.path } else := "" # Block Serena plugin operations targeting code-quality test file deny contains decision if { input.hook_event_name == "PreToolUse" tool_names := {"McpPluginSerenaSerenaReplaceContent", "McpPluginSerenaSerenaReplaceSymbolBody", "McpPluginSerenaSerenaCreateTextFile", "McpPluginSerenaSerenaInsertBeforeSymbol", "McpPluginSerenaSerenaInsertAfterSymbol", "McpPluginSerenaSerenaRenameSymbol"} tool_name in tool_names file_path := get_relative_path regex.match(file_path_pattern, file_path) decision := { "rule_id": "TS-QUALITY-004", "reason": "Direct edits to src/test/code-quality.test.ts are prohibited.", "severity": "HIGH" } }