docs: function ShellCraft() {
    var self = this;
  
    var ArgumentsList = require('./lib/argumentslist.js');
    var Prompt = require('./lib/prompt.js');
  
    self._exit = false;
    self._shell = true; /* open the shell be default */
    self._scope = 'global';
  
    self.arguments = new ArgumentsList();
    self.arguments._add(
      'exit',
      new Command(
        function(callback) {
          self._exit = true;
          if (callback) {
            callback();
          }
        },
        {builtIn: true, scope: '*'},
        'exit the shell'
      )
    );
  
    self.arguments._add(
      'help',
      new Command(
        function(callback) {
          Object.keys(Object.getPrototypeOf(self.arguments)).forEach(function(
            fct
          ) {
            if (
              !self.arguments.hasOwnProperty(fct) &&
              !/^_/.test(fct) &&
              self.arguments[fct].type() === 'command' &&
              self.arguments[fct].isScoped(self._scope)
            ) {
              console.log(self.arguments[fct].help());
            }
          });
  
          console.log('');
  
          if (callback) {
            callback();
          }
        },
        {builtIn: true, scope: '*'},
        'list of commands'
      )
    );
  
    self.arguments._add(
      'scope',
      new Command(
        function(callback, scope) {
          self._scope = scope[0] || 'global';
          self.autocomplete.reload();
          self.prompt.setScope(self._scope !== 'global' ? scope : '');
  
          if (callback) {
            callback();
          }
        },
        {
          builtIn: true,
          scope: '*',
          params: {
            optional: 'scope',
          },
        },
        function() {
          var help = 'change scope';
          var scopes = [];
  
          /* Look for all available scopes */
          Object.keys(Object.getPrototypeOf(self.arguments)).forEach(function(
            fct
          ) {
            if (
              !self.arguments.hasOwnProperty(fct) &&
              !/^_/.test(fct) &&
              self.arguments[fct].type() === 'command'
            ) {
              var scope = self.arguments[fct].scope();
              if (scope === '*' || scope === 'global') {
                return;
              }
  
              if (scopes.indexOf(scope) === -1) {
                scopes.push(self.arguments[fct].scope());
              }
            }
          });
  
          var list = scopes.length ? ' (' + scopes.join(', ') + ')' : '';
          return help + list;
        }
      )
    );
  
    self.options = {
      version: '0.0.1',
    };
    self.prompt = new Prompt();
    self.extensions = {};
  
    /* HACK inquirer prefix */
    Object.keys(inquirer.prompt.prompts).forEach(function(prompt) {
      inquirer.prompt.prompts[prompt].prototype.getQuestion = function() {
        var msg = inquirer.prompt.prompts[
          prompt
        ].super_.prototype.getQuestion.bind(this)();
        return msg.replace(/[^ ]*\?[^ ]* /, '');
      };
    });
  }