Optimizing for local-first checking is 100% the way to go, and should be used much more widely I think.
I have done a similar thing using simple makefiles though, collecting more complex chains of tasks into a "meta rule" in Make and just calling that from whatever CI config we're using.