Started thinking over your suggestion, and it looks like I've already gone through the scenario you had described (in fact, there are code artifacts stuffed in VA).
Where it got icky is when you start by saying a command (when i say): 'increase front shields'. 'increase front shields' gets popped into {LASTSPOKENCMD}.
When the next command called, 'repeat' is issued (forgetting about the new, 'repeat' keywords for now), '{LASTSPOKENCMD}' is now, 'repeat' and {PREVIOUSSPOKENCMD} is 'increase front shields' (this is independent of any actions).
In the actions, you grab, '{PREVIOUSSPOKENCMD}' (which is currently, 'increase front shields') and then execute it. So far so good.
You say, 'repeat' again, and the {PREVIOUSSPOKENCMD} is, 'repeat' from the last spoken command. This is where it breaks down and gets wrapped up in a way that I'd rather not implement.
So, this got me thinking about making a token that is like what you had suggested, but doesn't just stop at just the previous spoken command. It will be something like {SPOKENCMD:X}, where {SPOKENCMD:0} would be the same as {LASTSPOKENCMD}, {SPOKENCMD:1} would be {PREVIOUSSPOKENCMD} and, {SPOKENCMD:2} would be like {PRIORTOTHEPREVIOUSSPOKENCMD}, and so on. Put a max of like 100 or 1000 or whatever on it. It would work around the, 'repeat' keywords by not including the repeat keywords in the list (but rather use the repeated command's phrase). It would still fall into the same scenario I outlined above if used in conjunction with a spoken command to activate it, BUT, it would still allow for things like an alternate device to invoke the repeated command. Just a thought.
You can see why I've dragged my feet on all this, right?