Dart API

The built-in plugins can be accessed programmatically from Dart code โ€” no CLI invocation needed. This is useful for build scripts, custom tooling, or integrating impaktfull_cli into your own Dart application.

Setup

Use cli.run() to get direct access to plugin instances:

void main(List<String> args) async {
  final cli = ImpaktfullCli(arguments: args);
  await cli.run((cli) async {
    // use plugins here
  });
}

Use runMultipleCommands to sequence several plugin calls:

await cli.run((cli) async {
  await cli.runMultipleCommands(() async {
    await cli.flutterBuildPlugin.buildAndroid();
    await cli.playStorePlugin.uploadToPlayStore(/* ... */);
  });
});

CiCdPlugin

cli.ciCdPlugin โ€” Orchestrates full CI/CD pipelines. Combines build, sign, and upload into single calls.

buildAndroid

Future<void> buildAndroid({
  String? flavor,
  String mainDartFile = 'lib/main.dart',
  FlutterBuildAndroidExtension extension = FlutterBuildAndroidExtension.aab,
  bool obfuscate = true,
  String? splitDebugInfoPath = '.build/debug-info',
  int? buildNr,
  AppCenterUploadConfig? appCenterUploadConfig,
  PlayStoreUploadConfig? playStoreUploadConfig,
  ImpaktfullDashboardAppTestingVersionUploadConfig? impaktfullDashboardUploadConfig,
})

Builds and optionally uploads an Android artifact. Pass an upload config to automatically push to App Center, Play Store, or the impaktfull dashboard after building.

buildAndroidWithFlavor

Future<void> buildAndroidWithFlavor({
  required String flavor,
  String mainDartPrefix = 'lib/main_',
  FlutterBuildAndroidExtension extension = FlutterBuildAndroidExtension.aab,
  bool obfuscate = true,
  String? splitDebugInfoPaths = 'lib/main_',
  int? buildNr,
  AppCenterUploadConfig? appCenterUploadConfig,
  PlayStoreUploadConfig? playStoreUploadConfig,
  ImpaktfullDashboardAppTestingVersionUploadConfig? impaktfullDashboardUploadConfig,
})

Same as buildAndroid but resolves the entry point from a prefix + flavor name (e.g. lib/main_production.dart).

buildIos

Future<void> buildIos({
  String? flavor,
  String mainDartFile = 'lib/main.dart',
  FlutterBuildIosExtension extension = FlutterBuildIosExtension.ipa,
  bool obfuscate = true,
  String? splitDebugInfoPath = '.build/debug-info',
  int? buildNr,
  AppCenterUploadConfig? appCenterUploadConfig,
  TestFlightUploadConfig? testflightUploadConfig,
  ImpaktfullDashboardAppTestingVersionUploadConfig? impaktfullDashboardUploadConfig,
})

buildIosWithFlavor

Future<void> buildIosWithFlavor({
  required String flavor,
  String mainDartPrefix = 'lib/main_',
  FlutterBuildIosExtension extension = FlutterBuildIosExtension.ipa,
  bool obfuscate = true,
  String? splitDebugInfoPaths = 'lib/main_',
  int? buildNr,
  AppCenterUploadConfig? appCenterUploadConfig,
  TestFlightUploadConfig? testflightUploadConfig,
  ImpaktfullDashboardAppTestingVersionUploadConfig? impaktfullDashboardUploadConfig,
})

versionBump

Future<int> versionBump({
  String? flavor,
  String? suffix,
  bool commitChanges = true,
})

Bumps the version in release_config.json, optionally commits the change, and returns the new build number.

getGithubBuildNr

Future<int> getGithubBuildNr({int incrementBy = 0})

Returns the current GITHUB_RUN_NUMBER env variable as an integer, optionally incremented.

FlutterBuildPlugin

cli.flutterBuildPlugin โ€” Builds Flutter apps and returns the output file.

buildAndroid

Future<File> buildAndroid({
  String? flavor,
  String? mainDartFile = 'lib/main.dart',
  FlutterBuildAndroidExtension extension = FlutterBuildAndroidExtension.aab,
  bool obfuscate = true,
  String? splitDebugInfoPath = 'build/debug-info',
  int? buildNr,
})

Returns the built .aab or .apk file.

buildIos

Future<File> buildIos({
  String? flavor,
  String? mainDartFile = 'lib/main.dart',
  FlutterBuildIosExtension extension = FlutterBuildIosExtension.ipa,
  bool obfuscate = true,
  String? splitDebugInfoPath = '.build/debug-info',
  int? buildNr,
})

Returns the built .ipa or .xcarchive file.

PlayStorePlugin

cli.playStorePlugin โ€” Uploads Android builds to the Google Play Store.

uploadToPlayStore

Future<void> uploadToPlayStore({
  required File file,
  required PlaystoreTrackType trackType,
  required PlaystoreReleaseStatus releaseStatus,
  File? serviceAccountCredentialsFile,
})

Uploads the given .aab or .apk to the specified Play Store track. If serviceAccountCredentialsFile is not provided, falls back to the GOOGLE_SERVICE_ACCOUNT_JSON_RAW environment variable.

AppCenterPlugin

cli.appCenterPlugin โ€” Uploads builds to Microsoft App Center.

uploadToAppCenter

Future<void> uploadToAppCenter({
  required String appName,
  required File file,
  String? ownerName,
  Secret? apiToken,
  List<String> distributionGroups = defaultDistributionGroups,
  bool notifyListeners = true,
})

Uploads a build artifact to App Center and optionally notifies distribution group members. Falls back to APPCENTER_OWNER_NAME and APPCENTER_API_TOKEN environment variables if not provided.

cleanup

Future<void> cleanup()

TestFlightPlugin

cli.testflightPlugin โ€” Uploads iOS builds to Apple TestFlight.

uploadToTestflightWithEmailPassword

Future<void> uploadToTestflightWithEmailPassword({
  required File file,
  String? email,
  Secret? appSpecificPassword,
  String type = 'ios',
})

Uses altool under the hood. Falls back to APPLE_EMAIL and APPLE_APP_SPECIFIC_PASSWORD environment variables if not provided.

OnePasswordPlugin

cli.onePasswordPlugin โ€” Reads secrets and files from 1Password.

getPassword

Future<Secret> getPassword({
  required String vaultName,
  required String opUuid,
  required String fieldName,
  Secret? rawServiceAccount,
  String? logContext,
})

getOnePasswordField

Future<String> getOnePasswordField({
  required String vaultName,
  required String opUuid,
  required String fieldName,
  Secret? rawServiceAccount,
  String? logContext,
})

Returns the field value as a plain string (use getPassword for sensitive values).

downloadFile

Future<File> downloadFile({
  required String opUuid,
  required String outputPath,
  String? vaultName,
  Secret? rawServiceAccount,
  String? logContext,
  bool removeFileAfterCliRun = true,
})

downloadDistributionCertificate

Future<File> downloadDistributionCertificate({
  required String opUuid,
  String? vaultName,
  String outputPath = 'certificates/apple_distribution.p12',
  Secret? rawServiceAccount,
  bool removeFileAfterCliRun = true,
})

downloadServiceAccountCredentials

Future<File> downloadServiceAccountCredentials({
  required String opUuid,
  String outputPath = 'android/playstore_credentials.json',
  String? vaultName,
  Secret? rawServiceAccount,
  bool removeFileAfterCliRun = true,
})

getCertificatePassword

Future<Secret> getCertificatePassword({
  required String opUuid,
  required String vaultName,
  String fieldName = 'password',
  Secret? rawServiceAccount,
})

getTestFlightCredentials

Future<TestFlightCredentials> getTestFlightCredentials({
  required String vaultName,
  required String opUuid,
  Secret? rawServiceAccount,
})

cleanupStoredFiles

Future<void> cleanupStoredFiles()

Deletes any files downloaded from 1Password that were registered for cleanup. Called automatically at the end of ImpaktfullCli.run().

MacOsKeyChainPlugin

cli.macOsKeyChainPlugin โ€” Manages macOS keychains for code signing.

unlockKeyChain

Future<void> unlockKeyChain({
  String name = 'login',
  Secret? password,
})

Unlocks the named keychain. Falls back to the CI_KEYCHAIN_PASSWORD environment variable if password is not provided.

AppleProvisioningProfilePlugin

cli.appleProvisioningProfilePlugin โ€” Installs Apple provisioning profiles.

installProvisioningProfile

Future<void> installProvisioningProfile({
  required File provisioningProfile,
  bool override = true,
})

scanAndInstallProvisioningProfiles

Future<void> scanAndInstallProvisioningProfiles({
  Directory? directory,
  bool override = true,
})

Scans the given directory (defaults to the current directory) for .mobileprovision files and installs all of them.

SlackPlugin

Instantiate directly โ€” not exposed on ImpaktfullCli:

final slack = SlackPlugin(processRunner: cli.processRunner);

sendMessage

Future<void> sendMessage({
  required String channelName,
  String? message,
  List<SlackMessageAttachment> attachments = const [],
})

GitPlugin

Instantiate directly โ€” not exposed on ImpaktfullCli:

final git = GitPlugin(processRunner: cli.processRunner);

isGitClean

Future<bool> isGitClean()

Returns true if there are no uncommitted changes. Returns true if git is not installed.

validateGitClean

Future<void> validateGitClean()

Throws if the working tree is not clean.

isGitProject

Future<bool> isGitProject()

TestCoveragePlugin

Instantiate directly โ€” not exposed on ImpaktfullCli:

final coverage = TestCoveragePlugin(processRunner: cli.processRunner);

testCoverage

Future<TestCoverageReport> testCoverage({
  required String path,
  required TestCoverageType type,
  String outputPath = 'coverage',
  bool overrideLcovFile = true,
  List<RegExp> ignorePatterns = const [],
})

Runs tests, generates an lcov report, and returns a TestCoverageReport with the coverage percentage and file breakdown.

ImpaktfullDashboardPlugin

Instantiate directly โ€” not exposed on ImpaktfullCli:

final dashboard = ImpaktfullDashboardPlugin(processRunner: cli.processRunner);

uploadAppTestingVersionToImpaktfullDashboard

Future<void> uploadAppTestingVersionToImpaktfullDashboard({
  required File file,
  required ImpaktfullDashboardAppTestingVersionUploadConfig config,
})