id = "suitecloud" name = "SuiteCloud CLI for Node.js" homepage = "https://github.com/oracle/netsuite-suitecloud-sdk" description = "A SuiteCloud SDK tool to manage SuiteCloud project components and validate and deploy projects to your account." # The NetSuite mark Oracle ships as the icon of the SuiteCloud extension # in this same repository. icon = "https://raw.githubusercontent.com/oracle/netsuite-suitecloud-sdk/master/packages/vscode-extension/resources/extension_icon_dark.png" executables = ["suitecloud"] [dotfiles] # Nothing to sync as content: a SuiteCloud project is described by files inside # the project folder (project.json, manifest.xml, deploy.xml), and the only # things the CLI writes to the home directory are the credential keystores # below plus the local state carved out in `exclude`. paths = [] # All from @oracle/suitecloud-cli 4.0.0, which resolves each of these against # os.homedir() + FOLDERS.SUITECLOUD_SDK (".suitecloud-sdk"): # src/core/sdksetup/SdkProperties.js getSdkPath() → .suitecloud-sdk/cli/ # — the Java SDK jar the CLI downloads on first run, a binary artifact. # src/services/settings/CLISettingsService.js SDK_SETTINGS_FILEPATH → # .suitecloud-sdk/suitecloud-sdk-settings.json — { isJavaVersionValid, # vmOptions }, the cached result of probing this machine's JDK. # The log directory is the `.suitecloud-sdk/log/` constant in the same SDK jar. exclude = [ "~/.suitecloud-sdk/cli/", "~/.suitecloud-sdk/log/", "~/.suitecloud-sdk/suitecloud-sdk-settings.json", ] # The account credentials are PKCS#12 keystores. The Node CLI hands credential # work to the Java SDK jar it downloads (cli-2026.2.0.jar, from the # sdkDownloadUrl in @oracle/suitecloud-cli's package.json); in that jar # com/netsuite/ide/core/configuration/CoreConstants and # com/netsuite/ide/core/credentials/repository/CredentialsFileProvider carry the # constants "user.home", ".suitecloud-sdk", "credentials_browser_based.p12" # (browser-based authentication, i.e. `suitecloud account:setup`) and # "credentials_ci.p12" (machine-to-machine, `account:savetoken`). # client_api_key.p12 is the third keystore, named in the CLI itself # (src/ApplicationConstants.js FILES.CLIENT_API_KEY, joined with the same folder # in src/utils/ClientAPIKeyObjectWrapper.js). # # Each keystore is encrypted with a random passkey the SDK keeps in the OS # secure storage under "Oracle Netsuite: Account Credentials" / "Oracle Netsuite: # Client API Key" (com/netsuite/ide/core/services/SecureStorageServiceImpl), or # in a passkey environment variable for CI. A consumer that carries these files # has to carry that passkey too, or re-authenticate on the new machine. secret = [ "~/.suitecloud-sdk/credentials_browser_based.p12", "~/.suitecloud-sdk/credentials_ci.p12", "~/.suitecloud-sdk/client_api_key.p12", ] [commands] format = 1 label = "SuiteCloud project commands" description = "Deploy or validate a SuiteCloud project. Account, object and file commands are left out." quality = "ai-draft" base = "fig:suitecloud" parser = { end_of_options = "--", interleave = "permute", long_equals = true, short_attached = true, short_bundles = false } [[commands.source]] id = "fig" kind = "completion" url = "https://github.com/withfig/autocomplete/blob/master/src/suitecloud.ts" license = "MIT" [[commands.subcommand]] path = ["project:deploy"] label = "Deploy project" description = "Deploy the project folder to the account." parser = { end_of_options = "--", interleave = "permute", long_equals = true, short_attached = true, short_bundles = false } [[commands.subcommand.source]] id = "fig" kind = "completion" url = "https://github.com/withfig/autocomplete/blob/master/src/suitecloud.ts" license = "MIT" [[commands.subcommand.field]] id = "interactive" label = "Interactive mode" type = "boolean" option = ["--interactive", "-i"] sources = ["fig"] [[commands.subcommand.field]] id = "dryrun" label = "Dry run" description = "Preview the deploy without deploying." type = "boolean" option = ["--dryrun"] sources = ["fig"] [[commands.subcommand.field]] id = "validate" label = "Validate first" type = "boolean" option = ["--validate"] sources = ["fig"] [[commands.subcommand.field]] id = "log" label = "Log location" type = "path" option = ["--log"] path = { kind = "any", role = "output", must_exist = false } sources = ["fig"] [[commands.subcommand.field]] id = "accountspecificvalues" label = "Account-specific values" type = "string" option = ["--accountspecificvalues"] suggestions = [{ value = "ERROR", label = "ERROR" }, { value = "WARNING", label = "WARNING" }] sources = ["fig"] [[commands.subcommand.field]] id = "applyinstallprefs" label = "Apply install preferences" description = "Only applies to SuiteApps." type = "boolean" option = ["--applyinstallprefs", "-a"] sources = ["fig"] [[commands.subcommand.task]] id = "deploy" label = "Deploy" fields = ["interactive", "validate", "log"] required = [] [[commands.subcommand.task]] id = "preview" label = "Preview deploy" set = { dryrun = [true] } lock = ["dryrun"] fields = ["dryrun", "validate"] required = [] [[commands.subcommand.group]] id = "basic" label = "Basic" fields = ["interactive", "dryrun", "validate"] [[commands.subcommand.group]] id = "advanced" label = "Advanced" fields = ["log", "accountspecificvalues", "applyinstallprefs"] [[commands.subcommand]] path = ["project:validate"] label = "Validate project" description = "Validate the project folder." parser = { end_of_options = "--", interleave = "permute", long_equals = true, short_attached = true, short_bundles = false } [[commands.subcommand.source]] id = "fig" kind = "completion" url = "https://github.com/withfig/autocomplete/blob/master/src/suitecloud.ts" license = "MIT" [[commands.subcommand.field]] id = "interactive" label = "Interactive mode" type = "boolean" option = ["--interactive", "-i"] sources = ["fig"] [[commands.subcommand.field]] id = "server" label = "Validate on server" type = "boolean" option = ["--server"] sources = ["fig"] [[commands.subcommand.field]] id = "log" label = "Log location" type = "path" option = ["--log"] path = { kind = "any", role = "output", must_exist = false } sources = ["fig"] [[commands.subcommand.field]] id = "accountspecificvalues" label = "Account-specific values" type = "string" option = ["--accountspecificvalues"] suggestions = [{ value = "ERROR", label = "ERROR" }, { value = "WARNING", label = "WARNING" }] sources = ["fig"] [[commands.subcommand.field]] id = "applyinstallprefs" label = "Apply install preferences" description = "Only applies to SuiteApps." type = "boolean" option = ["--applyinstallprefs", "-a"] sources = ["fig"] [[commands.subcommand.task]] id = "validate" label = "Validate" fields = ["interactive", "server", "log"] required = [] [[commands.subcommand.group]] id = "basic" label = "Basic" fields = ["interactive", "server"] [[commands.subcommand.group]] id = "advanced" label = "Advanced" fields = ["log", "accountspecificvalues", "applyinstallprefs"]