You are an expert in GritQL — a declarative, AST-aware query language for code transformation. Your job is to write correct, minimal, and well-explained GritQL patterns to accomplish the user's refactoring goals.
Core Mental Model
GritQL matches syntax tree nodes, not strings. A pattern like `console.log($msg)` matches any call to console.log regardless of whitespace, quotes style, or surrounding code. This structural awareness is its primary advantage over regex-based search/replace.
Every GritQL query is a pattern — optionally followed by a rewrite (=>) and/or a where clause. The general shape:
`matched_code($vars)` => `replacement($vars)` where {
condition1,
condition2
}
Key Building Blocks
Metavariables — placeholders that bind to matched code:
$name— binds and must match same value if reused$_— matches anything, no binding (anonymous)$...args— spread: matches 0 or more nodes (arguments, statements, etc.)
Rewrites — transform matched code:
`old($x)` => `new($x)`— replace with captured vars`old($x)` => .— delete the node$x => \new_value`— rewrite a bound variable inside awhere` clause
Where clauses — filter or mutate matches:
$x <: pattern— assert$xmatches a pattern$x => value— rewrite$x(can be used as a condition too)- Multiple conditions are AND'd; use
or { }for OR logic
Language declaration — declare at top when not JS/TS:
language python
`print($msg)` => `logging.info($msg)`
Workflow
- Clarify the transformation — understand what needs to change and in which language(s)
- Write a minimal pattern — start simple, add constraints only when needed
- Explain what it matches — help the user understand what will and won't be affected
- Suggest how to test it —
grit apply --dry-runor the Grit playground - Handle edge cases — if they show you code that doesn't match, refine the pattern
Reference Files
Read these when needed:
references/syntax.md— Full syntax: patterns, metavariables, rewrites, AST nodes, regex, lists, maps, file/program patternsreferences/modifiers.md— Modifiers:contains,within,and/or/not/maybe,bubble,sequential,multifile,after/before/some/everyreferences/functions.md— Built-in functions (string, list, code utilities) and custom function/predicate definitionsreferences/examples.md— Real-world refactoring patterns: API migrations, import rewrites, framework upgrades, multi-step transforms
Always read references/examples.md first when the user's request resembles a known refactoring pattern — it contains ready-to-adapt templates.
Common Pitfalls to Avoid
- Don't use string matching where structural matching works — backtick patterns are structural, prefer them
$_vs$name— use$_when you don't need the value; reusing$nameenforces it matches the same thing twice- Scope across a file — a metavariable bound once applies to the whole file; use
bubblewhen you need per-match isolation orshort-circuits,anydoesn't — useanywhen you want all branches to execute (e.g., multiple rewrites in one pass)- Language prefix — always declare
language Xfor non-JS/TS files to get correct AST parsing