public function run($command, array $args = array())
    {
        $replacements = array();

        foreach ($args as $key => $arg) {
            $replacements['%'.$key.'%'] = ProcessUtils::escapeArgument($arg);
        }

        // Disable colorization so that we can process the output
        // Enable exception traces by using the "-vv" switch
        $fullCommand = sprintf('%s %s --no-ansi -vv', $this->puli, strtr($command, $replacements));

        $process = new Process($fullCommand);
        $process->run();

        if (!$process->isSuccessful()) {
            throw PuliRunnerException::forProcess($process);
        }

        // Normalize line endings across systems
        return str_replace("\r\n", "\n", $process->getOutput());
    }