async run() {
    if (this.configurationInput) this.service.reloadServiceFileParam()

    // make sure the command exists before doing anything else
    this.pluginManager.validateCommand(this.processedInput.commands)

    // Some plugins acccess `options` through `this.variables`
    this.variables.options = this.pluginManager.cliOptions

    if (this.processedInput.commands[0] !== 'plugin') {
      // merge arrays after variables have been populated
      // (https://github.com/serverless/serverless/issues/3511)
      this.service.mergeArrays()

      // populate function names after variables are loaded in case functions were externalized
      // (https://github.com/serverless/serverless/issues/2997)
      this.service.setFunctionNames(this.processedInput.options)

      // If in context of service, validate the service configuration
      if (this.serviceDir) await this.service.validate()
    }

    this.serviceOutputs = new Map()
    this.servicePluginOutputs = new Map()

    /**
     * Remove the progress spinner.
     * Leave spinner responsibility to commands.
     * Hide the spinner here so that no blank space is shown,
     * between Framework init and a plugin using the spinner.
     */
    const progressMain = progress.get('main')
    progressMain.remove()

    // trigger the plugin lifecycle when there's something which should be processed
    await this.pluginManager.run(this.processedInput.commands)
  }
Executes the Serverless instance. This method is responsible for reloading
service file parameters, validating commands, setting variables, merging
arrays, setting function names, validating the service configuration, and
initializing service outputs. It also triggers the plugin lifecycle for
processing commands. This method is typically called to run a Serverless
instance.

@async
@throws {Error} If there's an error in command validation, service validation,
or during the plugin lifecycle.