How the installer this process ran finished — shaped like the process it describes.
exitCode and signalCode are the two ChildProcess carries after it closes, and they mean
the same here: a process that exits has a code and no signal, one that is killed has a signal
and no code. Keeping both spellings means a caller never has to translate this back into what
really happened before reporting it.
exitCode: number | null
The installer's exit code. Null when a signal killed it, or when it never started.
signalCode: NodeJS.Signals | null
The signal that killed it, or null when it exited on its own.
isMissingInstallerBinary: boolean
True when the installer is not on PATH at all — deno on a machine without deno.
Its own field rather than an error, because it is the one outcome that is not a failure of the upgrade: nothing ran, nothing broke, and printing the command really is the best answer left.