function main() {
    var args = parseArgs(process.argv);

    function onFailure(err) {
        console.error(err);
    }
    function onSuccess(result) {
        if (typeof result.body == 'object') {
            console.log(JSON.stringify(result.body, null, 4));
        } else if (result.body) {
            console.log(result.body);
        }
    }

    var client = new HarnessClient(args.target);

    var cmd = args.argv.remain[0];
    if (cmd == 'push') {
        if (!args.argv.remain[1]) {
            usage();
        }
        var pushSession = client.createPushSession(args.argv.remain[1]);
        client.quit()
        .then(function() {
            return pushSession.push();
        }).then(onSuccess, onFailure);
    } else if (cmd == 'deleteall') {
        client.deleteAllApps().then(onSuccess, onFailure);
    } else if (cmd == 'delete') {
        if (!args.argv.remain[1]) {
            usage();
        }
        client.deleteApp().then(onSuccess, onFailure);
    } else if (cmd == 'menu') {
        client.menu().then(onSuccess, onFailure);
    } else if (cmd == 'eval') {
        if (!args.argv.remain[1]) {
            usage();
        }
        client.evalJs(args.argv.remain[1]).then(onSuccess, onFailure);
    } else if (cmd == 'assetmanifest') {
        client.assetmanifest(args.appid).then(onSuccess, onFailure);
    } else if (cmd == 'info') {
        client.info().then(onSuccess, onFailure);
    } else if (cmd == 'launch') {
        client.launch(args.argv.remain[1]).then(onSuccess, onFailure);
    } else if (cmd == 'quit') {
        client.quit().then(onSuccess, onFailure);
    } else {
        usage();
    }
}
 function createClient() {
   var target = targets[i++];
   if (!target) {
     ret.platforms = Object.keys(platformMap);
     return ret;
   }
   var newClient = new PushClient(target);
   return newClient.info()
   .then(function(response) {
     var infoJson = response.body;
     var platform = infoJson['platform'];
     platformMap[platform] = true;
     if (ret.appType == 'chrome') {
       ret.clientInfos.push({
           platform: platform,
           client: newClient,
           pushSession: newClient.createPushSession(chromeAppPushRoot),
           watchDir: chromeAppPushRoot
       });
     } else {
       // Vanilla Cordova project.
       var wwwDir = utils.assetDirForPlatform(platform);
       ret.clientInfos.push({
           platform: platform,
           client: newClient,
           pushSession: newClient.createPushSession('.'), // push client figures out to use platforms/
           watchDir: wwwDir
       });
     }
     return createClient();
   }, function(error) {
     if (error.code === 'ECONNREFUSED') {
       console.warn();
       console.warn('Could not connect to device at ' + target);
       console.warn('For a USB connected Android device, try running: adb forward tcp:2424 tcp:2424');
       console.warn('For a networked device, use --target=DEVICE_IP_ADDRESS');
     } else if (error.code === 'ECONNRESET') {
       console.warn('\nPlease make sure that the Chrome App Developer Tool for Mobile is running on your device.');
     } else {
       console.error(error);
     }
     process.exit();
   });
 }