Since I knew the first thing I would need is to take the dice expression and parse it. The tool I found to do this was the excellent PEGjs, assisted by a CoffeeScript plugin. Parsing Expression Grammars differ from the types of parser I’ve implemented in the past, so I had to take care to avoid left recursion. Ultimately, I used an interesting trick to flatten the recursion into iteration for left-associative opperators.
Since my parser returns a sane AST, writing an interpetter was not difficult, although combining the need to track state with the async nature of node required a bit of work, made more difficult by the fact that I have not worked with prototypal inheritance much before.
Left to do: write clients to integrate with IRC/other chat protocols, spruce up the default frontend, figure out what test framework to use for JS.