A React Native Update command line tool for bundling, uploading native packages, publishing OTA versions, and managing apps/packages.
- Single
pushy/crescCLI entrypoint - Backward-compatible command set
- Programmatic provider API for build scripts and CI/CD
- Modular command registration for custom extensions
- TypeScript type definitions
npm install react-native-update-clinpx pushy help
npx pushy list
npx pushy bundle --platform ios
npx pushy publish --platform ios --name 1.0.0
npx pushy uploadIpa ./app.ipaimport { moduleManager } from 'react-native-update-cli';
const provider = moduleManager.getProvider();
const bundleResult = await provider.bundle({
platform: 'ios',
dev: false,
sourcemap: true,
});
if (!bundleResult.success) {
throw new Error(bundleResult.error);
}
const publishResult = await provider.publish({
name: 'v1.2.3',
description: 'Bug fixes and improvements',
rollout: 100,
});import type {
CLIModule,
CommandContext,
CommandResult,
} from 'react-native-update-cli';
export const myCustomModule: CLIModule = {
name: 'my-custom',
version: '1.0.0',
commands: [
{
name: 'custom-command',
description: 'My custom command',
handler: async (
context: CommandContext,
): Promise<CommandResult> => {
return {
success: true,
data: { options: context.options },
};
},
options: {
param: { hasValue: true, description: 'Custom parameter' },
},
},
],
init: () => {
console.log('Custom module initialized');
},
cleanup: () => {
console.log('Custom module cleanup');
},
};import { moduleManager } from 'react-native-update-cli';
import { myCustomModule } from './my-custom-module';
moduleManager.registerModule(myCustomModule);
const result = await moduleManager.executeCommand('custom-command', {
args: [],
options: { param: 'value' },
});bundle: Bundle JavaScript code and optionally publishhdiff: Generate hdiff between two PPK fileshdiffFromApk: Generate hdiff from APK fileshdiffFromApp: Generate hdiff from APP fileshdiffFromIpa: Generate hdiff from IPA files
publish: Publish a new versionversions: List versionsupdate: Update version package rulesupdateVersionInfo: Update version metadatadeleteVersion: Delete a version
createApp: Create an appapps: List appsselectApp: Select an appdeleteApp: Delete an app
uploadIpa: Upload IPA filesuploadApk: Upload APK filesuploadAab: Upload AAB filesuploadApp: Upload APP filesparseApp: Parse APP file informationparseIpa: Parse IPA file informationparseApk: Parse APK file informationparseAab: Parse AAB file informationextractApk: Extract a universal APK from an AABpackages: List packagesdeletePackage: Delete a package
login: Loginlogout: Logoutme: Show current user information
interface CLIProvider {
bundle(options: BundleOptions): Promise<CommandResult>;
publish(options: PublishOptions): Promise<CommandResult>;
upload(options: UploadOptions): Promise<CommandResult>;
getSelectedApp(
platform?: Platform,
): Promise<{ appId: string; platform: Platform }>;
listApps(platform?: Platform): Promise<CommandResult>;
createApp(name: string, platform: Platform): Promise<CommandResult>;
listVersions(appId: string): Promise<CommandResult>;
updateVersion(
appId: string,
versionId: string,
updates: Partial<Version>,
): Promise<CommandResult>;
getPlatform(platform?: Platform): Promise<Platform>;
loadSession(): Promise<Session>;
}export PUSHY_REGISTRY=https://your-api-endpoint.com
export NO_INTERACTIVE=trueCreate update.json in your React Native project:
{
"ios": {
"appId": "your-ios-app-id",
"appKey": "your-ios-app-key"
},
"android": {
"appId": "your-android-app-id",
"appKey": "your-android-app-key"
}
}All provider methods return CommandResult; check success before consuming data. The CLI supports ios, android, and harmony platforms.