diff --git a/packages/create-fes-app/LICENSE b/packages/create-fes-app/LICENSE
deleted file mode 100644
index 0978fbf7..00000000
--- a/packages/create-fes-app/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2020-present webank
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
\ No newline at end of file
diff --git a/packages/create-fes-app/README.md b/packages/create-fes-app/README.md
deleted file mode 100644
index d15cbe69..00000000
--- a/packages/create-fes-app/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# fes 项目管理脚本
-
-* 初始化 fes 项目
-* 创建页面
-* 创建模块
diff --git a/packages/create-fes-app/bin/create-fes-app.js b/packages/create-fes-app/bin/create-fes-app.js
deleted file mode 100755
index d2316ff6..00000000
--- a/packages/create-fes-app/bin/create-fes-app.js
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env node
-
-require('../lib/cli');
diff --git a/packages/create-fes-app/package.json b/packages/create-fes-app/package.json
deleted file mode 100644
index 3208fb1e..00000000
--- a/packages/create-fes-app/package.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-  "name": "@webank/create-fes-app",
-  "version": "2.0.0-alpha.0",
-  "description": "@webank/create-fes-app",
-  "main": "lib/index.js",
-  "files": [
-    "lib",
-    "bin",
-    "templates"
-  ],
-  "bin": {
-    "create-umi-app": "bin/create-fes-app.js"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/WeBankFinTech/fes.js.git",
-    "directory": "packages/create-fes-app"
-  },
-  "keywords": [
-    "fes"
-  ],
-  "sideEffects": false,
-  "author": "qlin",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/WeBankFinTech/fes.js/issues"
-  },
-  "homepage": "https://github.com/WeBankFinTech/fes.js#readme",
-  "publishConfig": {
-    "access": "public"
-  },
-  "dependencies": {
-    "vue-router": "^4.0.1"
-  }
-}
diff --git a/packages/create-fes-app/src/cli.js b/packages/create-fes-app/src/cli.js
deleted file mode 100644
index e86fbed9..00000000
--- a/packages/create-fes-app/src/cli.js
+++ /dev/null
@@ -1,12 +0,0 @@
-
-/**
- * TODO
- * 需要支持的命令
- * v
- * h
- * [项目名称] 可选择 h5 | pc 模版
- *
- * feature pc
- *      根据API动态生产列表页
- * feature h5
- */
diff --git a/packages/create-fes-app/src/genTmp.js b/packages/create-fes-app/src/genTmp.js
deleted file mode 100644
index e69de29b..00000000
diff --git a/packages/fes-compiler/package.json b/packages/fes-compiler/package.json
index e590aa2f..ed20a589 100644
--- a/packages/fes-compiler/package.json
+++ b/packages/fes-compiler/package.json
@@ -29,6 +29,7 @@
     "@umijs/utils": "3.3.3",
     "dotenv": "8.2.0",
     "joi": "17.3.0",
+    "readline": "^1.3.0",
     "set-value": "3.0.2",
     "tapable": "2.0.0"
   }
diff --git a/packages/fes-compiler/src/logger/index.js b/packages/fes-compiler/src/logger/index.js
index 96bdbb6e..da9d1c29 100644
--- a/packages/fes-compiler/src/logger/index.js
+++ b/packages/fes-compiler/src/logger/index.js
@@ -2,6 +2,7 @@ import {
     createDebug,
     chalk
 } from '@umijs/utils';
+import readline from 'readline';
 
 export default class Logger {
     LOG = chalk.black.bgBlue('LOG');
@@ -72,4 +73,16 @@ export default class Logger {
         this.profilers[id] = time;
         return msg;
     }
+
+    clearConsole(title) {
+        if (process.stdout.isTTY) {
+            const blank = '\n'.repeat(process.stdout.rows);
+            console.log(blank);
+            readline.cursorTo(process.stdout, 0, 0);
+            readline.clearScreenDown(process.stdout);
+            if (title) {
+                console.log(title);
+            }
+        }
+    }
 }
diff --git a/packages/fes-preset-built-in/package.json b/packages/fes-preset-built-in/package.json
index 56cb828e..6ca85120 100644
--- a/packages/fes-preset-built-in/package.json
+++ b/packages/fes-preset-built-in/package.json
@@ -33,8 +33,12 @@
     "@vue/preload-webpack-plugin": "1.1.2",
     "@webank/fes-compiler": "^2.0.0-alpha.0",
     "cliui": "6.0.0",
+    "fs-extra": "^9.0.1",
     "html-webpack-plugin": "^3.2.0",
     "html-webpack-tags-plugin": "2.0.17",
+    "inquirer": "^7.3.3",
+    "tar": "^6.1.0",
+    "validate-npm-package-name": "^3.0.0",
     "vue-loader": "^16.1.2",
     "webpack-bundle-analyzer": "4.3.0"
   }
diff --git a/packages/fes-preset-built-in/src/index.js b/packages/fes-preset-built-in/src/index.js
index 211a97a1..9d5a2f20 100644
--- a/packages/fes-preset-built-in/src/index.js
+++ b/packages/fes-preset-built-in/src/index.js
@@ -50,6 +50,7 @@ export default function () {
             require.resolve('./plugins/misc/route'),
 
             // commands
+            require.resolve('./plugins/commands/create'),
             require.resolve('./plugins/commands/build'),
             require.resolve('./plugins/commands/dev')
         ]
diff --git a/packages/fes-preset-built-in/src/plugins/commands/create/index.js b/packages/fes-preset-built-in/src/plugins/commands/create/index.js
new file mode 100644
index 00000000..051bb97b
--- /dev/null
+++ b/packages/fes-preset-built-in/src/plugins/commands/create/index.js
@@ -0,0 +1,115 @@
+import path from 'path';
+import { chalk } from '@umijs/utils';
+import validateProjectName from 'validate-npm-package-name';
+import fs from 'fs-extra';
+import { execSync } from 'child_process';
+import { Logger } from '@webank/fes-compiler';
+import inquirer from 'inquirer';
+import tar from 'tar';
+
+const logger = new Logger('fes:plugin-built-in');
+
+export default function (api) {
+    api.registerCommand({
+        name: 'create',
+        description: 'create a new project',
+        async fn({ args }) {
+            if (args.proxy) {
+                process.env.HTTP_PROXY = args.proxy;
+            }
+            const cwd = args.cwd || process.cwd();
+            const projectName = args._[0];
+            const inCurrent = projectName === '.';
+            const name = inCurrent ? path.relative('../', cwd) : projectName;
+            const targetDir = path.resolve(cwd, projectName || '.');
+
+            const result = validateProjectName(name);
+            if (!result.validForNewPackages) {
+                console.error(chalk.red(`Invalid project name: "${name}"`));
+                result.errors && result.errors.forEach((err) => {
+                    console.error(chalk.red.dim(`Error: ${err}`));
+                });
+                result.warnings && result.warnings.forEach((warn) => {
+                    console.error(chalk.red.dim(`Warning: ${warn}`));
+                });
+                throw new Error('Process exited');
+            }
+            if (fs.existsSync(targetDir) && !args.merge) {
+                if (args.force) {
+                    await fs.remove(targetDir);
+                } else {
+                    logger.clearConsole();
+                    if (inCurrent) {
+                        const { ok } = await inquirer.prompt([
+                            {
+                                name: 'ok',
+                                type: 'confirm',
+                                message: 'Generate project in current directory?'
+                            }
+                        ]);
+                        if (!ok) {
+                            return null;
+                        }
+                    } else {
+                        const { action } = await inquirer.prompt([
+                            {
+                                name: 'action',
+                                type: 'list',
+                                message: `Target directory ${chalk.cyan(targetDir)} already exists. Pick an action:`,
+                                choices: [
+                                    { name: 'Overwrite', value: 'overwrite' },
+                                    { name: 'Merge', value: 'merge' },
+                                    { name: 'Cancel', value: false }
+                                ]
+                            }
+                        ]);
+                        if (!action) {
+                            return null;
+                        }
+                        if (action === 'overwrite') {
+                            console.log(`\nRemoving ${chalk.cyan(targetDir)}...`);
+                            await fs.remove(targetDir);
+                        }
+                    }
+                }
+            }
+
+            const { template } = await inquirer.prompt([
+                {
+                    name: 'template',
+                    type: 'list',
+                    message: 'Pick an template:',
+                    choices: [
+                        { name: 'PC, suitable for management desk front-end applications', value: 'pc' },
+                        { name: 'H5, suitable for mobile applications', value: 'h5' },
+                        { name: 'Cancel', value: false }
+                    ]
+                }
+            ]);
+
+            if (template) {
+                const map = {
+                    pc: '@webank/fes-template',
+                    h5: '@webank/fes-template-h5'
+                };
+                fs.mkdirSync(targetDir);
+                const stdout = execSync(`npm pack ${map[template]}`, { encoding: 'utf8', stdio: [null] });
+                const tempFilePath = path.resolve(cwd, stdout.replace('\n', ''));
+                fs.createReadStream(tempFilePath).pipe(
+                    tar.x({
+                        strip: 1,
+                        C: targetDir
+                    })
+                ).on('finish', () => {
+                    fs.removeSync(tempFilePath);
+                    console.log();
+                    console.log(chalk.green(`project ${projectName} created successfully, please execute the following command to use:`));
+                    console.log(`$ cd ${projectName}`);
+                    console.log('$ yarn');
+                    console.log('$ yarn dev');
+                    console.log();
+                });
+            }
+        }
+    });
+}
diff --git a/packages/fes/package.json b/packages/fes/package.json
index f6b2900d..25e0491e 100644
--- a/packages/fes/package.json
+++ b/packages/fes/package.json
@@ -42,6 +42,12 @@
         "@webank/fes-compiler": "^2.0.0-alpha.0",
         "@webank/fes-preset-built-in": "^2.0.0-alpha.0",
         "@webank/fes-runtime": "^2.0.0-alpha.0",
+        "commander": "^6.2.1",
+        "envinfo": "^7.7.3",
+        "leven": "^3.1.0",
         "resolve-cwd": "^3.0.0"
+    },
+    "engines": {
+        "node": "^10.12.0 || ^12.0.0 || >= 14.0.0"
     }
 }
diff --git a/packages/fes/src/cli.js b/packages/fes/src/cli.js
index 2162daa0..fdb034a5 100644
--- a/packages/fes/src/cli.js
+++ b/packages/fes/src/cli.js
@@ -1,69 +1,174 @@
-import {
-    chalk,
-    yParser
-} from '@umijs/utils';
-import {
-    Service
-} from './serviceWithBuiltIn';
+import { chalk, yParser, semver } from '@umijs/utils';
+import program from 'commander';
+import leven from 'leven';
+import { Service } from './serviceWithBuiltIn';
 import fork from './utils/fork';
 import getCwd from './utils/getCwd';
 import getPkg from './utils/getPkg';
+import fesPkg from '../package.json';
 
-// process.argv: [node, fes.js, command, args]
-const args = yParser(process.argv.slice(2), {
-    alias: {
-        version: ['v'],
-        help: ['h']
-    },
-    boolean: ['version']
-});
+const requiredVersion = fesPkg.engines.node;
 
-// TODO version 命令
-if (args.version && !args._[0]) {
-    args._[0] = 'version';
-    console.log(`fes@${require('../package.json').version}`);
-} else if (!args._[0]) {
-    // TODO 帮助命令
-    args._[0] = 'help';
-}
-
-(async () => {
-    try {
-        switch (args._[0]) {
-            case 'dev':
-                // eslint-disable-next-line
-                const child = fork({
-                    scriptPath: require.resolve('./forkedDev')
-                });
-                // ref:
-                // http://nodejs.cn/api/process/signal_events.html
-                process.on('SIGINT', () => {
-                    child.kill('SIGINT');
-                    process.exit(1);
-                });
-                process.on('SIGTERM', () => {
-                    child.kill('SIGTERM');
-                    process.exit(1);
-                });
-                break;
-            default:
-                // eslint-disable-next-line
-                const name = args._[0];
-                if (name === 'build') {
-                    process.env.NODE_ENV = 'production';
-                }
-                await new Service({
-                    cwd: getCwd(),
-                    pkg: getPkg(process.cwd())
-                }).run({
-                    name,
-                    args
-                });
-                break;
-        }
-    } catch (e) {
-        console.error(chalk.red(e.message));
-        console.error(e.stack);
+function checkNodeVersion(wanted, id) {
+    if (
+        !semver.satisfies(process.version, wanted, { includePrerelease: true })
+    ) {
+        console.log(
+            chalk.red(
+                `You are using Node ${process.version}, but this version of ${id} requires Node ${wanted}.\nPlease upgrade your Node version.`
+            )
+        );
         process.exit(1);
     }
-})();
+}
+
+checkNodeVersion(requiredVersion, '@webank/fes');
+
+function suggestCommands(unknownCommand) {
+    const availableCommands = program.commands.map(cmd => cmd._name);
+
+    let suggestion;
+
+    availableCommands.forEach((cmd) => {
+        const isBestMatch = leven(cmd, unknownCommand) < leven(suggestion || '', unknownCommand);
+        if (leven(cmd, unknownCommand) < 3 && isBestMatch) {
+            suggestion = cmd;
+        }
+    });
+
+    if (suggestion) {
+        console.log(`  ${chalk.red(`Did you mean ${chalk.yellow(suggestion)}?`)}`);
+    }
+}
+
+// process.argv: [node, fes.js, command, args]
+const args = yParser(process.argv.slice(2));
+
+program
+    .version(`@webank/fes ${fesPkg.version}`, '-v, --vers', 'output the current version')
+    .usage('<command> [options]')
+    .description(fesPkg.description);
+
+program
+    .command('create <app-name>')
+    .description('create a new project powered by fes.js')
+    .option('-f, --force', 'Overwrite target directory if it exists')
+    .option('--merge', 'Merge target directory if it exists')
+    .option('-x, --proxy <proxyUrl>', 'Use specified proxy when creating project')
+    .action(async () => {
+        if (args._.length > 2) {
+            console.log(chalk.yellow('\n Info: You provided more than one argument. The first one will be used as the app\'s name, the rest are ignored.'));
+        }
+        try {
+            await new Service({
+                cwd: getCwd(),
+                pkg: getPkg(process.cwd())
+            }).run({
+                name: 'create',
+                args
+            });
+        } catch (e) {
+            console.error(chalk.red(e.message));
+            console.error(e.stack);
+            process.exit(1);
+        }
+    });
+
+program
+    .command('dev')
+    .description('run local http service for development')
+    .action(() => {
+        try {
+            const child = fork({
+                scriptPath: require.resolve('./forkedDev')
+            });
+            // ref:
+            // http://nodejs.cn/api/process/signal_events.html
+            process.on('SIGINT', () => {
+                child.kill('SIGINT');
+                process.exit(1);
+            });
+            process.on('SIGTERM', () => {
+                child.kill('SIGTERM');
+                process.exit(1);
+            });
+        } catch (e) {
+            console.error(chalk.red(e.message));
+            console.error(e.stack);
+            process.exit(1);
+        }
+    });
+
+program
+    .command('build')
+    .description('compile and package code')
+    .action(async () => {
+        try {
+            process.env.NODE_ENV = 'production';
+            await new Service({
+                cwd: getCwd(),
+                pkg: getPkg(process.cwd())
+            }).run({
+                name: 'build',
+                args
+            });
+        } catch (e) {
+            console.error(chalk.red(e.message));
+            console.error(e.stack);
+            process.exit(1);
+        }
+    });
+
+program
+    .command('info')
+    .description('print debugging information about your environment')
+    .action(() => {
+        console.log(chalk.bold('\nEnvironment Info:'));
+        require('envinfo')
+            .run(
+                {
+                    System: ['OS', 'CPU'],
+                    Binaries: ['Node', 'Yarn', 'npm'],
+                    Browsers: ['Chrome', 'Edge', 'Firefox', 'Safari'],
+                    npmPackages: '/**/{typescript,*vue*,@webank/*/}',
+                    npmGlobalPackages: ['@webank/fes']
+                },
+                {
+                    showNotFound: true,
+                    duplicates: true,
+                    fullTree: true
+                }
+            )
+            .then(console.log);
+    });
+
+// output help information on unknown commands
+program
+    .arguments('[command]')
+    .action((cmd) => {
+        if (cmd) {
+            program.outputHelp();
+            console.log(`  ${chalk.red(`Unknown command ${chalk.yellow(cmd)}.`)}`);
+            console.log();
+            suggestCommands(cmd);
+            process.exitCode = 1;
+        }
+    });
+
+program.on('--help', () => {
+    console.log();
+    console.log(
+        `  Run ${chalk.cyan(
+            'fes <command> --help'
+        )} for detailed usage of given command.`
+    );
+    console.log();
+});
+
+program.commands.forEach(c => c.on('--help', () => console.log()));
+
+program.parse(process.argv);
+
+if (!process.argv.slice(2).length) {
+    program.outputHelp();
+}
diff --git a/yarn.lock b/yarn.lock
index b3ec2966..1951ebdd 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3828,7 +3828,7 @@ ansi-escapes@^3.2.0:
   resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
   integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
 
-ansi-escapes@^4.3.0, ansi-escapes@^4.3.1:
+ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.1:
   version "4.3.1"
   resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61"
   integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==
@@ -5000,6 +5000,11 @@ cli-width@^2.0.0:
   resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48"
   integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==
 
+cli-width@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6"
+  integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
+
 clipboardy@2.3.0:
   version "2.3.0"
   resolved "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz#3c2903650c68e46a91b388985bc2774287dba290"
@@ -5207,6 +5212,11 @@ commander@^6.2.0:
   resolved "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75"
   integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==
 
+commander@^6.2.1:
+  version "6.2.1"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
+  integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==
+
 commander@~2.19.0:
   version "2.19.0"
   resolved "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
@@ -6452,7 +6462,7 @@ env-paths@^2.2.0:
   resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43"
   integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==
 
-envinfo@^7.3.1:
+envinfo@^7.3.1, envinfo@^7.7.3:
   version "7.7.3"
   resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz#4b2d8622e3e7366afb8091b23ed95569ea0208cc"
   integrity sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==
@@ -7124,7 +7134,7 @@ figures@^2.0.0:
   dependencies:
     escape-string-regexp "^1.0.5"
 
-figures@^3.2.0:
+figures@^3.0.0, figures@^3.2.0:
   version "3.2.0"
   resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
   integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
@@ -7407,7 +7417,7 @@ fs-extra@^7.0.0:
     jsonfile "^4.0.0"
     universalify "^0.1.0"
 
-fs-extra@^9.0.0:
+fs-extra@^9.0.0, fs-extra@^9.0.1:
   version "9.0.1"
   resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc"
   integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==
@@ -8423,6 +8433,25 @@ inquirer@6.5.2, inquirer@^6.2.0:
     strip-ansi "^5.1.0"
     through "^2.3.6"
 
+inquirer@^7.3.3:
+  version "7.3.3"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003"
+  integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==
+  dependencies:
+    ansi-escapes "^4.2.1"
+    chalk "^4.1.0"
+    cli-cursor "^3.1.0"
+    cli-width "^3.0.0"
+    external-editor "^3.0.3"
+    figures "^3.0.0"
+    lodash "^4.17.19"
+    mute-stream "0.0.8"
+    run-async "^2.4.0"
+    rxjs "^6.6.0"
+    string-width "^4.1.0"
+    strip-ansi "^6.0.0"
+    through "^2.3.6"
+
 intersperse@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/intersperse/-/intersperse-1.0.0.tgz#f2561fb1cfef9f5277cc3347a22886b4351a5181"
@@ -9228,6 +9257,11 @@ levdist@^1.0.0:
   resolved "https://registry.npmjs.org/levdist/-/levdist-1.0.0.tgz#91d7a3044964f2ccc421a0477cac827fe75c5718"
   integrity sha1-kdejBElk8szEIaBHfKyCf+dcVxg=
 
+leven@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
+  integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
+
 levn@^0.4.1:
   version "0.4.1"
   resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
@@ -10128,7 +10162,7 @@ mute-stream@0.0.7:
   resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
   integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
 
-mute-stream@~0.0.4:
+mute-stream@0.0.8, mute-stream@~0.0.4:
   version "0.0.8"
   resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
   integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
@@ -12324,6 +12358,11 @@ readdirp@~3.5.0:
   dependencies:
     picomatch "^2.2.1"
 
+readline@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c"
+  integrity sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw=
+
 redent@^1.0.0:
   version "1.0.0"
   resolved "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
@@ -12836,7 +12875,7 @@ rollup@1.27.8:
     "@types/node" "*"
     acorn "^7.1.0"
 
-run-async@^2.2.0:
+run-async@^2.2.0, run-async@^2.4.0:
   version "2.4.1"
   resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
   integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
@@ -12853,7 +12892,7 @@ run-queue@^1.0.0, run-queue@^1.0.3:
   dependencies:
     aproba "^1.1.1"
 
-rxjs@^6.4.0, rxjs@^6.6.3:
+rxjs@^6.4.0, rxjs@^6.6.0, rxjs@^6.6.3:
   version "6.6.3"
   resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552"
   integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==
@@ -13821,6 +13860,18 @@ tar@^6.0.2:
     mkdirp "^1.0.3"
     yallist "^4.0.0"
 
+tar@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83"
+  integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==
+  dependencies:
+    chownr "^2.0.0"
+    fs-minipass "^2.0.0"
+    minipass "^3.0.0"
+    minizlib "^2.1.1"
+    mkdirp "^1.0.3"
+    yallist "^4.0.0"
+
 temp-dir@2.0.0:
   version "2.0.0"
   resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e"
@@ -14523,7 +14574,7 @@ validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.3:
 
 validate-npm-package-name@^3.0.0:
   version "3.0.0"
-  resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e"
+  resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e"
   integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34=
   dependencies:
     builtins "^1.0.3"