{ "version": "v2", "timestamp": 1779889907001, "ruleHash": "fd9b2b15f2ac8993", "queries": [ { "id": "bare-except", "name": "Bare Except Clause", "severity": "warning", "language": "python", "message": "Bare 'except:' clause — catches SystemExit, KeyboardInterrupt", "query": " (except_clause\n \"except\") @CLAUSE", "metavars": [ "CLAUSE" ], "post_filter": "bare_except_only", "defect_class": "silent-error", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/bare-except.yml" }, { "id": "eval-exec", "name": "Eval/Exec Usage", "severity": "warning", "language": "python", "message": "{{FUNC}}() detected — security risk, code injection vulnerability", "query": " (call\n function: (identifier) @FUNC\n (#match? @FUNC \"^(eval|exec)$\")\n arguments: (argument_list) @ARGS)", "metavars": [ "FUNC", "ARGS" ], "defect_class": "injection", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/eval-exec.yml" }, { "id": "exit-signature-check", "name": "__exit__ Missing Parameters", "severity": "error", "language": "python", "message": "__exit__ should accept type, value, and traceback arguments", "query": " (function_definition\n name: (identifier) @NAME (#eq? @NAME \"__exit__\")\n parameters: (parameters\n (_) @SELF\n . (_) @PARAM1?\n . (_) @PARAM2?\n . (_) @PARAM3?))", "metavars": [ "NAME", "SELF", "PARAM1", "PARAM2", "PARAM3" ], "post_filter": "exit_params_insufficient", "defect_class": "correctness", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/exit-signature-check.yml" }, { "id": "in-operator-unsupported", "name": "In and Not In Operators Should Be Used on Valid Objects", "severity": "warning", "language": "python", "message": "'in' operator used on object that may not support containment", "query": " (comparison_operator\n (identifier) @OBJ\n \"in\"\n (identifier) @TARGET)\n (comparison_operator\n (identifier) @OBJ\n \"not\"\n \"in\"\n (identifier) @TARGET)", "metavars": [ "OBJ", "TARGET" ], "post_filter": "check_in_operator_types", "defect_class": "correctness", "inline_tier": "warning", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/in-operator-unsupported.yml" }, { "id": "is-vs-equals", "name": "Is vs Equals for Literals", "severity": "warning", "language": "python", "message": "Using 'is' with literal — use '==' for value comparison", "query": " (comparison_operator\n (identifier)\n (\"is\")\n (string) @LITERAL)\n (comparison_operator\n (identifier)\n (\"is not\")\n (string) @LITERAL)\n (comparison_operator\n (identifier)\n (\"is\")\n (integer) @LITERAL)\n (comparison_operator\n (identifier)\n (\"is not\")\n (integer) @LITERAL)", "metavars": [ "LITERAL" ], "defect_class": "correctness", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/is-vs-equals.yml" }, { "id": "iter-return-iterator", "name": "__iter__ Should Return Iterator", "severity": "warning", "language": "python", "message": "__iter__ should return an iterator (object with __next__ method)", "query": " (function_definition\n name: (identifier) @NAME (#eq? @NAME \"__iter__\")\n body: (block\n (return_statement) @RETURN))", "metavars": [ "NAME", "RETURN" ], "defect_class": "correctness", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/iter-return-iterator.yml" }, { "id": "mutable-default-arg", "name": "Mutable Default Argument", "severity": "warning", "language": "python", "message": "Mutable default argument — list/dict/set as default value", "query": " (function_definition\n (parameters\n (default_parameter\n (identifier) @PARAM\n [(list) (dictionary) (set)] @MUTABLE)))", "metavars": [ "PARAM", "MUTABLE" ], "defect_class": "correctness", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/mutable-default-arg.yml" }, { "id": "no-super-torchscript", "name": "super Should Not Be Used in TorchScript Methods", "severity": "error", "language": "python", "message": "super() calls should not be used in TorchScript methods", "query": " (function_definition\n (decorator\n (call\n function: (identifier) @DEC (#match? @DEC \"^(torch\\.jit\\.script|jit\\.script)$\")))\n body: (block\n (call\n function: (identifier) @FUNC (#eq? @FUNC \"super\")) @CALL))", "metavars": [ "DEC", "FUNC", "CALL" ], "defect_class": "correctness", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/no-super-torchscript.yml" }, { "id": "notimplemented-boolean-context", "name": "NotImplemented in Boolean Context", "severity": "error", "language": "python", "message": "NotImplemented should not be used in boolean contexts", "query": " (if_statement\n condition: (identifier) @COND (#eq? @COND \"NotImplemented\"))\n (while_statement\n condition: (identifier) @COND (#eq? @COND \"NotImplemented\"))\n (binary_operator\n (identifier) @COND (#eq? @COND \"NotImplemented\")\n (\"and\" | \"or\"))\n (boolean_operator\n (identifier) @COND (#eq? @COND \"NotImplemented\"))\n (unary_operator\n operator: (\"not\")\n argument: (identifier) @COND (#eq? @COND \"NotImplemented\"))", "metavars": [ "COND" ], "defect_class": "correctness", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/notimplemented-boolean-context.yml" }, { "id": "python-assert-production", "name": "Assert in Production Code", "severity": "warning", "language": "python", "message": "assert statement stripped by Python -O flag — use explicit checks with exceptions in production code", "query": " (assert_statement) @ASSERT", "metavars": [ "ASSERT" ], "defect_class": "correctness", "inline_tier": "warning", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/python-assert-production.yml" }, { "id": "python-command-injection", "name": "Command Injection Sink", "severity": "error", "language": "python", "message": "Potential command injection sink — avoid shell execution with dynamic input", "query": " (call\n function: (attribute\n object: (identifier) @MOD\n attribute: (identifier) @FN)\n arguments: (argument_list) @ARGS\n (#eq? @MOD \"os\")\n (#match? @FN \"^(system|popen)$\"))\n\n (call\n function: (attribute\n object: (identifier) @MOD\n attribute: (identifier) @FN)\n arguments: (argument_list\n (keyword_argument\n name: (identifier) @KW\n value: (true)))\n (#eq? @MOD \"subprocess\")\n (#match? @FN \"^(run|Popen|call|check_output|check_call)$\")\n (#eq? @KW \"shell\"))", "metavars": [ "MOD", "FN", "ARGS", "KW" ], "post_filter": "py_command_injection_sink", "defect_class": "injection", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/python-command-injection.yml" }, { "id": "python-cross-language-method", "name": "Cross-Language Method Leakage", "severity": "warning", "language": "python", "message": "'{METHOD}' is not a Python method — likely a {LANG} idiom leaking in", "query": " (call\n function: (attribute\n object: (_) @OBJ\n attribute: (identifier) @METHOD)\n (#match? @METHOD \"^(push|forEach|indexOf|charAt|substring|hasOwnProperty|unshift|flatMap|padStart|padEnd|trimStart|trimEnd|equals|isEmpty|println|printf|getClass|hashCode|toCharArray|getBytes|compareTo|equalsIgnoreCase|startsWith|endsWith|each|collect|select|reject|detect|inject|chomp|chop|gsub|upcase|downcase|present|blank|Add|Contains|ToLower|ToUpper|Trim|Substring|WriteLine|ReadLine|TryParse|forEach|includes|assign|freeze|splice|unshift|shift|flatMap)$\"))", "metavars": [ "OBJ", "METHOD" ], "post_filter": "match_captures", "post_filter_params": { "METHOD": "^(push|forEach|indexOf|charAt|substring|hasOwnProperty|unshift|flatMap|padStart|padEnd|trimStart|trimEnd|equals|isEmpty|println|printf|getClass|hashCode|toCharArray|getBytes|compareTo|equalsIgnoreCase|startsWith|endsWith|each|collect|select|reject|detect|inject|chomp|chop|gsub|upcase|downcase|present|blank|Add|Contains|ToLower|ToUpper|Trim|Substring|WriteLine|ReadLine|TryParse|forEach|includes|assign|freeze|splice|unshift|shift|flatMap)$" }, "defect_class": "hallucination", "inline_tier": "warning", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/python-cross-language-method.yml" }, { "id": "python-debugger", "name": "Debugger Statement", "severity": "warning", "language": "python", "message": "Debugger call '{{FUNC}}' — remove before committing", "query": " (call\n function: (identifier) @FUNC\n (#eq? @FUNC \"breakpoint\"))\n\n (call\n function: (attribute\n object: (identifier) @MOD\n attribute: (identifier) @FUNC)\n (#eq? @MOD \"pdb\")\n (#match? @FUNC \"^(set_trace|post_mortem|pm|run|runcall)$\"))", "metavars": [ "FUNC", "MOD" ], "defect_class": "safety", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/python-debugger.yml" }, { "id": "python-empty-except", "name": "Empty Except Block", "severity": "warning", "language": "python", "message": "Except block only contains 'pass' — handle or re-raise the exception", "query": " (try_statement\n (except_clause\n body: (block) @BODY))", "metavars": [ "BODY" ], "post_filter": "python_empty_except", "defect_class": "silent-error", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/python-empty-except.yml" }, { "id": "python-hallucinated-import", "name": "Hallucinated Import", "severity": "warning", "language": "python", "message": "Hallucinated import — '{NAME}' does not exist in '{MODULE}'", "query": " (import_from_statement\n module_name: (dotted_name) @MODULE\n name: (dotted_name) @NAME)", "metavars": [ "MODULE", "NAME" ], "post_filter": "match_captures", "post_filter_params": { "MODULE": "^(requests|flask|django|typing|collections|asyncio|json|unittest|pytest|urllib|sqlalchemy)$", "NAME": "^(JSONResponse|HTMLResponse|RedirectResponse|StreamingResponse|Depends|Query|Path|Body|Header|Cookie|Form|File|UploadFile|FastAPI|APIRouter|HTTPException|BackgroundTasks|dataclass|fields|BaseModel|Field|validator|aiohttp|parse|stringify|fixture|TestCase|get|post|put|delete|Model|Session|Column|Integer|String)$" }, "defect_class": "hallucination", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/python-hallucinated-import.yml" }, { "id": "python-hardcoded-secrets", "name": "Hardcoded Secret", "severity": "warning", "language": "python", "message": "Hardcoded {{VARNAME}} — use environment variables or a secrets manager", "query": " (assignment\n left: (identifier) @VARNAME\n right: (string) @VALUE)", "metavars": [ "VARNAME", "VALUE" ], "post_filter": "check_secret_pattern", "defect_class": "secrets", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/python-hardcoded-secrets.yml" }, { "id": "python-insecure-deserialization", "name": "Insecure Deserialization", "severity": "error", "language": "python", "message": "Potential insecure deserialization sink — avoid unsafe loaders", "query": " (call\n function: (attribute\n object: (identifier) @MOD\n attribute: (identifier) @FN)\n arguments: (argument_list (_) @DATA)\n (#match? @MOD \"^(pickle|yaml)$\")\n (#match? @FN \"^(load|loads|unsafe_load)$\"))", "metavars": [ "MOD", "FN", "DATA" ], "post_filter": "py_insecure_deserialization_sink", "defect_class": "injection", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/python-insecure-deserialization.yml" }, { "id": "python-insecure-random", "name": "Insecure Randomness", "severity": "warning", "language": "python", "message": "Insecure randomness source detected — use secrets or os.urandom for security-sensitive values", "query": " (call\n function: (attribute\n object: (identifier) @MOD\n attribute: (identifier) @FN)\n arguments: (argument_list) @ARGS\n (#eq? @MOD \"random\")\n (#match? @FN \"^(random|randint|randrange|choice|choices)$\"))", "metavars": [ "MOD", "FN", "ARGS" ], "defect_class": "injection", "inline_tier": "warning", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/python-insecure-random.yml" }, { "id": "python-mutable-class-attr", "name": "Mutable Class Attribute", "severity": "warning", "language": "python", "message": "Class attribute '{{VARNAME}}' is mutable — shared across all instances", "query": " (class_definition\n body: (block\n (expression_statement\n (assignment\n left: (identifier) @VARNAME\n right: [\n (list) @VALUE\n (dictionary) @VALUE\n (set) @VALUE\n ]))))", "metavars": [ "VARNAME", "VALUE" ], "post_filter": "not_in_function", "defect_class": "correctness", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/python-mutable-class-attr.yml" }, { "id": "python-path-traversal", "name": "Path Traversal Risk", "severity": "warning", "language": "python", "message": "Potential path traversal sink — sanitize and constrain file paths", "query": " [\n (call\n function: (identifier) @FN\n arguments: (argument_list\n [(identifier) (binary_operator) (call)] @PATH))\n (call\n function: (attribute\n object: (identifier) @MOD\n attribute: (identifier) @FN)\n arguments: (argument_list\n [(identifier) (binary_operator) (call)] @PATH))\n ]\n (#match? @FN \"^(open|read_text|read_bytes|write_text|write_bytes|remove|unlink|rmdir)$\")", "metavars": [ "MOD", "FN", "PATH" ], "post_filter": "py_path_traversal_sink", "defect_class": "injection", "inline_tier": "warning", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/python-path-traversal.yml" }, { "id": "python-print-statement", "name": "Print Statement in Production", "severity": "warning", "language": "python", "message": "print() — remove debug output before committing", "query": " (call\n function: (identifier) @FUNC\n (#eq? @FUNC \"print\")\n arguments: (argument_list) @ARGS)", "metavars": [ "FUNC", "ARGS" ], "post_filter": "not_in_test_block", "defect_class": "safety", "inline_tier": "warning", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/python-print-statement.yml" }, { "id": "python-raise-string", "name": "Raise String Instead of Exception", "severity": "warning", "language": "python", "message": "raise with string literal — Python 3 requires exception instances", "query": " (raise_statement\n (string) @VALUE)", "metavars": [ "VALUE" ], "defect_class": "correctness", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/python-raise-string.yml" }, { "id": "python-sleep-in-test", "name": "time.sleep in Test", "severity": "warning", "language": "python", "message": "time.sleep() in test — use synchronisation primitives or polling helpers instead of fixed sleeps", "query": " (call\n function: (attribute\n object: (identifier) @MOD\n attribute: (identifier) @FN)\n (#eq? @MOD \"time\")\n (#eq? @FN \"sleep\")) @CALL", "metavars": [ "MOD", "FN", "CALL" ], "defect_class": "async-misuse", "inline_tier": "warning", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/python-sleep-in-test.yml" }, { "id": "python-sql-injection", "name": "SQL Injection Risk", "severity": "error", "language": "python", "message": "Potential SQL injection sink — use parameterized queries", "query": " (call\n function: (attribute\n object: (_) @OBJ\n attribute: (identifier) @FN)\n arguments: (argument_list\n [(binary_operator) (identifier) (call)] @SQL\n (_)*))", "metavars": [ "OBJ", "FN", "SQL" ], "post_filter": "py_sql_injection_sink", "defect_class": "injection", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/python-sql-injection.yml" }, { "id": "python-ssrf", "name": "SSRF Risk", "severity": "warning", "language": "python", "message": "Potential SSRF sink — validate/allowlist outbound URLs", "query": " (call\n function: (attribute\n object: (identifier) @MOD\n attribute: (identifier) @FN)\n arguments: (argument_list\n [(identifier) (subscript) (call)] @URL)\n (#eq? @MOD \"requests\")\n (#match? @FN \"^(get|post|put|patch|delete|request|head|options)$\"))", "metavars": [ "MOD", "FN", "URL" ], "post_filter": "py_ssrf_sink", "defect_class": "injection", "inline_tier": "warning", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/python-ssrf.yml" }, { "id": "python-subprocess-shell", "name": "subprocess with shell=True", "severity": "warning", "language": "python", "message": "subprocess called with shell=True — command injection risk if any argument is user-controlled", "query": " (call\n function: (attribute\n object: (identifier) @MOD\n attribute: (identifier) @FN)\n arguments: (argument_list\n (keyword_argument\n name: (identifier) @KW\n value: (true) @VAL))\n (#eq? @MOD \"subprocess\")\n (#match? @FN \"^(run|Popen|call|check_output|check_call)$\")\n (#eq? @KW \"shell\"))", "metavars": [ "MOD", "FN", "KW" ], "defect_class": "injection", "inline_tier": "warning", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/python-subprocess-shell.yml" }, { "id": "python-thread-global-write", "name": "Threaded Shared State Risk", "severity": "warning", "language": "python", "message": "Thread creation detected — ensure shared state mutations are synchronized", "query": " (call\n function: (attribute\n object: (identifier) @MOD\n attribute: (identifier) @FN)\n arguments: (argument_list) @ARGS)\n (#eq? @MOD \"threading\")\n (#eq? @FN \"Thread\")", "metavars": [ "MOD", "FN", "ARGS" ], "defect_class": "async-misuse", "inline_tier": "warning", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/python-thread-global-write.yml" }, { "id": "python-unsafe-regex", "name": "Unsafe Dynamic Regex", "severity": "warning", "language": "python", "message": "re.{{FUNC}}() with variable pattern — ReDoS risk if pattern is user-controlled", "query": " (call\n function: (attribute\n object: (identifier) @MOD\n attribute: (identifier) @FUNC)\n arguments: (argument_list\n (identifier) @PATTERN)\n (#eq? @MOD \"re\")\n (#match? @FUNC \"^(compile|match|search|fullmatch|findall|finditer|sub|subn|split)$\"))", "metavars": [ "MOD", "FUNC", "PATTERN" ], "defect_class": "injection", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/python-unsafe-regex.yml" }, { "id": "python-weak-hash", "name": "Weak Hash Primitive", "severity": "error", "language": "python", "message": "Weak hash primitive detected (MD5/SHA1) — use SHA-256+ for security-sensitive contexts", "query": " (call\n function: (attribute\n object: (identifier) @MOD\n attribute: (identifier) @FN)\n arguments: (argument_list) @ARGS\n (#eq? @MOD \"hashlib\")\n (#match? @FN \"^(md5|sha1)$\"))", "metavars": [ "MOD", "FN", "ARGS" ], "defect_class": "injection", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/python-weak-hash.yml" }, { "id": "return-in-generator", "name": "Return with Value in Generator", "severity": "error", "language": "python", "message": "'return' with a value should not be used in a generator function", "query": " (function_definition\n body: (block\n (return_statement\n (_) @RETURN_VAL) @RETURN)) @FUNCTION", "metavars": [ "FUNCTION", "RETURN", "RETURN_VAL" ], "post_filter": "is_generator_with_valued_return", "defect_class": "correctness", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/return-in-generator.yml" }, { "id": "return-in-init", "name": "Return Value in __init__", "severity": "error", "language": "python", "message": "__init__ should not return a value — it must always return None", "query": " (function_definition\n name: (identifier) @NAME (#eq? @NAME \"__init__\")\n body: (block\n (return_statement\n (_) @RETURN_VAL) @RETURN))", "metavars": [ "NAME", "RETURN", "RETURN_VAL" ], "post_filter": "has_return_value", "defect_class": "correctness", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/return-in-init.yml" }, { "id": "send-file-mimetype", "name": "send_file Should Specify Mimetype or Download Name", "severity": "error", "language": "python", "message": "send_file should specify 'mimetype' or 'download_name' when used with file-like objects", "query": " (call\n function: (identifier) @FUNC (#eq? @FUNC \"send_file\")\n arguments: (argument_list\n (_) @FIRST_ARG\n (keyword_argument)? @KW))", "metavars": [ "FUNC", "FIRST_ARG", "KW" ], "post_filter": "missing_mimetype_and_download_name", "defect_class": "correctness", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/send-file-mimetype.yml" }, { "id": "unreachable-except", "name": "Unreachable Except Clause", "severity": "warning", "language": "python", "message": "Unreachable except clause — earlier except catches all", "query": " (try_statement\n (except_clause\n \"except\") @GENERAL\n (except_clause\n \"except\"\n (identifier) @SPECIFIC))", "metavars": [ "GENERAL", "SPECIFIC" ], "defect_class": "correctness", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/unreachable-except.yml" }, { "id": "wildcard-import", "name": "Wildcard Import", "severity": "warning", "language": "python", "message": "Wildcard import — pollutes namespace, hard to track origin", "query": " (import_from_statement\n module_name: (dotted_name) @MODULE\n (wildcard_import) @WILDCARD)", "metavars": [ "MODULE", "WILDCARD" ], "defect_class": "safety", "inline_tier": "warning", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/wildcard-import.yml" }, { "id": "yield-return-outside-function", "name": "Yield/Return Outside Function", "severity": "error", "language": "python", "message": "{{STATEMENT}} used outside function — syntax error", "query": " (module\n (expression_statement\n (yield) @STATEMENT))\n (module\n (expression_statement\n (yield_expression) @STATEMENT))\n (module\n (return_statement) @STATEMENT)", "metavars": [ "STATEMENT" ], "defect_class": "correctness", "inline_tier": "blocking", "filePath": "/home/alex/.npm-global/lib/node_modules/pi-lens/rules/tree-sitter-queries/python/yield-return-outside-function.yml" } ] }