From 4bceb5c2254543b834eea83093a7086b5b344574 Mon Sep 17 00:00:00 2001 From: Mike Pirog Date: Tue, 12 Dec 2023 11:47:09 -0500 Subject: [PATCH] update to latest @lando/core@edge and also prep packaged CLI for better usage info when run from symlink --- CHANGELOG.md | 77 +++++++++++++++++++++++- lib/cli.js | 31 ++++++---- package-lock.json | 149 ++++++++++++++-------------------------------- package.json | 2 +- 4 files changed, 139 insertions(+), 120 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ba550e2d..82f8f2f22 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,74 @@ +## v3.21.0-alpha.4 - [December 12, 2023](https://github.com/lando/cli/releases/tag/v3.21.0-alpha.4) + +### **DANGER NOTES** + +This is an `alpha` release which means: + +* Definitely don't try it out unless you are into [risky business](https://www.youtube.com/watch?v=G2UVsyVLLcE) +* It is "feature complete" but has very little automated testing so we cannot guarantee any level of "it works" beyond "it works on our machines" ;) +* Subsequent releases could be breaking, _very breaking_ + +So, basically, if you have real work you need to do we recommend you [don't try it](https://www.youtube.com/watch?v=7Ood-IE7sx4)! + +### Installation Notes + +If you decide to try it out and want `lando update` to grab new versions of the cli then you need to install the cli in a directory owned by your user eg **DO NOT** install it someplace like `/usr/local/bin`. + +Your best bet is to do something like this: + +```bash +mkdir -p ~/.lando/bin +curl https://github.com/lando/cli/releases/download/v3.21.0-alpha.3/lando-macos-arm64-v3.21.0-alpha.4 -fsSLo ~/.lando/bin/lando-v3.21.0-alpha.4 +chmod +x ~/.lando/bin/lando-v3.21.0-alpha.4 +ln -sf ~/.lando/bin/lando-v3.21.0-alpha.4 ~/.lando/bin/lando +``` + +Note that you will need to replace the above with a link for your OS and ARCH and then make sure that `~/.lando/bin` is in your `$PATH`. + +### Releases + +* Changed release assets to only include `@lando/core` by default. Run `lando setup` to fetch all the previously packaged plugins. Subsequent releases will offer fully packaged binaries and a `slim` option. + +### New Features + +* Added `autostart` Docker Engine support to Linux +* Added `lando update` command so Lando and installed plugins can self-update +* Added hidden `lando setup` command to replace package installers +* Added hidden `lando plugin-add` command to install external plugins +* Added hidden `lando plugin-remove` command to remove external plugins +* Improved `lando version` to give more total version information + +### Fixes + +* Fixed broken Docker Compose|Desktop|Engine links +* Fixed bug causing `lando` services to report `Up` when they actually `Exited` non-zero +* Fixed longstanding bug causing some debug output to print to `stdout` instead of `stderr` +* Improved post-start status message granularity, they can one of `tip|info|warn|error` now +* Improved post-start status message accessibility +* Improved "Update Available" warning to be less **INTENSE**, is now a post-start info message + +### Internal + +* Added `app.addMessage` for more granular and accessible post-start app status reporting +* Changed `lando.log` and `app.log` to be more like `debug` +* Changed `lando version` to now track `@lando/core|@lando/core-next` instead of `@lando/cli` +* Bumped minimum `node` version to `18` +* Bumped supported Docker Desktop version to `>4 <4.27` +* Removed lingering and dangling should-now-be-in-plugins code eg `_drupaly.js` +* Reorganized core to be more like `@lando/core-next` (eg Lando 4) +* Reorganized cli to be more like `@lando/core-next` (eg Lando 4) +* Switched (fully, finally) from `github` to `@octokit/rest` +* Switched plugin package manager to `npm` +* Removed `bundledDependencies` from `package.json`, now handled by `@lando/prepare-release-action@v3` +* Removed `dayjs` dependency +* Removed `github` dependency +* Removed `mkdirp` dependency + +### DEPRECATIONS + +* DEPRECATED `app.addWarning` in favor of `app.addMessage` + + ## v3.21.0-alpha.3 - [December 7, 2023](https://github.com/lando/cli/releases/tag/v3.21.0-alpha.3) ### **DANGER NOTES** @@ -18,9 +89,9 @@ Your best bet is to do something like this: ```bash mkdir -p ~/.lando/bin -curl https://github.com/lando/cli/releases/download/v3.21.0-alpha.2/lando-macos-arm64-v3.21.0-alpha.2 -fsSLo ~/.lando/bin/lando-v3.21.0-alpha.2 -chmod +x ~/.lando/bin/lando-v3.21.0-alpha.2 -ln -sf ~/.lando/bin/lando-v3.21.0-alpha.2 ~/.lando/bin/lando +curl https://github.com/lando/cli/releases/download/v3.21.0-alpha.3/lando-macos-arm64-v3.21.0-alpha.3 -fsSLo ~/.lando/bin/lando-v3.21.0-alpha.3 +chmod +x ~/.lando/bin/lando-v3.21.0-alpha.3 +ln -sf ~/.lando/bin/lando-v3.21.0-alpha.3 ~/.lando/bin/lando ``` Note that you will need to replace the above with a link for your OS and ARCH and then make sure that `~/.lando/bin` is in your `$PATH`. diff --git a/lib/cli.js b/lib/cli.js index 6c1edf1e6..c7e65a671 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -294,21 +294,23 @@ module.exports = class Cli { * Init */ init(yargs, tasks, config, userConfig) { - // Define usage - const cmd = !_.has(process, 'pkg') ? '$0' : path.basename(_.get(process, 'execPath', 'lando')); - const usage = [`Usage: ${cmd} [args] [options]`]; - if (userConfig.experimental) { - usage.push(`${this.makeArt('print', {text: '(experimental mode)', color: 'magenta'})}`); - } + // @TODO: what if we are running from symlink? + + // basic usage + const usage = ['Usage: $0 [args] [options]']; + // add experimental mode info + if (userConfig.experimental) usage.push(`${this.makeArt('print', {text: '(experimental mode)', color: 'magenta'})}`); // Yargs! yargs.usage(usage.join(' ')) .demandCommand(1, 'You need at least one command before moving on') - .example('lando start', 'Run lando start') - .example('lando rebuild --help', 'Get help about using the lando rebuild command') - .example('lando destroy -y -vvv', 'Run lando destroy non-interactively and with maximum verbosity') - .example('lando --clear', 'Clear the lando tasks cache') + .example('$0 start', 'Run lando start') + .example('$0 rebuild --help', 'Get help about using the lando rebuild command') + .example('$0 destroy -y --debug', 'Run lando destroy non-interactively and with maximum verbosity') + .example('$0 --clear', 'Clear the lando tasks cache') .middleware([(argv => { + argv['$0'] = 'lhello'; + console.log(argv); argv._app = config; })]) .recommendCommands() @@ -329,6 +331,12 @@ module.exports = class Cli { else yargs.command(this.parseToYargs(task, config)); }); + // Modify the script name in certain circumstances eg its packaged and being invoked from a symlink + // @NOTE: should we check for argv0 being a symlink? + if (_.has(process, 'pkg') && path.join(process.cwd(), process.argv0) !== process.execPath) { + yargs.scriptName(path.basename(process.argv0)); + } + // Show help unless this is a delegation command const current = _.find(tasks, {command: yargs.argv._[0]}); if ((yargs.argv.help || yargs.argv.lando) && _.get(current, 'delegate', false) === false) { @@ -336,9 +344,6 @@ module.exports = class Cli { process.exit(0); } - // if we are in v3 and --debug is set then set -vvv - // @TODO: handle --debug for v3? - // YARGZ MATEY yargs.argv; } diff --git a/package-lock.json b/package-lock.json index 28c40a1d5..0eed1d779 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "GPL-3.0", "dependencies": { "@lando/argv": "^1.1.0", - "@lando/core": "^3.21.0-alpha.7", + "@lando/core": "^3.21.0-alpha.9", "@lando/core-next": "npm:@lando/core@^4.0.0-unstable.5", "@oclif/core": "^3.5.0", "@oclif/parser": "^3.8.17", @@ -1027,9 +1027,9 @@ } }, "node_modules/@lando/core": { - "version": "3.21.0-alpha.7", - "resolved": "https://registry.npmjs.org/@lando/core/-/core-3.21.0-alpha.7.tgz", - "integrity": "sha512-AERStKm5cOmjC8MrZ0UqbsBm6djqutqSoWv79pkptDlnEJlvwjiR3NQ96PbtTFTF1OwwKnWM7GhneHxPELVnFQ==", + "version": "3.21.0-alpha.9", + "resolved": "https://registry.npmjs.org/@lando/core/-/core-3.21.0-alpha.9.tgz", + "integrity": "sha512-uPmJYgsSJz48dCI73fk4R4SntJvphDYxzZdGDCm+2KtCtv3gmZo7T6OkVHCUyACsCNufrU5pj8YJvpmH1LH0rA==", "bundleDependencies": [ "@npmcli/arborist", "@octokit/rest", @@ -1037,7 +1037,6 @@ "bluebird", "clean-stacktrace", "cli-truncate", - "copy-dir", "debug", "delay", "dockerfile-generator", @@ -1080,7 +1079,6 @@ "bluebird": "^3.4.1", "clean-stacktrace": "^1.1.0", "cli-truncate": "2.1.0", - "copy-dir": "^0.4.0", "debug": "^4.3.4", "delay": "^5", "dockerfile-generator": "^5.0.0", @@ -6164,14 +6162,6 @@ "inBundle": true, "license": "ISC" }, - "node_modules/@lando/core/node_modules/copy-dir": { - "version": "0.4.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "mkdir-p": "~0.0.4" - } - }, "node_modules/@lando/core/node_modules/core-util-is": { "version": "1.0.3", "inBundle": true, @@ -7860,11 +7850,6 @@ "inBundle": true, "license": "ISC" }, - "node_modules/@lando/core/node_modules/mkdir-p": { - "version": "0.0.7", - "inBundle": true, - "license": "MIT" - }, "node_modules/@lando/core/node_modules/mkdirp": { "version": "1.0.4", "inBundle": true, @@ -12081,15 +12066,6 @@ "node": ">=10" } }, - "node_modules/@yao-pkg/pkg-fetch/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, "node_modules/@yao-pkg/pkg-fetch/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -15001,9 +14977,13 @@ } }, "node_modules/get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, "node_modules/get-func-name": { "version": "2.0.2", @@ -16929,15 +16909,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, "node_modules/mocha/node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -17474,15 +17445,6 @@ "node": ">=8.0.0" } }, - "node_modules/nyc/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, "node_modules/nyc/node_modules/p-map": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", @@ -17495,12 +17457,6 @@ "node": ">=8" } }, - "node_modules/nyc/node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "node_modules/nyc/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -18560,9 +18516,10 @@ } }, "node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true }, "node_modules/resolve": { "version": "1.22.8", @@ -20451,6 +20408,11 @@ "node": ">=6" } }, + "node_modules/yargs/node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, "node_modules/yargs/node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -20490,6 +20452,11 @@ "node": ">=4" } }, + "node_modules/yargs/node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" + }, "node_modules/yargs/node_modules/string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -21306,9 +21273,9 @@ "integrity": "sha512-b3d4zF1QBrFgUCFxEb48b0hse98wRhfnnydFsKXTcQc4aogfCBZc9wbgktLrs6TUtLKvU57YtlfNU4ack1ll7w==" }, "@lando/core": { - "version": "3.21.0-alpha.7", - "resolved": "https://registry.npmjs.org/@lando/core/-/core-3.21.0-alpha.7.tgz", - "integrity": "sha512-AERStKm5cOmjC8MrZ0UqbsBm6djqutqSoWv79pkptDlnEJlvwjiR3NQ96PbtTFTF1OwwKnWM7GhneHxPELVnFQ==", + "version": "3.21.0-alpha.9", + "resolved": "https://registry.npmjs.org/@lando/core/-/core-3.21.0-alpha.9.tgz", + "integrity": "sha512-uPmJYgsSJz48dCI73fk4R4SntJvphDYxzZdGDCm+2KtCtv3gmZo7T6OkVHCUyACsCNufrU5pj8YJvpmH1LH0rA==", "requires": { "@npmcli/arborist": "^6.2.9", "@octokit/rest": "^19", @@ -21316,7 +21283,6 @@ "bluebird": "^3.4.1", "clean-stacktrace": "^1.1.0", "cli-truncate": "2.1.0", - "copy-dir": "^0.4.0", "debug": "^4.3.4", "delay": "^5", "dockerfile-generator": "^5.0.0", @@ -22301,13 +22267,6 @@ "version": "1.1.0", "bundled": true }, - "copy-dir": { - "version": "0.4.0", - "bundled": true, - "requires": { - "mkdir-p": "~0.0.4" - } - }, "core-util-is": { "version": "1.0.3", "bundled": true @@ -23390,10 +23349,6 @@ } } }, - "mkdir-p": { - "version": "0.0.7", - "bundled": true - }, "mkdirp": { "version": "1.0.4", "bundled": true @@ -29011,12 +28966,6 @@ "universalify": "^2.0.0" } }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -31016,9 +30965,10 @@ "dev": true }, "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true }, "get-func-name": { "version": "2.0.2", @@ -32466,12 +32416,6 @@ "path-exists": "^4.0.0" } }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -32869,12 +32813,6 @@ "signal-exit": "^3.0.2" } }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, "p-map": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", @@ -32884,12 +32822,6 @@ "aggregate-error": "^3.0.0" } }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -33651,9 +33583,10 @@ "dev": true }, "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true }, "resolve": { "version": "1.22.8", @@ -34977,6 +34910,11 @@ "locate-path": "^3.0.0" } }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -35004,6 +34942,11 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", diff --git a/package.json b/package.json index 60202f8c5..f85236ae3 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ }, "dependencies": { "@lando/argv": "^1.1.0", - "@lando/core": "^3.21.0-alpha.7", + "@lando/core": "^3.21.0-alpha.9", "@lando/core-next": "npm:@lando/core@^4.0.0-unstable.5", "@oclif/core": "^3.5.0", "@oclif/parser": "^3.8.17",