mSpec top-level property

FigSpec mSpec
final

Completion spec for m CLI

Implementation

final FigSpec mSpec =
    FigSpec(name: 'm', description: 'Swiss Army Knife for macOS', subcommands: [
  Subcommand(name: 'airdrop', description: 'Manage AirDrop', subcommands: [
    Subcommand(name: 'status', description: 'Show AirDrop status'),
    Subcommand(name: 'on', description: 'Enable AirDrop'),
    Subcommand(name: 'enable', description: 'Enable AirDrop'),
    Subcommand(name: 'off', description: 'Disable AirDrop'),
    Subcommand(name: 'disable', description: 'Disable AirDrop'),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(
      name: 'appearance',
      description: 'Manage appearance',
      subcommands: [
        Subcommand(name: 'darkmode', description: 'Manage dark mode', args: [
          Arg(
              name: 'status',
              description: 'Whether to use dark versions of interface elements',
              suggestions: [
                FigSuggestion(name: 'YES'),
                FigSuggestion(name: 'NO')
              ])
        ]),
        Subcommand(
            name: 'transparency',
            description: 'Manage transparency',
            args: [
              Arg(
                  name: 'status',
                  description:
                      'Whether to allow the OS to make certain elements semi-transparent',
                  suggestions: [
                    FigSuggestion(name: 'YES'),
                    FigSuggestion(name: 'NO')
                  ])
            ]),
        Subcommand(
            name: 'antialiasthreshold',
            description: 'Manage antialiasing threshold',
            args: [
              Arg(
                  name: 'threshold',
                  description:
                      'The threshold above which antialiasing is turned on')
            ]),
        Subcommand(
            name: 'sidebariconsize',
            description: 'Manage sidebar icon size',
            args: [
              Arg(
                  name: 'size',
                  description:
                      'The size of the icons in various window sidebars',
                  suggestions: [
                    FigSuggestion(name: 'small'),
                    FigSuggestion(name: 'medium'),
                    FigSuggestion(name: 'large')
                  ])
            ]),
        Subcommand(name: 'maincolor', description: 'Manage main color', args: [
          Arg(
              name: 'color',
              description:
                  'The color used for the majority of the interface elements',
              suggestions: [
                FigSuggestion(name: 'blue'),
                FigSuggestion(name: 'graphite')
              ])
        ]),
        Subcommand(
            name: 'highlightcolor',
            description: 'Manage highlight color',
            args: [
              Arg(
                  name: 'color',
                  description: 'The color used for highlights',
                  suggestions: [
                    FigSuggestion(name: 'graphite'),
                    FigSuggestion(name: 'cayenne'),
                    FigSuggestion(name: 'asparagus'),
                    FigSuggestion(name: 'clover'),
                    FigSuggestion(name: 'teal'),
                    FigSuggestion(name: 'midnight'),
                    FigSuggestion(name: 'plum'),
                    FigSuggestion(name: 'tin'),
                    FigSuggestion(name: 'nickel'),
                    FigSuggestion(name: 'mocha'),
                    FigSuggestion(name: 'fern'),
                    FigSuggestion(name: 'moss'),
                    FigSuggestion(name: 'ocean'),
                    FigSuggestion(name: 'eggplant'),
                    FigSuggestion(name: 'maroon'),
                    FigSuggestion(name: 'steel'),
                    FigSuggestion(name: 'aluminum'),
                    FigSuggestion(name: 'maraschino'),
                    FigSuggestion(name: 'lemon'),
                    FigSuggestion(name: 'spring'),
                    FigSuggestion(name: 'turquoise'),
                    FigSuggestion(name: 'blueberry'),
                    FigSuggestion(name: 'magenta'),
                    FigSuggestion(name: 'iron'),
                    FigSuggestion(name: 'magnesium'),
                    FigSuggestion(name: 'tangerine'),
                    FigSuggestion(name: 'lime'),
                    FigSuggestion(name: 'seafoam'),
                    FigSuggestion(name: 'aqua'),
                    FigSuggestion(name: 'grape'),
                    FigSuggestion(name: 'strawberry'),
                    FigSuggestion(name: 'tungsten'),
                    FigSuggestion(name: 'silver'),
                    FigSuggestion(name: 'salmon'),
                    FigSuggestion(name: 'banana'),
                    FigSuggestion(name: 'flora'),
                    FigSuggestion(name: 'ice'),
                    FigSuggestion(name: 'orchid'),
                    FigSuggestion(name: 'bubblegum'),
                    FigSuggestion(name: 'lead'),
                    FigSuggestion(name: 'mercery'),
                    FigSuggestion(name: 'cantaloupe'),
                    FigSuggestion(name: 'honeydew'),
                    FigSuggestion(name: 'spindrift'),
                    FigSuggestion(name: 'sky'),
                    FigSuggestion(name: 'lavender'),
                    FigSuggestion(name: 'carnation'),
                    FigSuggestion(name: 'licorice'),
                    FigSuggestion(name: 'snow')
                  ])
            ]),
        Subcommand(name: 'help', description: 'Show help')
      ]),
  Subcommand(name: 'battery', description: 'Manage battery', subcommands: [
    Subcommand(name: 'status', description: 'Show battery status'),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(name: 'bluetooth', description: 'Manage Bluetooth', subcommands: [
    Subcommand(name: 'status', description: 'Show bluetooth status'),
    Subcommand(name: 'on', description: 'Enable bluetooth'),
    Subcommand(name: 'enable', description: 'Enable bluetooth'),
    Subcommand(name: 'off', description: 'Disable bluetooth'),
    Subcommand(name: 'disable', description: 'Disable bluetooth'),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(name: 'dir', description: 'Manage directories', subcommands: [
    Subcommand(
        name: 'tree',
        description: 'Show tree view of folders in the current path',
        args: [
          Arg(
              name: 'path',
              description: 'Path to show tree view of folders',
              isOptional: true,
              template: 'folders')
        ]),
    Subcommand(name: 'delete', description: 'Delete folders', subcommands: [
      Subcommand(
          name: 'empty',
          description: 'Delete empty folders recursively in the current path',
          args: [
            Arg(
                name: 'path',
                description: 'Path to delete empty folders',
                isOptional: true,
                template: 'folders')
          ]),
      Subcommand(
          name: 'dsfiles',
          description: 'Delete .DS_Store files recursively in the current path',
          args: [
            Arg(
                name: 'path',
                description:
                    'Delete .DS_Store files recursively in a specific path',
                isOptional: true,
                template: 'folders')
          ])
    ]),
    Subcommand(
        name: 'dsfiles',
        description: 'Manage .DS_Store files',
        subcommands: [
          Subcommand(
              name: 'on', description: 'Restore generation of .DS_Store'),
          Subcommand(
              name: 'off', description: 'Prohibit generation of .DS_Store')
        ]),
    Subcommand(
        name: 'size',
        description: 'Calculate current folder size',
        args: [
          Arg(
              name: 'path',
              description: 'Path to calculate folder size',
              isOptional: true,
              template: 'folders')
        ]),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(name: 'disk', description: 'Manage disks', subcommands: [
    Subcommand(
        name: ['ls', 'list'],
        description: 'List disk partitions',
        args: [
          Arg(
              name: 'path',
              description: 'Path to the disk file',
              isOptional: true,
              generators: [Generator(template: 'filepaths'), generateDisks])
        ]),
    Subcommand(name: 'info', description: 'Show disk information', args: [
      Arg(
          name: 'path',
          description: 'Path to show disk information',
          generators: [Generator(template: 'filepaths'), generateDisks])
    ]),
    Subcommand(name: 'ejectall', description: 'Eject all mountable volumes'),
    Subcommand(name: 'verify', description: 'Verify disk', subcommands: [
      Subcommand(name: 'volume', description: 'Verify volume', args: [
        Arg(
            name: 'path',
            description: 'Path to verify volume',
            generators: [Generator(template: 'filepaths'), generateVolumes])
      ]),
      Subcommand(name: 'disk', description: 'Verify disk', args: [
        Arg(
            name: 'path',
            description: 'Path to verify disk',
            generators: [Generator(template: 'filepaths'), generateDisks])
      ])
    ]),
    Subcommand(name: 'repair', description: 'Repair disk', subcommands: [
      Subcommand(name: 'volume', description: 'Repair volume', args: [
        Arg(
            name: 'path',
            description: 'Path to repair volume',
            generators: [Generator(template: 'filepaths'), generateVolumes])
      ]),
      Subcommand(name: 'disk', description: 'Repair disk', args: [
        Arg(
            name: 'path',
            description: 'Path to repair disk',
            generators: [Generator(template: 'filepaths'), generateDisks])
      ])
    ]),
    Subcommand(name: 'format', description: 'Format disk', subcommands: [
      Subcommand(
          name: 'MS-DOS',
          description: 'Format the entire disk with a windows format (MS-DOS)',
          args: [
            Arg(name: 'name', description: 'Name of the volume'),
            Arg(
                name: 'path',
                description: 'Path to format the entire disk',
                generators: [Generator(template: 'filepaths'), generateDisks])
          ]),
      Subcommand(
          name: 'volume',
          description: 'Format the volume with a windows format (MS-DOS)',
          args: [
            Arg(name: 'name', description: 'Name of the volume'),
            Arg(
                name: 'path',
                description: 'Path to format the volume',
                generators: [Generator(template: 'filepaths'), generateVolumes])
          ])
    ]),
    Subcommand(name: 'reformat', description: 'Reformat a volume', args: [
      Arg(
          name: 'path',
          description: 'Path to reformat a volume',
          generators: [Generator(template: 'filepaths'), generateVolumes])
    ]),
    Subcommand(name: 'rename', description: 'Rename a volume', args: [
      Arg(
          name: 'currentName',
          description: 'Current name of the volume',
          generators: [Generator(template: 'filepaths'), generateVolumes]),
      Arg(name: 'newName', description: 'New name of the volume')
    ]),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(name: 'display', description: 'Manage displays', subcommands: [
    Subcommand(name: 'status', description: 'Show display status'),
    Subcommand(name: 'help', description: 'Show usage'),
    Subcommand(name: 'up', description: 'Turn up the brightness'),
    Subcommand(name: 'down', description: 'Turn down the brightness')
  ]),
  Subcommand(name: 'dns', description: 'Manage dns', subcommands: [
    Subcommand(name: 'flush', description: 'Flush local DNS cache'),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(name: 'dock', description: 'Manage dock', subcommands: [
    Subcommand(
        name: 'showdelay',
        description:
            'Changes how long the Dock takes to show up when auto-hide is enabled',
        args: [Arg(name: 'seconds', description: 'Seconds to show delay')]),
    Subcommand(
        name: 'autohide',
        description: 'Enable or disable Dock\'s auto hide feature',
        args: [
          Arg(
              name: 'YES/NO',
              description: 'YES/NO to enable/disable Dock\'s auto hide feature',
              suggestions: [
                FigSuggestion(name: 'YES'),
                FigSuggestion(name: 'NO')
              ])
        ]),
    Subcommand(
        name: 'autohidedelay',
        description:
            'Changes how long it takes to detect you want to show up the dock',
        args: [
          Arg(name: 'seconds', description: 'Seconds to auto hide delay')
        ]),
    Subcommand(
        name: 'magnification',
        description: 'Turn magnification on or off',
        args: [
          Arg(
              name: 'YES/NO',
              description: 'YES/NO to turn magnification on or off',
              suggestions: [
                FigSuggestion(name: 'YES'),
                FigSuggestion(name: 'NO')
              ])
        ]),
    Subcommand(name: 'position', description: 'Change Dock\'s position', args: [
      Arg(
          name: 'position',
          description: 'Position to change Dock\'s position',
          suggestions: [
            FigSuggestion(name: 'BOTTOM'),
            FigSuggestion(name: 'LEFT'),
            FigSuggestion(name: 'RIGHT')
          ])
    ]),
    Subcommand(
        name: 'addblankspace',
        description: 'Add a blank space (separator) to the Dock'),
    Subcommand(
        name: 'addrecentitems',
        description: 'Add a stack containg your recent items to the Dock'),
    Subcommand(name: 'prune', description: 'Remove all items from dock'),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(name: 'finder', description: 'Manage finder', subcommands: [
    Subcommand(
        name: 'showhiddenfiles',
        description: 'Show hidden files Status',
        args: [
          Arg(
              name: 'YES/NO',
              description: 'YES/NO to show hidden files',
              suggestions: [
                FigSuggestion(name: 'YES'),
                FigSuggestion(name: 'NO')
              ])
        ]),
    Subcommand(
        name: 'showextensions',
        description: 'Show all file extensions Status',
        args: [
          Arg(
              name: 'YES/NO',
              description: 'YES/NO to show all file extensions',
              suggestions: [
                FigSuggestion(name: 'YES'),
                FigSuggestion(name: 'NO')
              ])
        ]),
    Subcommand(
        name: 'showdesktop',
        description: 'Show the desktop Status',
        args: [
          Arg(
              name: 'YES/NO',
              description: 'YES/NO to show the desktop',
              suggestions: [
                FigSuggestion(name: 'YES'),
                FigSuggestion(name: 'NO')
              ])
        ]),
    Subcommand(
        name: 'showpath',
        description:
            'Show the current opened folder path on the top bar of the Finder window',
        args: [
          Arg(
              name: 'YES/NO',
              description:
                  'YES/NO to show the current opened folder path on the top bar of the Finder window',
              suggestions: [
                FigSuggestion(name: 'YES'),
                FigSuggestion(name: 'NO')
              ])
        ]),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(name: 'firewall', description: 'Manage firewall', subcommands: [
    Subcommand(name: 'status', description: 'Show status'),
    Subcommand(name: 'enable', description: 'Enable firewall'),
    Subcommand(name: 'disable', description: 'Disable firewall'),
    Subcommand(
        name: 'list', description: 'List applications handled by firewall'),
    Subcommand(name: 'add', description: 'Add app to firewall', args: [
      Arg(
          name: 'path',
          description: 'Path of the app to add to firewall',
          template: 'filepaths')
    ]),
    Subcommand(name: 'remove', description: 'Remove app from firewall', args: [
      Arg(name: 'path', description: 'Path of the app to remove from firewall')
    ]),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(
      name: 'flightmode',
      description: 'Manage flight mode',
      subcommands: [
        Subcommand(name: 'off', description: 'Turn flight mode off'),
        Subcommand(name: 'on', description: 'Turn flight mode on'),
        Subcommand(name: 'help', description: 'Show help')
      ]),
  Subcommand(
      name: 'gatekeeper',
      description: 'Manage gatekeeper',
      subcommands: [
        Subcommand(name: 'status', description: 'Show status'),
        Subcommand(name: 'enable', description: 'Enable gatekeeper', args: [
          Arg(name: 'rule', description: 'Rule to enable', isOptional: true)
        ]),
        Subcommand(name: 'disable', description: 'Disable gatekeeper', args: [
          Arg(name: 'rule', description: 'Rule to disable', isOptional: true)
        ]),
        Subcommand(name: 'list', description: 'List rules'),
        Subcommand(
            name: 'create',
            description: 'Create a rule for the application',
            args: [
              Arg(name: 'RULENAME', description: 'Name of the rule'),
              Arg(name: '/path/to/program', description: 'Path to the program')
            ]),
        Subcommand(name: 'help', description: 'Show help')
      ]),
  Subcommand(name: 'group', description: 'Manage groups', subcommands: [
    Subcommand(name: 'list', description: 'List groups'),
    Subcommand(
        name: 'info',
        description: 'Get group information',
        args: [Arg(name: 'group', description: 'Group to get information')]),
    Subcommand(name: 'adduser', description: 'Add user to group', args: [
      Arg(
          name: 'user',
          description: 'User to add to group',
          generators: generateUsers),
      Arg(
          name: 'group',
          description: 'Group to add user to',
          generators: generateGroups)
    ]),
    Subcommand(
        name: 'removeuser',
        description: 'Remove user from group',
        args: [
          Arg(
              name: 'user',
              description: 'User to remove from group',
              generators: generateUsers),
          Arg(
              name: 'group',
              description: 'Group to remove user from',
              generators: generateGroups)
        ]),
    Subcommand(
        name: 'ismember',
        description: 'Check if user is a member of group',
        args: [
          Arg(
              name: 'user',
              description: 'User to check membership',
              generators: generateUsers),
          Arg(
              name: 'group',
              description: 'Group to check membership',
              generators: generateGroups)
        ]),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(name: 'hostname', description: 'Manage hostname', subcommands: [
    Subcommand(name: 'newhostname', description: 'Set new hostname'),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(name: 'info', description: 'Show system information'),
  Subcommand(name: 'help', description: 'Show help'),
  Subcommand(name: 'itunes', description: 'Manage iTunes', subcommands: [
    Subcommand(name: 'status', description: 'Show status'),
    Subcommand(name: 'play', description: 'Play track'),
    Subcommand(name: 'pause', description: 'Pause track'),
    Subcommand(name: 'next', description: 'Play next track'),
    Subcommand(name: 'prev', description: 'Play previous track'),
    Subcommand(name: 'mute', description: 'Mute iTunes'),
    Subcommand(name: 'unmute', description: 'Unmute iTunes'),
    Subcommand(name: 'vol', description: 'Volume', args: [
      Arg(
          name: 'up/down/#',
          description: 'Up/Down/Number',
          suggestions: [FigSuggestion(name: 'up'), FigSuggestion(name: 'down')],
          isOptional: true)
    ]),
    Subcommand(name: 'stop', description: 'Stop track'),
    Subcommand(name: 'quit', description: 'Quit iTunes'),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(name: 'localhost', description: 'Manage localhost', subcommands: [
    Subcommand(
        name: ['ls', 'list'], description: 'List current records in localhost'),
    Subcommand(
        name: 'add',
        description: 'Add a new host to the localhost file',
        args: [
          Arg(name: 'IP', description: 'IP of the host'),
          Arg(name: 'HOSTNAME', description: 'Hostname of the host')
        ]),
    Subcommand(
        name: 'remove',
        description: 'Remove a host from the localhost file',
        args: [Arg(name: 'HOSTNAME', description: 'Hostname of the host')]),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(name: 'lock', description: 'Lock session'),
  Subcommand(name: 'network', description: 'Manage network', subcommands: [
    Subcommand(name: ['ls', 'list'], description: 'List network interfaces'),
    Subcommand(name: 'location', description: 'Manage location', subcommands: [
      Subcommand(name: ['ls', 'list'], description: 'List locations'),
      Subcommand(
          name: 'create',
          description: 'Create a location',
          args: [Arg(name: 'name', description: 'Name of the location')]),
      Subcommand(name: 'delete', description: 'Delete a location', args: [
        Arg(
            name: 'name',
            description: 'Name of the location',
            generators: generateNetworkLocations)
      ]),
      Subcommand(
          name: 'switch',
          description: 'Switch location',
          args: [Arg(name: 'name', description: 'Name of the location')])
    ]),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(name: 'nosleep', description: 'Manage no sleep', subcommands: [
    Subcommand(name: 'until', description: 'No sleep until', subcommands: [
      Subcommand(
          name: 'pid',
          description: 'No sleep until process id ends',
          args: [
            Arg(
                name: 'pid',
                description: 'Process id',
                generators: generatePids)
          ])
    ], args: [
      Arg(name: 'time or script', template: 'filepaths')
    ]),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(
      name: 'notification',
      description: 'Manage notification',
      subcommands: [
        Subcommand(
            name: 'showcenter',
            description: 'Show notification center',
            args: [
              Arg(
                  name: 'YES/NO',
                  description: 'Enable/Disable notification center',
                  suggestions: [
                    FigSuggestion(name: 'YES'),
                    FigSuggestion(name: 'NO')
                  ],
                  isOptional: true)
            ]),
        Subcommand(name: 'help', description: 'Show help')
      ]),
  Subcommand(name: 'ntp', description: 'Manage ntp', subcommands: [
    Subcommand(
        name: 'status', description: 'Status of the network time service'),
    Subcommand(name: 'enable', description: 'Enable clock to use network time'),
    Subcommand(
        name: 'disable', description: 'Disable clock to use network time'),
    Subcommand(
        name: 'set',
        description: 'Set network time server',
        args: [Arg(name: 'hostname', description: 'Network time server')]),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(name: 'printer', description: 'Manage printer', subcommands: [
    Subcommand(name: 'settings', description: 'Printer settings'),
    Subcommand(name: 'name', description: 'Display printer names on system'),
    Subcommand(
        name: 'queue', description: 'Display items in printer queue on system'),
    Subcommand(name: 'drivers', description: 'Display all printer drivers'),
    Subcommand(name: 'web', description: 'Enable and show web interface'),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(
      name: 'restart',
      description: 'Restart computer (needs confirmation)',
      subcommands: [
        Subcommand(
            name: ['-f', '--force'],
            description: 'Restart computer (without confirmation)'),
        Subcommand(name: 'help', description: 'Show help')
      ]),
  Subcommand(name: 'safeboot', description: 'Manage safe boot', subcommands: [
    Subcommand(name: 'status', description: 'Get the boot args'),
    Subcommand(name: 'enable', description: 'Enable safe boot'),
    Subcommand(name: 'disable', description: 'Disable safeboot'),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(
      name: 'screensaver',
      description: 'Manage screensaver',
      subcommands: [
        Subcommand(name: 'status', description: 'Get the current status'),
        Subcommand(
            name: 'askforpassword',
            description: 'Get password requirement to unlock',
            args: [
              Arg(
                  name: 'YES/NO',
                  description: 'Enable/Disable password requirement to unlock',
                  suggestions: [
                    FigSuggestion(name: 'YES'),
                    FigSuggestion(name: 'NO')
                  ],
                  isOptional: true)
            ]),
        Subcommand(name: 'help', description: 'Show help')
      ]),
  Subcommand(name: 'service', description: 'Manage service', subcommands: [
    Subcommand(name: '--status-all', description: 'List all services'),
    Subcommand(
        name: ['--ls', '--list'],
        description: 'List all services',
        args: [
          Arg(name: 'service', description: 'Service name', isOptional: true)
        ]),
    Subcommand(name: 'start', description: 'Start a service', args: [
      Arg(
          name: 'service',
          description: 'Service name',
          generators: generateServices)
    ]),
    Subcommand(name: 'stop', description: 'Stop a service', args: [
      Arg(
          name: 'service',
          description: 'Service name',
          generators: generateServices)
    ]),
    Subcommand(name: 'load', description: 'Load a service', args: [
      Arg(
          name: 'service',
          description: 'Service name',
          generators: generateServices)
    ]),
    Subcommand(name: 'unload', description: 'Unload a service', args: [
      Arg(
          name: 'service',
          description: 'Service name',
          generators: generateServices)
    ]),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(
      name: 'shutdown',
      description: 'Shutdown computer (needs confirmation)',
      subcommands: [
        Subcommand(
            name: '-f',
            description: 'Shutdown computer (without confirmation)'),
        Subcommand(name: 'help', description: 'Show help')
      ]),
  Subcommand(
      name: 'sleep',
      description: 'Put computer to sleep',
      subcommands: [Subcommand(name: 'help', description: 'Show help')]),
  Subcommand(
      name: 'timezone',
      description: 'Get current timezone',
      subcommands: [
        Subcommand(
            name: ['ls', 'list'], description: 'List available timezones'),
        Subcommand(name: 'set', description: 'Set timezone', args: [
          Arg(
            name: 'timezone',
            description: 'Timezone',
            suggestions: timezoneSuggestions,
          )
        ]),
        Subcommand(
          name: 'help',
          description: 'Show help',
        )
      ]),
  Subcommand(name: 'touchbar', description: 'Manage touchbar', subcommands: [
    Subcommand(name: 'reset', description: 'Reset touchbar'),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(name: 'trash', description: 'Manage trash', subcommands: [
    Subcommand(name: 'status', description: 'Get trash info'),
    Subcommand(name: 'clean', description: 'Clean trash'),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(name: 'user', description: 'Manage user', subcommands: [
    Subcommand(name: ['ls', 'list'], description: 'List all users'),
    Subcommand(name: 'info', description: 'Get user info', args: [
      Arg(name: 'username', description: 'Username', generators: generateUsers)
    ]),
    Subcommand(name: 'create', description: 'Create a new user'),
    Subcommand(name: 'delete', description: 'Delete a user', args: [
      Arg(name: 'username', description: 'Username', generators: generateUsers)
    ]),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(name: 'volume', description: 'Manage volume level', subcommands: [
    Subcommand(name: 'mute', description: 'Set mute'),
    Subcommand(name: 'unmute', description: 'Unset mute'),
    Subcommand(name: 'ismute', description: 'Check the volume status'),
    Subcommand(name: 'up', description: 'Increase the volume by 6.25'),
    Subcommand(name: 'down', description: 'Decrease the volume by 6.25'),
    Subcommand(name: 'help', description: 'Show help')
  ], args: [
    Arg(name: 'volume', description: 'Volume level up/down/(+/-)number')
  ]),
  Subcommand(name: 'vpn', description: 'Manage VPN connections', subcommands: [
    Subcommand(name: ['ls', 'list'], description: 'List VPN connections'),
    Subcommand(name: 'start', description: 'Start a VPN connection', args: [
      Arg(name: 'VPN', description: 'VPN connection name', isOptional: true),
      Arg(name: 'USER', description: 'VPN connection user', isOptional: true),
      Arg(
          name: 'PASS',
          description: 'VPN connection password',
          isOptional: true),
      Arg(
          name: 'SECRET',
          description: 'VPN connection secret',
          isOptional: true)
    ]),
    Subcommand(name: 'stop', description: 'Stop a VPN connection', args: [
      Arg(name: 'VPN', description: 'VPN connection name', isOptional: true)
    ]),
    Subcommand(
        name: 'status',
        description: 'Get the status of a VPN connection',
        args: [
          Arg(name: 'VPN', description: 'VPN connection name', isOptional: true)
        ]),
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(name: 'wallpaper', description: 'Change wallpaper', args: [
    Arg(
        name: 'image',
        description: 'Path to the wallpaper',
        template: 'filepaths')
  ], subcommands: [
    Subcommand(name: 'help', description: 'Show help')
  ]),
  Subcommand(name: 'wifi', description: 'Manage wifi', subcommands: [
    Subcommand(name: 'status', description: 'Get wifi status'),
    Subcommand(name: 'scan', description: 'Scan wifi'),
    Subcommand(
        name: 'showpassword',
        description: 'Show wifi network password',
        args: [
          Arg(
              name: 'ESSID',
              description: 'ESSID',
              isOptional: true,
              generators: generateWifiNetworks)
        ]),
    Subcommand(name: ['ls', 'list'], description: 'List known wifi networks'),
    Subcommand(name: 'forget', description: 'Forget a wifi network', args: [
      Arg(name: 'ESSID', description: 'ESSID', generators: generateWifiNetworks)
    ]),
    Subcommand(name: 'history', description: 'Wifi connection history'),
    Subcommand(name: 'off', description: 'Turn off your wifi'),
    Subcommand(name: 'on', description: 'Turn on your wifi'),
    Subcommand(name: 'connect', description: 'Join a wifi network', args: [
      Arg(name: 'ESSID', description: 'ESSID'),
      Arg(name: 'PASSWORD', description: 'Password', isOptional: true)
    ]),
    Subcommand(name: 'help', description: 'Show help')
  ])
], options: [
  Option(name: '--update', description: 'Update m-cli to the latest version'),
  Option(name: '--uninstall', description: 'Uninstall m-cli')
]);