Meticulously manicured monolith and multicall binaries, built from
imported composite commands, on any device, with recursive, light-weight
tab completion, and richly rendered embedded documentation. Replace
messy collections of shell scripts, completion scripts, and separate man
pages with clean Go code compiled into a single, portable command.
> "It's like a modular, multicall BusyBox builder for Go with built in completion and embedded documentation support."
## Getting Started
> "The utility here is that Bonzai lets you maintain your own personal 'toolbox' with built in auto-complete that you can assemble from various Go modules. Individual commands are isolated and unaware of each other and possibly maintained by other people."
Copy or clone the example template:
![logo](logo.png)
👆 <https://github.com/rwxrob/bonzai-example>
Bonzai was born from a very real need to replace messy collections of shell scripts, wasteful completion sourcing, and OS-specific documentation with a single, stateful, binary composed of commands organized as rooted node trees with a clean, modular, portable, statically-compiled, and dynamically self-documenting design.
Study the personal, script-replacing monolith/multicall that started it
all:
There's no better language than Go for such things.
👆 <https://github.com/rwxrob/z>
Bonzai gets its name from the fact that Bonzai users are fond of meticulously manicuring their own stateful command trees, built from imported composite commands that they can easily copy and run on on any device, anywhere. Bonzai users can easily share their own commands with others just like they would any other Go module and since any Bonzai command also doubles as a high-level library package, even non-Bonzai users benefit. But where Bonzai really separates itself from anything else ever created is that any Bonzai command branch can be turned into a fully-documented, tab-completing stand-alone or multi-call binary by wrapping it in five lines of code and compiling. Such is the beautiful advantage of their stateful command tree design. There's simply nothing else like it.
## Go Bonzai!
## Getting Started
![logo](logo.png)
1. Read the book:
* https://github.com/rwxrob/book-bonzai
1. Copy or clone the example template:
* https://github.com/rwxrob/bonzai-example
1. Get ideas for your own by looking at others
Yes, "banzai" is something people yell going into battle, and battle is
exactly what it feels like to conquer your monstrous collection of shell
scripts, completion bloated rc files, and man pages (if you even got
that far).
"Bonsai" trees are well-manicured, meticulously crafted,
miniature *real* trees that rival their larger cousins, much like a
Bonzai composite command tree.
Bonzai trees are unlike anything you've likely encountered so far, no
getopt dashes, no ugly commander interface language to learn, no 12637
lines of shell tab completion bloat to source before your command will
complete, just well manicured
nested-tab-complete-with-magical-aliases-enabled commands organized into
rooted node trees for your command-line enjoyment. Your right-pinky will
be particularly grateful.
## "It's spelled bonsai/banzai."
We know. The domains were taken. Plus, this makes it more unique and
easier to find once you know the strange spelling we chose to use. Sorry
if that triggers your OCD.
If you must know, the primary motivator was the similarity to a
well-manicured tree (since it is for creating trees of composite
commands).
The misunderstood word "banzai" is 'a traditional Japanese idiom
meaning "ten thousand years" of long life,' a cheer used in
celebrations like "Hurrah" or "Viva".' So combining the notion of a
happy, well-manicured, beautiful tree and "ten thousand years of
long life" works out just fine for us.
And, yes, Buckaroo Banzai was always a favorite. We like to think he
would use Bonzai today to make amazing things and last for a long time
to defeat evil aliens and save the world.
It turns out that the "call to war" associated with Bonzai is not
entirely without merit as well. Bonzai is excellent for unorthodox,
rapid applications development (instead of writing scripts) and makes
short work of creating offensive and defensive tool kits all wrapping
into one nice Go multicall binary, popular for building single-binary
Linux container distros like BusyBox and Alpine, as well as root kits,
and other security tools
## "Why not just use Cobra?"
We get this question a lot, the answer is --- honest.
Just because something is popular (or first) doesn't mean it was well
designed. In fact, often inferior designs are rushed to market just to
gain adoption. Cobra seems to suffer from this. Discerning developers
and engineers have been not-so-quietly complaining about Cobra's
horrible design for years. It's time for something new. Read on if you
want the specific reasons.
* **Cobra tab completion is wasteful and error-prone.**
Cobra often requires sourcing thousands of lines of shell code every
time you run a new shell that needs to use a Cobra command with shell
tab completion (`kubectl` requires 12637). It is not uncommon for
operations people to be sourcing 100s of thousands of lines of shell
code just to enable basic completion that could have been enabled
easily with `complete -C` instead. Bonzai manages all completion in Go
instead of shell and therefore allows the modular addition of any
number of Completers including the standard file completion as well as
calculators, dates, and anything anyone can conceive of completing.
Completion is not dependent on any underlying operating system. Any
Bonzai command can provide its own completion algorithm or use one of
the many already provided. Cobra can never do this.
* **Cobra is not designed to be a command compositor at all.**
This is really unfortunate because the designers missed a golden
opportunity. Bonzai branches can be imported and composed into other
branches and monoliths with just a few lines of Go. Registries of
Bonzai commands can be easily inferred from dependencies on the
`bonzai` package and creators are free to compose their monoliths or
multicall binaries from a rich eco-system of Bonzai branches and
commands. Bonzai allows creation of Go multicall binary monoliths
(like BusyBox) to be made easily, and from a diverse, modular,
importable, composable sources. Such is simply not possible with Cobra
and never will be.
* **Cobra suffers from broken boomer "getopt" design.**
The world has finally realizing just how bad dashed arguments and
options have always been for good human-computer interactions from the
command line, perhaps because more regular people are using command
line interfaces, like chat apps from their laptops and phones. People
simply cannot remember all sorts of ungodly combinations of dashes and
equals signs hoping things will just work, and they certainly cannot
speak any getopt command into their phone and have it interpreted
correctly. With Bonzai they can. Bonzai UX is universal whether it be
from an Arch Linux command line or Slack app on an iPhone.
Bonzai takes a no-dashes approach with aliases promoting cleaner,
understandable command lines with context and promotion of domain
specific languages (created with PEGN, scan.X, or others) that easily
translate directly to chat and other command-line interfaces that most
humans can use without even looking up the documentation, which, by