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)
@MrYurihi it's passed to the parser, so it may change how the node is parsed in some way. For example,
brigadier:intcan accept a min/max in properties. Orminecraft:entitymay use it to decide if it should allow more than one entity.