AST-grep is well done - the speed is particularly impressive and it's quite easy to get started with.
One of the downsides of the simplicity is that rules are written in yaml. This works nicely for simple rules, but if you try to save a complex migration as a rule, you end up programming in YAML (which is very hard).
For my similar tool we decided to build a full query language for matching code, called GritQL: https://docs.grit.io/tutorials/gritql