Promise-driven animation
This stuff is hard to get right, at this point good promise driven code seems more like an art than engineering.

From a CodeReview perspective, your code is fairly easy to follow, except for one thing which got me stumped for a little while, row_complete should really be named char_complete, and then suddenly addLettersRecursive will make more sense.

There are at least 3 additional ways you can deal with .then(function() { return function_that_returns_promise(args); });


Change your functions ( like addInput ) to return a function, like this:

function addInput(s) {
  return function addInputWrapper(){
    var l = $('.prompt:last');
    return addLettersRecursive(l, s);
  }
}


Then you can call simply .then( addInput( 'whoami' ) )
Create a generic wrapper function like this:

function wrap( f ){
  var args = Array.prototype.slice.call(arguments,1);
  return function wrapper(){
    return f.apply( this, args );
  }
}


Then you can call .then( wrap( addInput, 'whoami' ) )
Generate a lambdafy function like this : 

function lambdafy( f )
{
  var lambda = function(){
    var args = Array.prototype.slice.call(arguments);
    return function(){
      f.apply( this , args );
    }
  }
  return lambda;
}


Then you can addInput = lambdafy( addInput ) and .then( addInput( 'whoami' ) )