I think it depends a lot on what kind of application you’re thinking of. Here are some examples of tools that I particularly remember for having nice CLI interfaces, but they are all slightly different in terms of the number of operations/entities they support.
Single operation, a lot of different types of data: httpie
httpie is a CLI HTTP client. It allows to generate fairly complex requests, choose which diagnostic information you want to see, etc.
Examples:
$ https httpie.io/hello
$ http PUT pie.dev/put X-API-Token:123 name=John
$ http -v pie.dev/get
Several operations, a lot of parameters: Bazel
Bazel is a build system. There are only a handful of operations you typically perform (build, run, test, query), but they all follow the same pattern.
Examples:
$ bazel build //app
$ bazel --quiet build //app -c opt
$ bazel --quiet run //app -c opt -- --port=1234
Multiple entites, multiple operations: LVM
I really liked the interface of Linux Volume Manager tools. They consist of multiple commands that follow the same pattern, and use the same flags for options.
Examples:
# vgcreate -n vg_name
# vgs
# pvcreate /dev/sda
# vgextend vg_name /dev/sda
# lvcreate vg_name -n lv_name -L5G
# lvresize vg_name/lv_name -L+1G
# lvs



You can start by moving your development workflows (pull requests, issue tracking, etc.) to something like codeberg. You can continue publishing your PyPI package from Github by just pushing your code from codeberg to Github.
Eventually you can also move the publishing pipeline over as well. I don’t know how complicated your library is, of course, but in simplest cases it’s a matter of rewriting a config file in a slightly different way.