docs: function(cmd, options) {
              kbox.tasks.add(function(task) {
                task.path = [app.name, cmd];
                task.category = 'appCmd';
                task.kind = 'delegate';
                task.description = options.description;
                task.func = function() {
  
                  // If our task has a working directory mapping specified lets set
                  // a working directory plus env so we have something to use to
                  // drop the user into the right location in the container to run
                  // their task
                  // @todo: clean this up so we only call env.setEnv once
                  if (_.has(options, 'mapping')) {
  
                    // Resolve any path mappings that are in config
                    var dirs = _.map(options.mapping.split(':'), function(path) {
                      return getMappingProp(path);
                    });
  
                    // Get relevant directories so we can determine the correct
                    // working directory
                    var lSplit = path.join(app.root, dirs[0]).split(path.sep);
                    var pwdSplit = process.cwd().split(path.sep);
                    var diffDir = _.drop(pwdSplit, lSplit.length).join('/');
                    var workingDir = [dirs[1], diffDir].join('/');
                    app.env.setEnv('KALABOX_CLI_WORKING_DIR', workingDir);
                  }
  
                  // Shift off our first cmd arg if its also the entrypoint
                  // or the name of the command
                  // @todo: this implies that our entrypoint should be in the path
                  // and not constructed absolutely
                  var payload = kbox.core.deps.get('argv').payload;
                  if (options.entrypoint === payload[0] ||
                      options.stripfirst) {
                    payload.shift();
                  }
  
                  // Set the payload to be the command,
                  options.cmd = payload;
  
                  // If we have pre cmd opts then unshift them
                  // @todo: handle pre cmd opt array?
                  if (options.precmdopts) {
                    if (typeof options.precmdopts === 'object') {
                      _.each(options.precmdopts.reverse(), function(opt) {
                        options.cmd.unshift(opt);
                      });
                    }
                    else {
                      options.cmd.unshift(options.precmdopts);
                    }
                  }
  
                  // If we have posrt cmd opts then unshift them
                  // @todo: handle post cmd opt array?
                  if (options.postcmdopts) {
                    if (typeof options.postcmdopts === 'object') {
                      _.each(options.postcmdopts.reverse(), function(opt) {
                        options.cmd.push(opt);
                      });
                    }
                    else {
                      options.cmd.push(options.postcmdopts);
                    }
                  }
  
                  // if an arg has spaces lets assume we need to wrap it in
                  // quotes
                  // @todo: this is probably a bad assumption
                  options.cmd = _.map(options.cmd, function(arg) {
                    return (_.includes(arg, ' ')) ? '"' + arg + '"' : arg;
                  });
  
                  // Get teh run definition objecti
                  var runDef = getRun(options);
  
                  // RUN IT!
                  return kbox.engine.run(runDef);
  
                };
              });
            }