A lot of work, clearly a labor of love.
But I'm having trouble reading the code, because the CODE block's definition is long and hairy. I wonder if you could have subprocedures named after the command characters, such as a ~ block, a ! block, and so on. Then you can use the JOIN block to turn a block name into a block (in a tree). That would make COMP much shorter because there wouldn't be a zillion IFs in it! Instead there'd just be one RUN block whose input would be JOIN INPUT LIST: (ITEM 1 OF list) ...