async askForBoilerplateType(mapping) {
    // group by category
    const groupMapping = groupBy(
      mapping,
      (acc, value) => value.category || 'other'
    );
    const groupNames = Object.keys(groupMapping);

    let group;
    if (groupNames.length > 1) {
      const answers = await inquirer.prompt({
        name: 'group',
        type: 'list',
        message: 'Please select a boilerplate category',
        choices: groupNames,
      });
      group = groupMapping[answers.group];
    } else {
      group = groupMapping[groupNames[0]];
    }

    // ask for boilerplate
    const choices = Object.keys(group).map((key) => {
      const item = group[key];
      return {
        name: `${key} - ${item.description}`,
        value: item,
      };
    });

    choices.unshift(new inquirer.Separator());

    const answers = await inquirer.prompt({
      name: 'type',
      type: 'list',
      message: 'Please select a boilerplate type',
      choices,
    });
    return answers.type;
  }
show boilerplate list and let user choose one

@param {Object} mapping - boilerplate config mapping,
`{
  simple: {
    "name": "admin",
    "package": "beidou-example-admin",
    "description": "admin platform"
  }
}`
@return {Object} boilerplate config item