Mastermind
Mastermind is a CLI framework. It's purpose is to help build, configure, and run command line tools.
Mastermind is designed for flexibility, extensibility, minimal dependencies.
My devious plot cannot wait! Tell me your secrets!
If you want to jump right into using Mastermind, head over to the wiki.
Flexibility
Mastermind is written in Ruby and, therefore, provides first-class citizenship to that language and uses Ruby's syntax and semantics in its configuration files.
Mastermind looks for and evaluates .masterplan
files recursively up the file
tree until it reaches the root of your project, if defined, or your home directory,
if it's not. Additionally, it always looks for and attempts to load a .masterplan
file in your home directory, if one exists.
In this way, configuration for your tools can live where it makes the most sense for it to live with as much or as little duplication as you deem necessary.
See Writing Masterplans for more on their structure and semantics.
Mastermind makes up for the lack of flexibility in its configuration with full flexibility in its plan files. Which brings us to...
Extensibility
Mastermind is designed from the outset to provide a means of extending its plan file
formats through custom Loader
s. In fact, Mastermind's own PlanfileLoader
is
the first of such loaders. You can specify your own file extensions and provide
your own loaders as needed.
As long as the objects returned by your loader quack like a Plan
, Mastermind
won't fuss at them. After all, you can't take over the world if your busy mucking
about in the details!
Obviously, it'd be a bit difficult to write your plan files in an entirely separate language, but there's nothing stopping you from delegating actions to another executable or even writing some C code to call into something else altogether.
If you are writing your plans in Ruby, Mastermind provides CLI::Mastermind::Plan
which you can include in your plans to provide the basic Plan
interface.
Minimal Dependencies
Mastermind only has one dependency, Shopify's excellent cli-ui project. Mastermind doesn't require that you load it in your Gemfile or add anything to your project's configuration files.
Usage
The mastermind
Executable
Mastermind's own help is pretty straightforward:
Usage: mastermind [--help, -h] [--plans[ PATTERN], --tasks[ PATTERN], -T [PATTERN], -P [PATTERN] [PLAN[, PLAN[, ...]]] -- [PLAN ARGUMENTS]
-h, --help Display this help
-P, -T, --plans [PATTERN], Display plans. Optional pattern is used to filter the returned plans.
--tasks
Any arguments specified after --
are passed as-is down to the executed plan.
You can then process those arguments however you like or ignore them completely!
Unlike Rake and other, similar, tools that allow you to run multiple tasks in parallel, Mastermind is designed to run only one task at a time. Specifying multiple plan names on the command line is how you walk down the tree to a specific plan.
If you don't provide enough information to Mastermind to walk to an executable plan, Mastermind will provide you with a list of available options to choose.
For more information on how to use and configure Mastermind, check out the wiki.
Development
After checking out the repo, run bin/setup
to install dependencies. You can
also run bin/console
for an interactive prompt that will allow you to experiment.
Mastermind uses itself to run tests and build new versions. Run bin/rspec
to
run tests. To install this gem onto your local machine, run exe/mastermind gem install
To release a new version, update the version number in version.rb
, and then run
exe/mastermind gem release
, which will create a git tag for the version, push
git commits and tags, and push the .gem
file to rubygems.org.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/chall8908/cli-mastermind.
License
The gem is available as open source under the terms of the MIT License.