const repl = require("repl");

class REPL {
  constructor(options) {
    this.env = options.env;
    this.plugins = options.plugins;
  }

  start(done) {
    this.replServer = repl.start({
      prompt: "Embark (" + this.env + ") > ",
      useGlobal: true
    });

    this.replServer.on("exit", () => {
      process.exit();
    });

    let self = this;
    this.replServer.defineCommand('profile', {
      help: 'Profile a contract',
      action(contract) {
        this.clearBufferedCommand();
        let pluginCmds = self.plugins.getPluginsProperty('console', 'console');
        for (let pluginCmd of pluginCmds) {
          pluginCmd.call(self, `profile ${contract}`, {});
        }
        this.displayPrompt();
      }
    });

    done();
  }

}

module.exports = REPL;

const repl = require("repl");

const Console = require('./console.js');

class REPL {
  constructor(options) {
    this.env = options.env;
    this.plugins = options.plugins;
    this.events = options.events;
    this.console = new Console({
      events: this.events,
      plugins: this.plugins,
      version: options.version
    });
  }

  enhancedEval(cmd, context, filename, callback) {
    this.console.executeCmd(cmd.trim(), (result) => {
      callback(null, result);
    });
  }

  start(done) {
    this.replServer = repl.start({
      prompt: "Embark (" + this.env + ") > ",
      useGlobal: true,
      eval: this.enhancedEval.bind(this)
    });

    this.replServer.on("exit", () => {
      process.exit();
    });

    done();
  }

}

module.exports = REPL;

Use console and override evaluator