The Unix way of thinking should always apply to CLI program development.
Standalone and Filter
Work out if you want your CLI app to be an interface or a filter. Filters are handy and follow the Unix philosophy. As an example, if your CLI app is an administration app, include options for outputting status or current configuration as XML or another format. This way your application can be a filter and transformer of information as well as an interactive application.
Librification
I often find it helps to write the core functionality as a library, and write the executable as frontend. This makes it simpler to write a GUI in the future or bind the library to your dynamic language of choice.
Security
As well as good programming practice in the program, the OS environment offers alot of security, so take advantage of all POSIX has to offer. Filesystem permissions, in-code user checking and safeguards. If you only want your program accessible over SSH, then create a special user for this and only give that user permissions. If your app is interactive then set it as the user's shell on login.
Wizards
Are not really seen too much in CLI-land. You typically want your CLI app to mimic a fat-function. Atomic operations on CLI arguments that provide a return code. If you want a library, create a wrapper for the executable that extends it. The executable should be a CLI-accessible library in effect.
Arguments and convention
Making your arguments conventional is important. Look at conventions in your current environment... does
-v
Conventionally mean verbose output or print version information? Look at the GNU standards on long and short arguments such as:
-v or --version
And use an argument processing library such as getopt.
What I do
I always treat a CLI executable as a library bound to the shell acting as a filter so that I can pipe and redirect output to files and other utilities.
Recommended Reading
Linux Application Development - Johnson, Troan
Hope this helps and Good Luck