There's no real way to issue subcommands (a'la svn/git), other than by passing them all as parameters into the call. That means there's a strong asymmetry in the syntax:
vs
so.git("commit", "--help")
I don't see a good way to fix that with the current structure of the API, but I think remodelling it would allow mapping things in a way that's more consitent:
so.ls()
so.ls["-l"]()
so.ls["--color":"always"]()
so.git.commit["--help"]()
# or perhaps better as
so.git["commit"]["--help"]
so.git["ls-files"]["--help"]
By abusing slices, ShellOut could get have a syntax for specifying the values of non-boolean options.