A "node" is an element that looks like this:
{
"type": "root|literal|argument",
"parser": "", // only applicable if type is argument
"properties": {}, // only applicable if type is argument, defaults to empty object
"executable": true, // default if not specified is false, meaning it isn't a runnable command by itself
"children": {}, // default if not specified is {}, meaning no children
"redirect": [] // default if not specified is null, meaning no redirect
}
A redirect is a path to another node in the tree. ["foo", "bar", "baz"] means "find the child named foo of the root, then the child of that named bar, then the child of that named baz".
Every element of children is another node, which itself may have more children.
A literal type means "I expect the literal name of this node", and has no properties.
An argument type means it's dynamically parsed, using parser (and any optional properties)
What part? It's not actually going to be json. It's just a representation of in memory class structure? I've spent a decent amount of time picking it apart, and apart from my wishlist listed above it seems pretty rock solid. @justblender