Would it make sense to subclass TerminalInteractiveShell, and overload the relevant methods (like run_cell?) A lot of the stuff like readline handling, inputsplitter, displaying prompts, and so on, is going to be the same.

I've updated this to subclass the InteractiveShell and Application from the regular terminal frontend. This means the configuration, colors, prompts, etc. are all inherited, but the underlying execution and completion code you wrote is the same.