The package in question has a handful (about 10) simple ‘main API’ functions. Most of those functions follow the pattern of examining the user input a bit, then selecting some combination of more generic functions to call.
Using those more generic functions directly the package is capable of a bit more than what the simple ‘main API’ functions expose but they are more verbose and difficult to use correctly. At least in my mind there is a clear distinction between the simple, the generic and the internals.
I suppose one way is to just export the generic stuff as well, but it is a significantly larger set than the set of simple functions. It is also significantly smaller than the set of internal stuff.
One thought that popped to my mind was to have an Advanced submodule which exports the generic stuff. Putting the generic in a separate package is another option, but that would make the main package look a bit silly and I also suck at naming packages. It is also a bit of a refactoring effort given that the package exists already.
I know there is no definitive answer here, but I’m looking for some opinions and consequences might not be trivial to help guide my decision.
I suppose one drawback is that one must step the breaking rev whenever Advanced breaks which means that even users who don’t need it must step the compat bounds.
I suppose one can also declare that Adanced is not part of the public API but I think that is worse as it would force anyone using it to set very strict compat bounds whereas the former can be handled e.g. by communicating in the release notes (and is kinda automatically solved by CompatHelper and CI).