The first couple of levels I solved by hand, but after that I thought about automating it :).
The code is plain python + a library to check if a word is valid english word (there are around 1000 lines of code; half of the code are levels definitions). A level is defined by the chains of possible transformations from input to output (I either define them by hand or I can define the entire graph of nodes and have an algorithm generate all the possible transformations chains; there are some corner cases: 5b+ component 1 and 6b+ component 1: these levels have variable length loops in them; for these I just limited my generator to a max number of loops and it did the job). For example, 1b component 3 is defined as 2 chains with 1 transformation each: the first chain has decrement, the second chain has increment.
Each transformation represents a function with string in, string out. Each transformation has an associated inverse transformation (inverse of increment is decrement, etc). Because not all transformations are bijective functions, the inverse transformation produces a list of possible inputs based on the output word. From here, given the output word, I go through the chain (backwards direction) and apply each inverse transformation. This results in multiple possible inputs and I then filter only the english words.