lib/plugins/config/config.js/Config/constructor
class Config:  constructor(serverless, options) {
    this.serverless = serverless;
    this.options = options;

    this.commands = {
      config: {
        usage: 'Configure Serverless',
        configDependent: false,
        commands: {
          credentials: {
            usage: 'Configures a new provider profile for the Serverless Framework',
            lifecycleEvents: ['config'],
            validProviders,
            options: {
              provider: {
                usage: `Name of the provider. Supported providers: ${humanReadableProvidersList}`,
                required: true,
                shortcut: 'p',
              },
            },
          },
        },
      },
    };

    if (isTabTabCompletionSupported) {
      this.commands.config.commands.tabcompletion = {
        usage: 'Configure command line <tab> completion',
        commands: {
          install: {
            usage: 'Install a <tab> completion for chosen shell',
            lifecycleEvents: ['install'],
            options: {
              shell: {
                usage:
                  'Shell for which <tab> completion should be installed. ' +
                  'Supported options: bash (default), zsh, fish ',
                shortcut: 's',
              },
              location: {
                usage: 'Custom location for shell config',
                shortcut: 'l',
              },
            },
          },
          uninstall: {
            usage: 'Uninstall a <tab> completion for chosen shell',
            lifecycleEvents: ['uninstall'],
          },
        },
      };
    }

    this.hooks = {
      'before:config:credentials:config': () => this.validate(),
      'after:config:credentials:config': () => this.track(),
      'config:tabcompletion:install:install': () => this.tabtabCompletionInstall(),
      'config:tabcompletion:uninstall:uninstall': () => this.tabtabCompletionUninstall(),
    };
  }