OakCLI is an odd tool... it is either meant to be run interactively to change the default board being programmed - or run by the Arduino IDE to do the actual upload (which I'll talk about further in a moment). I still generally agree with #1-4 on the whole though... it may have been better to have made it two separate programs (although I also know plenty of programs that are interative if you run them with no parameters, and if you give them the right ones, they become non-interative / batch mode). I might go poking around in the code on github and see if I can send Erik some pull requests to make some of that a bit more user friendly.
Just on #5 ... No... the arduino IDE does NOT upload to the Oak itself. This is the case with standard arduino boards, but not with the Oak, Digispark, STM32 devices, ESP8266 devices, and a few others. It is actually passed on to the helper programs, and in the case of the Oak, this is... oakcli!

The Arduino IDE builder compiles the code into a binary as per the compiler recipes, and passes the binary file to OakCLI for OTA upload, or to esptool.py (correct naming?) for serial upload.
i.e. if you run the Arduino IDE, and go Sketch -> Export compiled binary, you should be able to get the generated binary (which has been copied from the temporary folder to the sketchbook folder, so do a Sketch -> Show Sketch Folder to see the contents of the sketch folder, and get the binary file that you should then be able to shove into oakcli.
However, getting back to your makefile... maybe it would be easier to avoid using oakcli for this specific task? What you really want to do is to change the default device to be programmed, and then let the Arduino IDE compile and upload (thus using oakcli as it was intended). On windows, you would be able to achieve this by editing one (or possibly three) lines in the %appdata%\Oak\config.json file (when you change the device in oakcli, it should tell you up the top where the config file is when it updates it). Since I believe you're on a Mac... maybe look for the equivalent file, and either make several copies of it which you can swap in and out as you want to change devices, or edit the file accordingly. The contents of the file looks like this (minus the Xs!):
{
"access_token": "c796XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"devices": [
{
"device_id": "d957XXXXXXXXXXXXXXXXXXXX",
"device_name": "Oak1",
"active": false
},
{
"device_id": "d957XXXXXXXXXXXXXXXXXXXX",
"device_name": "Oak3",
"active": false
},
{
"device_id": "d957XXXXXXXXXXXXXXXXXXXX",
"device_name": "Oak5",
"active": true
},
{
"device_id": "d957XXXXXXXXXXXXXXXXXXXX",
"device_name": "Oak2",
"active": false
},
{
"device_id": "d957XXXXXXXXXXXXXXXXXXXX",
"device_name": "Oak4",
"active": false
}
],
"device_id": "d957XXXXXXXXXXXXXXXXXXXX",
"device_name": "Oak5 (Device ID: d957XXXXXXXXXXXXXXXXXXXX)"
}You only need to which one is active if you want to change the default OTA upload target. The extra device_id and device_name listed at the bottom doesn't appear to be used or displayed.
Hope that is of some help.