From 16b8d286a8819b26cb35cc4f19e67e92c89a6d69 Mon Sep 17 00:00:00 2001 From: Alex Skrypnyk Date: Tue, 10 Nov 2026 17:49:07 +1100 Subject: [PATCH 01/14] Migrated the installer prompts from 'laravel/prompts' to 'alexskrypnyk/prompty' and dropped the 'laravel/prompts' patch. --- .../config/vocabularies/Vortex/accept.txt | 1 + .../contributing/maintenance/installer.mdx | 2 +- .vortex/docs/cspell.json | 1 + .vortex/installer/CLAUDE.md | 94 -- .vortex/installer/composer.json | 19 +- .vortex/installer/composer.lock | 418 ++---- .vortex/installer/patches.lock.json | 17 - .../installer/patches/laravel-prompts.patch | 1317 ----------------- .vortex/installer/patches/reroot-patch.php | 86 -- .../installer/playground/task-streaming.php | 16 +- .vortex/installer/playground/tui.php | 2 +- .../installer/src/Command/InstallCommand.php | 6 +- .../installer/src/Prompts/PromptManager.php | 361 +++-- .vortex/installer/src/Prompts/PromptType.php | 44 +- .vortex/installer/src/Task/Task.php | 27 +- .vortex/installer/src/Utils/Tui.php | 98 +- .../tests/Functional/FunctionalTestCase.php | 2 +- .../installer/tests/Functional/PharTest.php | 7 +- .vortex/installer/tests/Traits/TuiTrait.php | 59 +- .../AbstractHandlerDiscoveryTestCase.php | 7 +- ...AiCodeInstructionsHandlerDiscoveryTest.php | 3 +- .../AiCodeReviewHandlerDiscoveryTest.php | 5 +- .../CiProviderHandlerDiscoveryTest.php | 3 +- ...deCoverageProviderHandlerDiscoveryTest.php | 3 +- .../CodeProviderHandlerDiscoveryTest.php | 5 +- .../CustomModulesHandlerDiscoveryTest.php | 3 +- ...atabaseFetchSourceHandlerDiscoveryTest.php | 3 +- .../DatabaseImageHandlerDiscoveryTest.php | 10 +- ...ncyUpdatesProviderHandlerDiscoveryTest.php | 7 +- .../DeployTypesHandlerDiscoveryTest.php | 3 +- .../Handlers/DocsHandlerDiscoveryTest.php | 3 +- .../FrontendBuildHandlerDiscoveryTest.php | 5 +- ...HostingProjectNameHandlerDiscoveryTest.php | 19 +- .../HostingProviderHandlerDiscoveryTest.php | 5 +- ...grationFetchSourceHandlerDiscoveryTest.php | 19 +- .../MigrationHandlerDiscoveryTest.php | 9 +- .../MigrationImageHandlerDiscoveryTest.php | 14 +- .../Handlers/ModulesHandlerDiscoveryTest.php | 3 +- ...tificationChannelsHandlerDiscoveryTest.php | 3 +- .../Handlers/ProfileHandlerDiscoveryTest.php | 7 +- .../ProvisionTypeHandlerDiscoveryTest.php | 3 +- .../PullRequestHandlerDiscoveryTest.php | 5 +- .../Handlers/ServicesHandlerDiscoveryTest.php | 3 +- .../Handlers/StarterHandlerDiscoveryTest.php | 7 +- .../StorybookHandlerDiscoveryTest.php | 7 +- .../Handlers/ThemeHandlerDiscoveryTest.php | 15 +- .../Handlers/ToolsHandlerDiscoveryTest.php | 3 +- .../VersionSchemeHandlerDiscoveryTest.php | 3 +- .../Handlers/WebrootHandlerDiscoveryTest.php | 7 +- .../tests/Unit/Prompts/PromptTypeTest.php | 18 +- 50 files changed, 529 insertions(+), 2258 deletions(-) delete mode 100644 .vortex/installer/patches.lock.json delete mode 100644 .vortex/installer/patches/laravel-prompts.patch delete mode 100644 .vortex/installer/patches/reroot-patch.php diff --git a/.vortex/docs/.vale/config/vocabularies/Vortex/accept.txt b/.vortex/docs/.vale/config/vocabularies/Vortex/accept.txt index cca854d87c..b277af614c 100644 --- a/.vortex/docs/.vale/config/vocabularies/Vortex/accept.txt +++ b/.vortex/docs/.vale/config/vocabularies/Vortex/accept.txt @@ -26,6 +26,7 @@ PHPCS PHPStan PHPUnit PhpStorm +Prompty Pygmy Rector Renovate diff --git a/.vortex/docs/content/contributing/maintenance/installer.mdx b/.vortex/docs/content/contributing/maintenance/installer.mdx index 8a065f2e52..01c0c0a44a 100644 --- a/.vortex/docs/content/contributing/maintenance/installer.mdx +++ b/.vortex/docs/content/contributing/maintenance/installer.mdx @@ -33,7 +33,7 @@ together with the installer logic that handles it, so the 2 stay in step. The installer is written in PHP because it touches many parts of the template and has to manage every permutation of the template's variants. PHP also gives it a terminal UI through -[Laravel Prompts](https://github.com/laravel/prompts), which asks the +[Prompty](https://github.com/AlexSkrypnyk/prompty), which asks the questions 1 at a time. With `--no-interaction`, it asks nothing at all: it installs and updates projects unattended, which suits automated pipelines and CI environments. diff --git a/.vortex/docs/cspell.json b/.vortex/docs/cspell.json index 8a3db57a56..db7e21a182 100644 --- a/.vortex/docs/cspell.json +++ b/.vortex/docs/cspell.json @@ -88,6 +88,7 @@ "phpstorm", "postbuild", "preboot", + "prompty", "pyrech", "redis", "renovatebot", diff --git a/.vortex/installer/CLAUDE.md b/.vortex/installer/CLAUDE.md index 28c992921c..87ba8e622a 100644 --- a/.vortex/installer/CLAUDE.md +++ b/.vortex/installer/CLAUDE.md @@ -174,97 +174,3 @@ Each handler has dedicated test class extending Structure: each `dataProvider*` sits immediately after the test it feeds; helper methods go last. - -## Patches - -The installer applies a single patch to `laravel/prompts` via -`cweagans/composer-patches` v2 to add three behaviors it depends on. - -### Patch location - -- File: `patches/laravel-prompts.patch` -- Registered in: `composer.json` under `extra.patches` -- Lockfile: `patches.lock.json` (regenerated by composer-patches; do not - hand-edit) - -### What the patch adds - -1. **`description` field on every Prompt class and renderer**. A new - `RendersDescription` trait under - `vendor/laravel/prompts/src/Themes/Default/Concerns/` renders a - description block inside the prompt frame. `PromptManager::runPrompts()` - threads `$handler->description($responses)` into `$args['description']` - for every handler that returns a non-null description. -2. **`Prompt::validateUsing(?Closure $callback)` accepts null**, so - `tests/Traits/TuiTrait.php::tuiTeardown()` can clear the validator - between tests. -3. **The static `validateUsing` callback runs before the instance - `validate` closure and receives `$value`**. `TuiTrait::tuiSetUp()` uses - this to intercept every prompt's validation and throw `RuntimeException` - on failure, so non-interactive tests fail fast instead of hanging - waiting for user input. - -The patch also includes a small `Concerns/TypedValue.php` tweak -(`strlen($default) > 0` → truthy check); not exercised directly by the -installer. - -### Re-roll procedure - -Whenever the `laravel/prompts` version in `composer.json` is bumped -(Renovate PR or manual update), the patch must be re-rolled because the -description trait touches renderers that frequently change between -releases. - -```bash -# 1. After bumping the version in .vortex/installer/composer.json, try the -# existing patch first. -composer --working-dir .vortex/installer update laravel/prompts --with-dependencies -rm -f ~/Library/Caches/composer/patches/*.patch # macOS cache path -rm -f ~/.cache/composer/patches/*.patch # Linux cache path -composer --working-dir .vortex/installer patches-relock -composer --working-dir .vortex/installer patches-repatch -``` - -If `patches-repatch` succeeds, jump to the verify step. - -If it fails (`No available patcher was able to apply patch`), the patch -conflicts with the new upstream and needs editing: - -```bash -# 2. Extract the new upstream source for editing. -git clone https://github.com/laravel/prompts.git /tmp/prompts-upstream -git -C /tmp/prompts-upstream checkout v -cp -R /tmp/prompts-upstream/src /tmp/upstream-pristine-src - -# 3. Apply the three changes to /tmp/prompts-upstream/src using -# .vortex/installer/patches/laravel-prompts.patch as reference: -# a) Re-introduce the RendersDescription trait and thread `description` -# through every Prompt constructor + matching renderer. -# b) Update Prompt::validateUsing() signature to `?Closure $callback`. -# c) Swap the match arms in Prompt::validate() so the static validator -# runs first and receives $value as the second argument. - -# 4. Regenerate the unified diff against the pristine upstream copy. -diff -ruN /tmp/upstream-pristine-src /tmp/prompts-upstream/src > /tmp/raw.patch - -# 5. Re-root paths to `a/src/...` / `b/src/...` and strip timestamps using -# the committed helper. -php .vortex/installer/patches/reroot-patch.php \ - /tmp/raw.patch \ - .vortex/installer/patches/laravel-prompts.patch \ - /tmp/upstream-pristine-src/ \ - /tmp/prompts-upstream/src/ - -# 6. Refresh the lockfile and re-apply. -rm -f ~/Library/Caches/composer/patches/*.patch -rm -f ~/.cache/composer/patches/*.patch -composer --working-dir .vortex/installer patches-relock -composer --working-dir .vortex/installer patches-repatch -``` - -Verify: - -```bash -composer --working-dir .vortex/installer test -composer --working-dir .vortex/installer lint -``` diff --git a/.vortex/installer/composer.json b/.vortex/installer/composer.json index d7fc8521af..e2dd2995ce 100644 --- a/.vortex/installer/composer.json +++ b/.vortex/installer/composer.json @@ -19,12 +19,11 @@ "require": { "php": ">=8.3", "alexskrypnyk/file": "^1.3.0", + "alexskrypnyk/prompty": "dev-main", "alexskrypnyk/str2name": "^1.7.0", "composer/composer": "^2.11.1", - "cweagans/composer-patches": "^2", "czproject/git-php": "^4.6", "guzzlehttp/guzzle": "^8.3.1", - "laravel/prompts": "^0.3.27", "nelexa/zip": "^4.1.0", "nikic/iter": "^2.4.1", "sebastian/diff": "^7.0.1", @@ -41,12 +40,18 @@ "drupal/coder": "^9.0.1@alpha", "ergebnis/composer-normalize": "^2.56.0", "laravel/serializable-closure": "^2.1.0", - "mockery/mockery": "^1.6.15", "phpstan/phpstan": "^2.3.5", "phpunit/phpunit": "^12.5.43", "rector/rector": "^2.8.4", "symfony/finder": "^7.4.23" }, + "repositories": [ + { + "name": "prompty", + "type": "vcs", + "url": "https://github.com/AlexSkrypnyk/prompty" + } + ], "autoload": { "psr-4": { "DrevOps\\VortexInstaller\\": "src/" @@ -66,7 +71,6 @@ "config": { "allow-plugins": { "bamarni/composer-bin-plugin": true, - "cweagans/composer-patches": true, "dealerdirect/phpcodesniffer-composer-installer": true, "ergebnis/composer-normalize": true }, @@ -74,13 +78,6 @@ "process-timeout": 0, "sort-packages": true }, - "extra": { - "patches": { - "laravel/prompts": { - "Description support, nullable validateUsing, validator precedence, TypedValue truthy check": "patches/laravel-prompts.patch" - } - } - }, "scripts": { "build": [ "@composer bin box require --dev humbug/box", diff --git a/.vortex/installer/composer.lock b/.vortex/installer/composer.lock index 7b82b2787b..926ea22c52 100644 --- a/.vortex/installer/composer.lock +++ b/.vortex/installer/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "aabc2b6c653b67116031b3b78a5e505a", + "content-hash": "9c147eb0b284e96b6ec7a822122c3170", "packages": [ { "name": "alexskrypnyk/file", @@ -76,6 +76,98 @@ "time": "2026-10-21T12:43:31+00:00", "published-time": "2026-10-21T12:44:51+00:00" }, + { + "name": "alexskrypnyk/prompty", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/AlexSkrypnyk/prompty.git", + "reference": "da65ae3c3dc1ae7faa1faee42224c06af8ef6c3f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/AlexSkrypnyk/prompty/zipball/da65ae3c3dc1ae7faa1faee42224c06af8ef6c3f", + "reference": "da65ae3c3dc1ae7faa1faee42224c06af8ef6c3f", + "shasum": "" + }, + "require": { + "php": ">=8.3" + }, + "require-dev": { + "alexskrypnyk/phpunit-helpers": "^1.2.0", + "bamarni/composer-bin-plugin": "^1.9.1", + "dealerdirect/phpcodesniffer-composer-installer": "^1.2.1", + "drevops/phpcs-standard": "^1.1.0", + "drupal/coder": "^9.0.1", + "ergebnis/composer-normalize": "^2.52.0", + "opis/closure": "^4.5.0", + "phpstan/phpstan": "^2.2.8", + "phpunit/phpunit": "^12.5.43", + "rector/rector": "^2.6.2" + }, + "default-branch": true, + "type": "library", + "autoload": { + "classmap": [ + "Prompty.php", + "PromptyTestTrait.php" + ] + }, + "autoload-dev": { + "classmap": [ + "tests/phpunit" + ] + }, + "scripts": { + "lint": [ + "phpcs", + "phpstan", + "rector --dry-run", + "php .util/check-embed.php" + ], + "lint-fix": [ + "rector", + "phpcbf" + ], + "reset": [ + "rm -Rf vendor vendor-bin composer.lock" + ], + "test": [ + "phpunit --no-coverage" + ], + "test-coverage": [ + "phpunit" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Skrypnyk", + "email": "prompty@alexskrypnyk.com", + "homepage": "https://alexskrypnyk.com", + "role": "Maintainer" + } + ], + "description": "Zero-dependency interactive CLI prompt library", + "homepage": "https://github.com/alexskrypnyk/prompty", + "support": { + "issues": "https://github.com/alexskrypnyk/prompty/issues", + "source": "https://github.com/alexskrypnyk/prompty" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/alexskrypnyk" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/alexskrypnyk" + } + ], + "time": "2026-11-10T06:24:28+00:00" + }, { "name": "alexskrypnyk/str2name", "version": "1.7.0", @@ -767,131 +859,6 @@ "time": "2024-05-06T16:37:16+00:00", "published-time": "2024-05-06T17:01:42+00:00" }, - { - "name": "cweagans/composer-configurable-plugin", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/cweagans/composer-configurable-plugin.git", - "reference": "15433906511a108a1806710e988629fd24b89974" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cweagans/composer-configurable-plugin/zipball/15433906511a108a1806710e988629fd24b89974", - "reference": "15433906511a108a1806710e988629fd24b89974", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "require-dev": { - "codeception/codeception": "~4.0", - "codeception/module-asserts": "^2.0", - "composer/composer": "~2.0", - "php-coveralls/php-coveralls": "~2.0", - "php-parallel-lint/php-parallel-lint": "^1.0.0", - "phpro/grumphp": "^1.8.0", - "sebastian/phpcpd": "^6.0", - "squizlabs/php_codesniffer": "^3.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "cweagans\\Composer\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Cameron Eagans", - "email": "me@cweagans.net" - } - ], - "description": "Provides a lightweight configuration system for Composer plugins.", - "support": { - "issues": "https://github.com/cweagans/composer-configurable-plugin/issues", - "source": "https://github.com/cweagans/composer-configurable-plugin/tree/2.0.0" - }, - "funding": [ - { - "url": "https://github.com/cweagans", - "type": "github" - } - ], - "time": "2023-02-12T04:58:58+00:00", - "published-time": "2023-02-12T05:06:43+00:00" - }, - { - "name": "cweagans/composer-patches", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/cweagans/composer-patches.git", - "reference": "bfa6018a5f864653d9ed899b902ea72f858a2cf7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cweagans/composer-patches/zipball/bfa6018a5f864653d9ed899b902ea72f858a2cf7", - "reference": "bfa6018a5f864653d9ed899b902ea72f858a2cf7", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^2.0", - "cweagans/composer-configurable-plugin": "^2.0", - "ext-json": "*", - "php": ">=8.0.0" - }, - "require-dev": { - "codeception/codeception": "~4.0", - "codeception/module-asserts": "^2.0", - "codeception/module-cli": "^2.0", - "codeception/module-filesystem": "^2.0", - "composer/composer": "~2.0", - "php-coveralls/php-coveralls": "~2.0", - "php-parallel-lint/php-parallel-lint": "^1.0.0", - "phpro/grumphp": "^1.8.0", - "sebastian/phpcpd": "^6.0", - "squizlabs/php_codesniffer": "^4.0" - }, - "type": "composer-plugin", - "extra": { - "_": "The following two lines ensure that composer-patches is loaded as early as possible.", - "class": "cweagans\\Composer\\Plugin\\Patches", - "plugin-modifies-downloads": true, - "plugin-modifies-install-path": true - }, - "autoload": { - "psr-4": { - "cweagans\\Composer\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Cameron Eagans", - "email": "me@cweagans.net" - } - ], - "description": "Provides a way to patch Composer packages.", - "support": { - "issues": "https://github.com/cweagans/composer-patches/issues", - "source": "https://github.com/cweagans/composer-patches/tree/2.0.0" - }, - "funding": [ - { - "url": "https://github.com/cweagans", - "type": "github" - } - ], - "time": "2025-10-30T23:44:22+00:00", - "published-time": "2025-10-31T01:21:00+00:00" - }, { "name": "czproject/git-php", "version": "v4.6.0", @@ -1355,65 +1322,6 @@ "time": "2026-10-24T08:53:34+00:00", "published-time": "2026-10-24T08:53:38+00:00" }, - { - "name": "laravel/prompts", - "version": "v0.3.27", - "source": { - "type": "git", - "url": "https://github.com/laravel/prompts.git", - "reference": "abdfc75a1ae6c6f21522daed50da7124cbff09d2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/abdfc75a1ae6c6f21522daed50da7124cbff09d2", - "reference": "abdfc75a1ae6c6f21522daed50da7124cbff09d2", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.2", - "ext-mbstring": "*", - "php": "^8.1", - "symfony/console": "^6.2|^7.0|^8.0" - }, - "conflict": { - "illuminate/console": ">=10.17.0 <10.25.0", - "laravel/framework": ">=10.17.0 <10.25.0" - }, - "require-dev": { - "illuminate/collections": "^10.0|^11.0|^12.0|^13.0", - "mockery/mockery": "^1.5", - "pestphp/pest": "^2.3|^3.4|^4.0", - "phpstan/phpstan": "^1.12.28", - "phpstan/phpstan-mockery": "^1.1.3" - }, - "suggest": { - "ext-pcntl": "Required for the spinner to be animated." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "0.3.x-dev" - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Laravel\\Prompts\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Add beautiful and user-friendly forms to your command-line applications.", - "support": { - "source": "https://github.com/laravel/prompts/tree/v0.3.27" - }, - "time": "2026-11-09T16:07:10+00:00", - "published-time": "2026-11-09T16:09:07+00:00" - }, { "name": "marc-mabe/php-enum", "version": "v4.7.2", @@ -4498,62 +4406,6 @@ "time": "2026-09-24T19:42:52+00:00", "published-time": "2026-09-24T19:43:04+00:00" }, - { - "name": "hamcrest/hamcrest-php", - "version": "v3.0.0", - "source": { - "type": "git", - "url": "https://github.com/hamcrest/hamcrest-php.git", - "reference": "b61cd040da1a4925bc90a51c074f5297e7c0fa52" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/b61cd040da1a4925bc90a51c074f5297e7c0fa52", - "reference": "b61cd040da1a4925bc90a51c074f5297e7c0fa52", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-dom": "*", - "php": "^7.4|^8.0" - }, - "replace": { - "cordoval/hamcrest-php": "*", - "davedevelopment/hamcrest-php": "*", - "kodova/hamcrest-php": "*" - }, - "require-dev": { - "phpstan/phpstan": "^2.1", - "phpstan/phpstan-phpunit": "^2.0", - "phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0", - "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "hamcrest" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "This is the PHP port of Hamcrest Matchers", - "keywords": [ - "test" - ], - "support": { - "issues": "https://github.com/hamcrest/hamcrest-php/issues", - "source": "https://github.com/hamcrest/hamcrest-php/tree/v3.0.0" - }, - "time": "2026-03-17T11:56:53+00:00", - "published-time": "2026-06-16T10:52:40+00:00" - }, { "name": "laravel/serializable-closure", "version": "v2.1.0", @@ -4672,89 +4524,6 @@ "time": "2025-08-30T09:44:18+00:00", "published-time": "2025-08-30T09:45:38+00:00" }, - { - "name": "mockery/mockery", - "version": "1.6.15", - "source": { - "type": "git", - "url": "https://github.com/mockery/mockery.git", - "reference": "967a801bd188989a5669bd280f252d51c0fdc9ee" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/967a801bd188989a5669bd280f252d51c0fdc9ee", - "reference": "967a801bd188989a5669bd280f252d51c0fdc9ee", - "shasum": "" - }, - "require": { - "hamcrest/hamcrest-php": "^2.0 || ^3.0", - "php": ">=7.3" - }, - "conflict": { - "phpunit/phpunit": "<8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.6.36", - "symplify/easy-coding-standard": "^13.2.17" - }, - "type": "library", - "autoload": { - "files": [ - "library/helpers.php", - "library/Mockery.php" - ], - "psr-4": { - "Mockery\\": "library/Mockery" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Pádraic Brady", - "email": "padraic.brady@gmail.com", - "homepage": "https://github.com/padraic", - "role": "Author" - }, - { - "name": "Dave Marshall", - "email": "dave.marshall@atstsolutions.co.uk", - "homepage": "https://davedevelopment.co.uk", - "role": "Developer" - }, - { - "name": "Nathanael Esayeas", - "email": "nathanael.esayeas@protonmail.com", - "homepage": "https://github.com/ghostwriter", - "role": "Lead Developer" - } - ], - "description": "Mockery is a simple yet flexible PHP mock object framework", - "homepage": "https://github.com/mockery/mockery", - "keywords": [ - "BDD", - "TDD", - "library", - "mock", - "mock objects", - "mockery", - "stub", - "test", - "test double", - "testing" - ], - "support": { - "docs": "https://docs.mockery.io/", - "issues": "https://github.com/mockery/mockery/issues", - "rss": "https://github.com/mockery/mockery/releases.atom", - "security": "https://github.com/mockery/mockery/security/advisories", - "source": "https://github.com/mockery/mockery" - }, - "time": "2026-08-19T19:37:52+00:00", - "published-time": "2026-08-19T19:38:57+00:00" - }, { "name": "myclabs/deep-copy", "version": "1.14.0", @@ -6800,6 +6569,7 @@ "aliases": [], "minimum-stability": "stable", "stability-flags": { + "alexskrypnyk/prompty": 20, "drupal/coder": 15 }, "prefer-stable": false, diff --git a/.vortex/installer/patches.lock.json b/.vortex/installer/patches.lock.json deleted file mode 100644 index 1615cfa225..0000000000 --- a/.vortex/installer/patches.lock.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "_hash": "dc0fda737136aaf6161a15cbcdec116815593858abcbd6fa74deff274bcbec07", - "patches": { - "laravel/prompts": [ - { - "package": "laravel/prompts", - "description": "Description support, nullable validateUsing, validator precedence, TypedValue truthy check", - "url": "patches/laravel-prompts.patch", - "sha256": "6be6cb4d721c726074dbeb3e9b44ab03b2affaa6369d7e7115f6f5a6411c2046", - "depth": 1, - "extra": { - "provenance": "root" - } - } - ] - } -} diff --git a/.vortex/installer/patches/laravel-prompts.patch b/.vortex/installer/patches/laravel-prompts.patch deleted file mode 100644 index c05cf56417..0000000000 --- a/.vortex/installer/patches/laravel-prompts.patch +++ /dev/null @@ -1,1317 +0,0 @@ -diff -ruN a/src/AutoCompletePrompt.php b/src/AutoCompletePrompt.php ---- a/src/AutoCompletePrompt.php -+++ b/src/AutoCompletePrompt.php -@@ -39,6 +39,7 @@ - public mixed $validate = null, - public string $hint = '', - public ?Closure $transform = null, -+ public ?string $description = null, - ) { - $this->options = $options instanceof Collection ? $options->all() : $options; - -diff -ruN a/src/ConfirmPrompt.php b/src/ConfirmPrompt.php ---- a/src/ConfirmPrompt.php -+++ b/src/ConfirmPrompt.php -@@ -23,6 +23,7 @@ - public mixed $validate = null, - public string $hint = '', - public ?Closure $transform = null, -+ public ?string $description = null, - ) { - $this->confirmed = $default; - -diff -ruN a/src/FormBuilder.php b/src/FormBuilder.php ---- a/src/FormBuilder.php -+++ b/src/FormBuilder.php -@@ -88,7 +88,7 @@ - /** - * Prompt the user for text input. - */ -- public function text(string $label, string $placeholder = '', string $default = '', bool|string $required = false, mixed $validate = null, string $hint = '', ?string $name = null, ?Closure $transform = null): self -+ public function text(string $label, string $placeholder = '', string $default = '', bool|string $required = false, mixed $validate = null, string $hint = '', ?string $name = null, ?Closure $transform = null, ?string $description = null): self - { - return $this->runPrompt(text(...), get_defined_vars()); - } -@@ -96,7 +96,7 @@ - /** - * Prompt the user for multiline text input. - */ -- public function textarea(string $label, string $placeholder = '', string $default = '', bool|string $required = false, ?Closure $validate = null, string $hint = '', int $rows = 5, ?string $name = null, ?Closure $transform = null): self -+ public function textarea(string $label, string $placeholder = '', string $default = '', bool|string $required = false, ?Closure $validate = null, string $hint = '', int $rows = 5, ?string $name = null, ?Closure $transform = null, ?string $description = null): self - { - return $this->runPrompt(textarea(...), get_defined_vars()); - } -@@ -104,7 +104,7 @@ - /** - * Prompt the user for input, hiding the value. - */ -- public function password(string $label, string $placeholder = '', bool|string $required = false, mixed $validate = null, string $hint = '', ?string $name = null, ?Closure $transform = null): self -+ public function password(string $label, string $placeholder = '', bool|string $required = false, mixed $validate = null, string $hint = '', ?string $name = null, ?Closure $transform = null, ?string $description = null): self - { - return $this->runPrompt(password(...), get_defined_vars()); - } -@@ -115,7 +115,7 @@ - * @param array|Collection $options - * @param true|string $required - */ -- public function select(string $label, array|Collection $options, int|string|null $default = null, int $scroll = 5, mixed $validate = null, string $hint = '', bool|string $required = true, ?string $name = null, ?Closure $transform = null): self -+ public function select(string $label, array|Collection $options, int|string|null $default = null, int $scroll = 5, mixed $validate = null, string $hint = '', bool|string $required = true, ?string $name = null, ?Closure $transform = null, ?string $description = null): self - { - return $this->runPrompt(select(...), get_defined_vars()); - } -@@ -126,7 +126,7 @@ - * @param array|Collection $options - * @param array|Collection $default - */ -- public function multiselect(string $label, array|Collection $options, array|Collection $default = [], int $scroll = 5, bool|string $required = false, mixed $validate = null, string $hint = 'Use the space bar to select options.', ?string $name = null, ?Closure $transform = null): self -+ public function multiselect(string $label, array|Collection $options, array|Collection $default = [], int $scroll = 5, bool|string $required = false, mixed $validate = null, string $hint = 'Use the space bar to select options.', ?string $name = null, ?Closure $transform = null, ?string $description = null): self - { - return $this->runPrompt(multiselect(...), get_defined_vars()); - } -@@ -134,7 +134,7 @@ - /** - * Prompt the user to confirm an action. - */ -- public function confirm(string $label, bool $default = true, string $yes = 'Yes', string $no = 'No', bool|string $required = false, mixed $validate = null, string $hint = '', ?string $name = null, ?Closure $transform = null): self -+ public function confirm(string $label, bool $default = true, string $yes = 'Yes', string $no = 'No', bool|string $required = false, mixed $validate = null, string $hint = '', ?string $name = null, ?Closure $transform = null, ?string $description = null): self - { - return $this->runPrompt(confirm(...), get_defined_vars()); - } -@@ -152,7 +152,7 @@ - * - * @param array|Collection|Closure(string): array $options - */ -- public function suggest(string $label, array|Collection|Closure $options, string $placeholder = '', string $default = '', int $scroll = 5, bool|string $required = false, mixed $validate = null, string $hint = '', ?string $name = null, ?Closure $transform = null): self -+ public function suggest(string $label, array|Collection|Closure $options, string $placeholder = '', string $default = '', int $scroll = 5, bool|string $required = false, mixed $validate = null, string $hint = '', ?string $name = null, ?Closure $transform = null, ?string $description = null): self - { - return $this->runPrompt(suggest(...), get_defined_vars()); - } -@@ -163,7 +163,7 @@ - * @param Closure(string): array $options - * @param true|string $required - */ -- public function search(string $label, Closure $options, string $placeholder = '', int $scroll = 5, mixed $validate = null, string $hint = '', bool|string $required = true, ?string $name = null, ?Closure $transform = null): self -+ public function search(string $label, Closure $options, string $placeholder = '', int $scroll = 5, mixed $validate = null, string $hint = '', bool|string $required = true, ?string $name = null, ?Closure $transform = null, ?string $description = null): self - { - return $this->runPrompt(search(...), get_defined_vars()); - } -@@ -173,7 +173,7 @@ - * - * @param Closure(string): array $options - */ -- public function multisearch(string $label, Closure $options, string $placeholder = '', int $scroll = 5, bool|string $required = false, mixed $validate = null, string $hint = 'Use the space bar to select options.', ?string $name = null, ?Closure $transform = null): self -+ public function multisearch(string $label, Closure $options, string $placeholder = '', int $scroll = 5, bool|string $required = false, mixed $validate = null, string $hint = 'Use the space bar to select options.', ?string $name = null, ?Closure $transform = null, ?string $description = null): self - { - return $this->runPrompt(multisearch(...), get_defined_vars()); - } -diff -ruN a/src/MultiSearchPrompt.php b/src/MultiSearchPrompt.php ---- a/src/MultiSearchPrompt.php -+++ b/src/MultiSearchPrompt.php -@@ -46,6 +46,7 @@ - public string $hint = '', - public ?Closure $transform = null, - public string|Closure $info = '', -+ public ?string $description = null, - ) { - $this->trackTypedValue(submit: false, ignore: fn ($key) => Key::oneOf([Key::SPACE, Key::HOME, Key::END, Key::CTRL_A, Key::CTRL_E], $key) && $this->highlighted !== null); - -diff -ruN a/src/MultiSelectPrompt.php b/src/MultiSelectPrompt.php ---- a/src/MultiSelectPrompt.php -+++ b/src/MultiSelectPrompt.php -@@ -47,6 +47,7 @@ - public string $hint = '', - public ?Closure $transform = null, - public string|Closure $info = '', -+ public ?string $description = null, - ) { - $this->options = $options instanceof Collection ? $options->all() : $options; - $this->default = $default instanceof Collection ? $default->all() : $default; -diff -ruN a/src/NumberPrompt.php b/src/NumberPrompt.php ---- a/src/NumberPrompt.php -+++ b/src/NumberPrompt.php -@@ -23,6 +23,7 @@ - public ?int $min = null, - public ?int $max = null, - public ?int $step = null, -+ public ?string $description = null, - ) { - $this->trackTypedValue($default); - -diff -ruN a/src/PasswordPrompt.php b/src/PasswordPrompt.php ---- a/src/PasswordPrompt.php -+++ b/src/PasswordPrompt.php -@@ -18,6 +18,7 @@ - public mixed $validate = null, - public string $hint = '', - public ?Closure $transform = null, -+ public ?string $description = null, - ) { - $this->trackTypedValue(); - } -diff -ruN a/src/Prompt.php b/src/Prompt.php ---- a/src/Prompt.php -+++ b/src/Prompt.php -@@ -249,7 +249,7 @@ - /** - * Set the custom validation callback. - */ -- public static function validateUsing(Closure $callback): void -+ public static function validateUsing(?Closure $callback): void - { - static::$validateUsing = $callback; - } -@@ -403,8 +403,8 @@ - } - - $error = match (true) { -+ isset(static::$validateUsing) => (static::$validateUsing)($this, $value), - is_callable($this->validate) => ($this->validate)($value), -- isset(static::$validateUsing) => (static::$validateUsing)($this), - default => throw new RuntimeException('The validation logic is missing.'), - }; - -diff -ruN a/src/SearchPrompt.php b/src/SearchPrompt.php ---- a/src/SearchPrompt.php -+++ b/src/SearchPrompt.php -@@ -34,6 +34,7 @@ - public bool|string $required = true, - public ?Closure $transform = null, - public string|Closure $info = '', -+ public ?string $description = null, - ) { - if ($this->required === false) { - throw new InvalidArgumentException('Argument [required] must be true or a string.'); -diff -ruN a/src/SelectPrompt.php b/src/SelectPrompt.php ---- a/src/SelectPrompt.php -+++ b/src/SelectPrompt.php -@@ -33,6 +33,7 @@ - public bool|string $required = true, - public ?Closure $transform = null, - public string|Closure $info = '', -+ public ?string $description = null, - ) { - if ($this->required === false) { - throw new InvalidArgumentException('Argument [required] must be true or a string.'); -diff -ruN a/src/SuggestPrompt.php b/src/SuggestPrompt.php ---- a/src/SuggestPrompt.php -+++ b/src/SuggestPrompt.php -@@ -42,6 +42,7 @@ - public string $hint = '', - public ?Closure $transform = null, - public string|Closure $info = '', -+ public ?string $description = null, - ) { - $this->options = $options instanceof Collection ? $options->all() : $options; - -diff -ruN a/src/TextPrompt.php b/src/TextPrompt.php ---- a/src/TextPrompt.php -+++ b/src/TextPrompt.php -@@ -19,6 +19,7 @@ - public mixed $validate = null, - public string $hint = '', - public ?Closure $transform = null, -+ public ?string $description = null, - ) { - $this->trackTypedValue($default); - } -diff -ruN a/src/TextareaPrompt.php b/src/TextareaPrompt.php ---- a/src/TextareaPrompt.php -+++ b/src/TextareaPrompt.php -@@ -31,6 +31,7 @@ - public string $hint = '', - int $rows = 5, - public ?Closure $transform = null, -+ public ?string $description = null, - ) { - $this->scroll = $rows; - -diff -ruN a/src/Themes/Default/AutoCompletePromptRenderer.php b/src/Themes/Default/AutoCompletePromptRenderer.php ---- a/src/Themes/Default/AutoCompletePromptRenderer.php -+++ b/src/Themes/Default/AutoCompletePromptRenderer.php -@@ -3,10 +3,12 @@ - namespace Laravel\Prompts\Themes\Default; - - use Laravel\Prompts\AutoCompletePrompt; -+use Laravel\Prompts\Prompt; - - class AutoCompletePromptRenderer extends Renderer - { - use Concerns\DrawsBoxes; -+ use Concerns\RendersDescription; - - /** - * Render the text prompt. -@@ -14,18 +16,21 @@ - public function __invoke(AutoCompletePrompt $prompt): string - { - $maxWidth = $prompt->terminal()->cols() - 6; -+ $hasDescription = $prompt->description && trim($prompt->description) !== ''; - - return match ($prompt->state) { - 'submit' => $this - ->box( - $this->dim($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $this->truncate($prompt->value(), $maxWidth), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->truncate($prompt->value(), $maxWidth), -+ $hasDescription ? $this->truncate($prompt->value(), $maxWidth) : '', - ), - - 'cancel' => $this - ->box( - $this->truncate($prompt->label, $prompt->terminal()->cols() - 6), -- $this->strikethrough($this->dim($this->truncate($prompt->value() ?: $prompt->placeholder, $maxWidth))), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->strikethrough($this->dim($this->truncate($prompt->value() ?: $prompt->placeholder, $maxWidth))), -+ $hasDescription ? $this->strikethrough($this->dim($this->truncate($prompt->value() ?: $prompt->placeholder, $maxWidth))) : '', - color: 'red', - ) - ->error($prompt->cancelMessage), -@@ -33,7 +38,8 @@ - 'error' => $this - ->box( - $this->truncate($prompt->label, $prompt->terminal()->cols() - 6), -- $prompt->valueWithCursor($maxWidth), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $prompt->valueWithCursor($maxWidth), -+ $hasDescription ? $prompt->valueWithCursor($maxWidth) : '', - color: 'yellow', - ) - ->warning($this->truncate($prompt->error, $prompt->terminal()->cols() - 5)), -@@ -41,7 +47,8 @@ - default => $this - ->box( - $this->cyan($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $prompt->valueWithCursor($maxWidth), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $prompt->valueWithCursor($maxWidth), -+ $hasDescription ? $prompt->valueWithCursor($maxWidth) : '', - ) - ->when( - $prompt->hint, -@@ -49,5 +56,23 @@ - fn () => $this->newLine() // Space for errors - ) - }; -+ } -+ -+ /** -+ * Calculate the description width based on input content. -+ */ -+ protected function calculateDescriptionWidth(Prompt $prompt, int $maxWidth): int -+ { -+ if (! $prompt instanceof AutoCompletePrompt) { -+ return $this->minWidth; -+ } -+ -+ $titleWidth = mb_strwidth($this->stripEscapeSequences($prompt->label)); -+ $inputWidth = max( -+ mb_strwidth($this->stripEscapeSequences($prompt->value() ?: $prompt->placeholder)), -+ 40 // minimum reasonable input width -+ ); -+ -+ return max($this->minWidth, max($titleWidth, min($inputWidth, $maxWidth))); - } - } -diff -ruN a/src/Themes/Default/Concerns/RendersDescription.php b/src/Themes/Default/Concerns/RendersDescription.php ---- a/src/Themes/Default/Concerns/RendersDescription.php -+++ b/src/Themes/Default/Concerns/RendersDescription.php -@@ -0,0 +1,33 @@ -+description || trim($prompt->description) === '') { -+ return ''; -+ } -+ -+ $targetWidth = $calculateContentWidth ? $calculateContentWidth() : $this->calculateDescriptionWidth($prompt, $maxWidth); -+ -+ return $this->mbWordwrap($prompt->description, $targetWidth, PHP_EOL); -+ } -+ -+ /** -+ * Calculate the default description width based on title and minWidth. -+ */ -+ protected function calculateDescriptionWidth(Prompt $prompt, int $maxWidth): int -+ { -+ $titleWidth = mb_strwidth($this->stripEscapeSequences($prompt->label)); -+ -+ return max($this->minWidth, min($titleWidth, $maxWidth)); -+ } -+} -diff -ruN a/src/Themes/Default/ConfirmPromptRenderer.php b/src/Themes/Default/ConfirmPromptRenderer.php ---- a/src/Themes/Default/ConfirmPromptRenderer.php -+++ b/src/Themes/Default/ConfirmPromptRenderer.php -@@ -3,27 +3,34 @@ - namespace Laravel\Prompts\Themes\Default; - - use Laravel\Prompts\ConfirmPrompt; -+use Laravel\Prompts\Prompt; - - class ConfirmPromptRenderer extends Renderer - { - use Concerns\DrawsBoxes; -+ use Concerns\RendersDescription; - - /** - * Render the confirm prompt. - */ - public function __invoke(ConfirmPrompt $prompt): string - { -+ $maxWidth = $prompt->terminal()->cols() - 6; -+ $hasDescription = $prompt->description && trim($prompt->description) !== ''; -+ - return match ($prompt->state) { - 'submit' => $this - ->box( - $this->dim($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $this->truncate($prompt->label(), $prompt->terminal()->cols() - 6) -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->truncate($prompt->label(), $prompt->terminal()->cols() - 6), -+ $hasDescription ? $this->truncate($prompt->label(), $prompt->terminal()->cols() - 6) : '', - ), - - 'cancel' => $this - ->box( - $this->truncate($prompt->label, $prompt->terminal()->cols() - 6), -- $this->renderOptions($prompt), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->renderOptions($prompt), -+ $hasDescription ? $this->renderOptions($prompt) : '', - color: 'red' - ) - ->error($prompt->cancelMessage), -@@ -31,7 +38,8 @@ - 'error' => $this - ->box( - $this->truncate($prompt->label, $prompt->terminal()->cols() - 6), -- $this->renderOptions($prompt), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->renderOptions($prompt), -+ $hasDescription ? $this->renderOptions($prompt) : '', - color: 'yellow', - ) - ->warning($this->truncate($prompt->error, $prompt->terminal()->cols() - 5)), -@@ -39,7 +47,8 @@ - default => $this - ->box( - $this->cyan($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $this->renderOptions($prompt), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->renderOptions($prompt), -+ $hasDescription ? $this->renderOptions($prompt) : '', - ) - ->when( - $prompt->hint, -@@ -47,6 +56,21 @@ - fn () => $this->newLine() // Space for errors - ), - }; -+ } -+ -+ /** -+ * Calculate the description width based on buttons. -+ */ -+ protected function calculateDescriptionWidth(Prompt $prompt, int $maxWidth): int -+ { -+ if (! $prompt instanceof ConfirmPrompt) { -+ return $this->minWidth; -+ } -+ -+ $titleWidth = mb_strwidth($this->stripEscapeSequences($prompt->label)); -+ $buttonsWidth = mb_strwidth($prompt->yes.' / '.$prompt->no) + 10; // padding for buttons -+ -+ return max($this->minWidth, max($titleWidth, min($buttonsWidth, $maxWidth))); - } - - /** -diff -ruN a/src/Themes/Default/MultiSearchPromptRenderer.php b/src/Themes/Default/MultiSearchPromptRenderer.php ---- a/src/Themes/Default/MultiSearchPromptRenderer.php -+++ b/src/Themes/Default/MultiSearchPromptRenderer.php -@@ -3,12 +3,14 @@ - namespace Laravel\Prompts\Themes\Default; - - use Laravel\Prompts\MultiSearchPrompt; -+use Laravel\Prompts\Prompt; - use Laravel\Prompts\Themes\Contracts\Scrolling; - - class MultiSearchPromptRenderer extends Renderer implements Scrolling - { - use Concerns\DrawsBoxes; - use Concerns\DrawsScrollbars; -+ use Concerns\RendersDescription; - - /** - * Render the suggest prompt. -@@ -16,18 +18,21 @@ - public function __invoke(MultiSearchPrompt $prompt): string - { - $maxWidth = $prompt->terminal()->cols() - 6; -+ $hasDescription = $prompt->description && trim($prompt->description) !== ''; - - return match ($prompt->state) { - 'submit' => $this - ->box( - $this->dim($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $this->renderSelectedOptions($prompt), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->renderSelectedOptions($prompt), -+ $hasDescription ? $this->renderSelectedOptions($prompt) : '', - ), - - 'cancel' => $this - ->box( - $this->dim($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $this->strikethrough($this->dim($this->truncate($prompt->searchValue() ?: $prompt->placeholder, $maxWidth))), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->strikethrough($this->dim($this->truncate($prompt->searchValue() ?: $prompt->placeholder, $maxWidth))), -+ $hasDescription ? $this->strikethrough($this->dim($this->truncate($prompt->searchValue() ?: $prompt->placeholder, $maxWidth))) : '', - color: 'red', - ) - ->error($prompt->cancelMessage), -@@ -35,8 +40,8 @@ - 'error' => $this - ->box( - $this->truncate($prompt->label, $prompt->terminal()->cols() - 6), -- $prompt->valueWithCursor($maxWidth), -- $this->renderOptions($prompt), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $prompt->valueWithCursor($maxWidth), -+ $hasDescription ? $prompt->valueWithCursor($maxWidth).PHP_EOL.$this->renderOptions($prompt) : $this->renderOptions($prompt), - color: 'yellow', - info: $this->getInfoText($prompt), - ) -@@ -45,8 +50,8 @@ - 'searching' => $this - ->box( - $this->cyan($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $this->valueWithCursorAndSearchIcon($prompt, $maxWidth), -- $this->renderOptions($prompt), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->valueWithCursorAndSearchIcon($prompt, $maxWidth), -+ $hasDescription ? $this->valueWithCursorAndSearchIcon($prompt, $maxWidth).PHP_EOL.$this->renderOptions($prompt) : $this->renderOptions($prompt), - info: $this->getInfoText($prompt), - ) - ->hint($prompt->hint), -@@ -54,8 +59,8 @@ - default => $this - ->box( - $this->cyan($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $prompt->valueWithCursor($maxWidth), -- $this->renderOptions($prompt), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $prompt->valueWithCursor($maxWidth), -+ $hasDescription ? $prompt->valueWithCursor($maxWidth).PHP_EOL.$this->renderOptions($prompt) : $this->renderOptions($prompt), - info: $this->getInfoText($prompt), - ) - ->when( -@@ -168,6 +173,21 @@ - $parts = array_filter([$prompt->infoText(), $selected]); - - return implode(' · ', $parts); -+ } -+ -+ /** -+ * Calculate the width for description text. -+ */ -+ protected function calculateDescriptionWidth(Prompt $prompt, int $maxWidth): int -+ { -+ if (! $prompt instanceof MultiSearchPrompt) { -+ return $maxWidth; -+ } -+ -+ $titleWidth = mb_strwidth($this->stripEscapeSequences($prompt->label)); -+ $optionsWidth = $this->longest($prompt->matches()); -+ -+ return max($this->minWidth, max($titleWidth, $optionsWidth)); - } - - /** -diff -ruN a/src/Themes/Default/MultiSelectPromptRenderer.php b/src/Themes/Default/MultiSelectPromptRenderer.php ---- a/src/Themes/Default/MultiSelectPromptRenderer.php -+++ b/src/Themes/Default/MultiSelectPromptRenderer.php -@@ -3,29 +3,36 @@ - namespace Laravel\Prompts\Themes\Default; - - use Laravel\Prompts\MultiSelectPrompt; -+use Laravel\Prompts\Prompt; - use Laravel\Prompts\Themes\Contracts\Scrolling; - - class MultiSelectPromptRenderer extends Renderer implements Scrolling - { - use Concerns\DrawsBoxes; - use Concerns\DrawsScrollbars; -+ use Concerns\RendersDescription; - - /** - * Render the multiselect prompt. - */ - public function __invoke(MultiSelectPrompt $prompt): string - { -+ $maxWidth = $prompt->terminal()->cols() - 6; -+ $hasDescription = $prompt->description && trim($prompt->description) !== ''; -+ - return match ($prompt->state) { - 'submit' => $this - ->box( - $this->dim($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $this->renderSelectedOptions($prompt) -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->renderSelectedOptions($prompt), -+ $hasDescription ? $this->renderSelectedOptions($prompt) : '', - ), - - 'cancel' => $this - ->box( - $this->truncate($prompt->label, $prompt->terminal()->cols() - 6), -- $this->renderOptions($prompt), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->renderOptions($prompt), -+ $hasDescription ? $this->renderOptions($prompt) : '', - color: 'red', - ) - ->error($prompt->cancelMessage), -@@ -33,7 +40,8 @@ - 'error' => $this - ->box( - $this->truncate($prompt->label, $prompt->terminal()->cols() - 6), -- $this->renderOptions($prompt), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->renderOptions($prompt), -+ $hasDescription ? $this->renderOptions($prompt) : '', - color: 'yellow', - info: count($prompt->options) > $prompt->scroll ? (count($prompt->value()).' selected') : '', - ) -@@ -42,7 +50,8 @@ - default => $this - ->box( - $this->cyan($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $this->renderOptions($prompt), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->renderOptions($prompt), -+ $hasDescription ? $this->renderOptions($prompt) : '', - info: $this->getInfoText($prompt), - ) - ->when( -@@ -51,6 +60,21 @@ - fn () => $this->newLine() // Space for errors - ), - }; -+ } -+ -+ /** -+ * Calculate the description width based on options. -+ */ -+ protected function calculateDescriptionWidth(Prompt $prompt, int $maxWidth): int -+ { -+ if (! $prompt instanceof MultiSelectPrompt) { -+ return $this->minWidth; -+ } -+ -+ $optionsWidth = min($this->longest($prompt->options, padding: 6), $prompt->terminal()->cols() - 6); -+ $titleWidth = mb_strwidth($this->stripEscapeSequences($prompt->label)); -+ -+ return max($this->minWidth, max($titleWidth, $optionsWidth)); - } - - /** -diff -ruN a/src/Themes/Default/NumberPromptRenderer.php b/src/Themes/Default/NumberPromptRenderer.php ---- a/src/Themes/Default/NumberPromptRenderer.php -+++ b/src/Themes/Default/NumberPromptRenderer.php -@@ -3,10 +3,12 @@ - namespace Laravel\Prompts\Themes\Default; - - use Laravel\Prompts\NumberPrompt; -+use Laravel\Prompts\Prompt; - - class NumberPromptRenderer extends Renderer - { - use Concerns\DrawsBoxes; -+ use Concerns\RendersDescription; - - protected string $upArrow = '▲'; - -@@ -18,18 +20,21 @@ - public function __invoke(NumberPrompt $prompt): string - { - $maxWidth = $prompt->terminal()->cols() - 6; -+ $hasDescription = $prompt->description && trim($prompt->description) !== ''; - - return match ($prompt->state) { - 'submit' => $this - ->box( - $this->dim($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $this->truncate((string) $prompt->value(), $maxWidth), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->truncate((string) $prompt->value(), $maxWidth), -+ $hasDescription ? $this->truncate((string) $prompt->value(), $maxWidth) : '', - ), - - 'cancel' => $this - ->box( - $this->truncate($prompt->label, $prompt->terminal()->cols() - 6), -- $this->strikethrough($this->dim($this->truncate((string) $prompt->value() ?: $prompt->placeholder, $maxWidth))), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->strikethrough($this->dim($this->truncate((string) $prompt->value() ?: $prompt->placeholder, $maxWidth))), -+ $hasDescription ? $this->strikethrough($this->dim($this->truncate((string) $prompt->value() ?: $prompt->placeholder, $maxWidth))) : '', - color: 'red', - ) - ->error('Cancelled.'), -@@ -37,7 +42,8 @@ - 'error' => $this - ->box( - $this->truncate($prompt->label, $prompt->terminal()->cols() - 6), -- $this->withArrows($prompt, $prompt->valueWithCursor($maxWidth), 'yellow'), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->withArrows($prompt, $prompt->valueWithCursor($maxWidth), 'yellow'), -+ $hasDescription ? $this->withArrows($prompt, $prompt->valueWithCursor($maxWidth), 'yellow') : '', - color: 'yellow', - ) - ->warning($this->truncate($prompt->error, $prompt->terminal()->cols() - 5)), -@@ -45,7 +51,8 @@ - default => $this - ->box( - $this->cyan($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $this->withArrows($prompt, $prompt->valueWithCursor($maxWidth)), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->withArrows($prompt, $prompt->valueWithCursor($maxWidth)), -+ $hasDescription ? $this->withArrows($prompt, $prompt->valueWithCursor($maxWidth)) : '', - ) - ->when( - $prompt->hint, -@@ -53,6 +60,24 @@ - fn () => $this->newLine() // Space for errors - ) - }; -+ } -+ -+ /** -+ * Calculate the description width based on input content. -+ */ -+ protected function calculateDescriptionWidth(Prompt $prompt, int $maxWidth): int -+ { -+ if (! $prompt instanceof NumberPrompt) { -+ return $this->minWidth; -+ } -+ -+ $titleWidth = mb_strwidth($this->stripEscapeSequences($prompt->label)); -+ $inputWidth = max( -+ mb_strwidth($this->stripEscapeSequences((string) $prompt->value() ?: $prompt->placeholder)), -+ 40 // minimum reasonable input width -+ ); -+ -+ return max($this->minWidth, max($titleWidth, min($inputWidth, $maxWidth))); - } - - protected function withArrows(NumberPrompt $prompt, int|string $value, ?string $color = null): string -diff -ruN a/src/Themes/Default/PasswordPromptRenderer.php b/src/Themes/Default/PasswordPromptRenderer.php ---- a/src/Themes/Default/PasswordPromptRenderer.php -+++ b/src/Themes/Default/PasswordPromptRenderer.php -@@ -3,10 +3,12 @@ - namespace Laravel\Prompts\Themes\Default; - - use Laravel\Prompts\PasswordPrompt; -+use Laravel\Prompts\Prompt; - - class PasswordPromptRenderer extends Renderer - { - use Concerns\DrawsBoxes; -+ use Concerns\RendersDescription; - - /** - * Render the password prompt. -@@ -14,18 +16,21 @@ - public function __invoke(PasswordPrompt $prompt): string - { - $maxWidth = $prompt->terminal()->cols() - 6; -+ $hasDescription = $prompt->description && trim($prompt->description) !== ''; - - return match ($prompt->state) { - 'submit' => $this - ->box( - $this->dim($prompt->label), -- $this->truncate($prompt->masked(), $maxWidth), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->truncate($prompt->masked(), $maxWidth), -+ $hasDescription ? $this->truncate($prompt->masked(), $maxWidth) : '', - ), - - 'cancel' => $this - ->box( - $this->truncate($prompt->label, $prompt->terminal()->cols() - 6), -- $this->strikethrough($this->dim($this->truncate($prompt->masked() ?: $prompt->placeholder, $maxWidth))), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->strikethrough($this->dim($this->truncate($prompt->masked() ?: $prompt->placeholder, $maxWidth))), -+ $hasDescription ? $this->strikethrough($this->dim($this->truncate($prompt->masked() ?: $prompt->placeholder, $maxWidth))) : '', - color: 'red', - ) - ->error($prompt->cancelMessage), -@@ -33,7 +38,8 @@ - 'error' => $this - ->box( - $this->dim($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $prompt->maskedWithCursor($maxWidth), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $prompt->maskedWithCursor($maxWidth), -+ $hasDescription ? $prompt->maskedWithCursor($maxWidth) : '', - color: 'yellow', - ) - ->warning($this->truncate($prompt->error, $prompt->terminal()->cols() - 5)), -@@ -41,7 +47,8 @@ - default => $this - ->box( - $this->cyan($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $prompt->maskedWithCursor($maxWidth), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $prompt->maskedWithCursor($maxWidth), -+ $hasDescription ? $prompt->maskedWithCursor($maxWidth) : '', - ) - ->when( - $prompt->hint, -@@ -49,5 +56,23 @@ - fn () => $this->newLine() // Space for errors - ), - }; -+ } -+ -+ /** -+ * Calculate the description width based on password input content. -+ */ -+ protected function calculateDescriptionWidth(Prompt $prompt, int $maxWidth): int -+ { -+ if (! $prompt instanceof PasswordPrompt) { -+ return $this->minWidth; -+ } -+ -+ $titleWidth = mb_strwidth($this->stripEscapeSequences($prompt->label)); -+ $inputWidth = max( -+ mb_strwidth($this->stripEscapeSequences($prompt->masked() ?: $prompt->placeholder)), -+ 40 // minimum reasonable input width -+ ); -+ -+ return max($this->minWidth, max($titleWidth, min($inputWidth, $maxWidth))); - } - } -diff -ruN a/src/Themes/Default/SearchPromptRenderer.php b/src/Themes/Default/SearchPromptRenderer.php ---- a/src/Themes/Default/SearchPromptRenderer.php -+++ b/src/Themes/Default/SearchPromptRenderer.php -@@ -2,6 +2,7 @@ - - namespace Laravel\Prompts\Themes\Default; - -+use Laravel\Prompts\Prompt; - use Laravel\Prompts\SearchPrompt; - use Laravel\Prompts\Themes\Contracts\Scrolling; - -@@ -9,6 +10,7 @@ - { - use Concerns\DrawsBoxes; - use Concerns\DrawsScrollbars; -+ use Concerns\RendersDescription; - - /** - * Render the suggest prompt. -@@ -16,18 +18,21 @@ - public function __invoke(SearchPrompt $prompt): string - { - $maxWidth = $prompt->terminal()->cols() - 6; -+ $hasDescription = $prompt->description && trim($prompt->description) !== ''; - - return match ($prompt->state) { - 'submit' => $this - ->box( - $this->dim($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $this->truncate($prompt->label(), $maxWidth), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->truncate($prompt->label(), $maxWidth), -+ $hasDescription ? $this->truncate($prompt->label(), $maxWidth) : '', - ), - - 'cancel' => $this - ->box( - $this->dim($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $this->strikethrough($this->dim($this->truncate($prompt->searchValue() ?: $prompt->placeholder, $maxWidth))), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->strikethrough($this->dim($this->truncate($prompt->searchValue() ?: $prompt->placeholder, $maxWidth))), -+ $hasDescription ? $this->strikethrough($this->dim($this->truncate($prompt->searchValue() ?: $prompt->placeholder, $maxWidth))) : '', - color: 'red', - ) - ->error($prompt->cancelMessage), -@@ -35,8 +40,8 @@ - 'error' => $this - ->box( - $this->truncate($prompt->label, $prompt->terminal()->cols() - 6), -- $prompt->valueWithCursor($maxWidth), -- $this->renderOptions($prompt), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $prompt->valueWithCursor($maxWidth), -+ $hasDescription ? $prompt->valueWithCursor($maxWidth).PHP_EOL.$this->renderOptions($prompt) : $this->renderOptions($prompt), - color: 'yellow', - ) - ->warning($this->truncate($prompt->error, $prompt->terminal()->cols() - 5)), -@@ -44,8 +49,8 @@ - 'searching' => $this - ->box( - $this->cyan($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $this->valueWithCursorAndSearchIcon($prompt, $maxWidth), -- $this->renderOptions($prompt), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->valueWithCursorAndSearchIcon($prompt, $maxWidth), -+ $hasDescription ? $this->valueWithCursorAndSearchIcon($prompt, $maxWidth).PHP_EOL.$this->renderOptions($prompt) : $this->renderOptions($prompt), - info: $prompt->infoText(), - ) - ->hint($prompt->hint), -@@ -53,8 +58,8 @@ - default => $this - ->box( - $this->cyan($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $prompt->valueWithCursor($maxWidth), -- $this->renderOptions($prompt), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $prompt->valueWithCursor($maxWidth), -+ $hasDescription ? $prompt->valueWithCursor($maxWidth).PHP_EOL.$this->renderOptions($prompt) : $this->renderOptions($prompt), - info: $prompt->infoText(), - ) - ->when( -@@ -123,6 +128,21 @@ - count($prompt->matches()), - min($this->longest($prompt->matches(), padding: 4), $prompt->terminal()->cols() - 6) - )); -+ } -+ -+ /** -+ * Calculate the width for description text. -+ */ -+ protected function calculateDescriptionWidth(Prompt $prompt, int $maxWidth): int -+ { -+ if (! $prompt instanceof SearchPrompt) { -+ return $this->minWidth; -+ } -+ -+ $titleWidth = mb_strwidth($this->stripEscapeSequences($prompt->label)); -+ $optionsWidth = $this->longest($prompt->matches()); -+ -+ return max($this->minWidth, max($titleWidth, $optionsWidth)); - } - - /** -diff -ruN a/src/Themes/Default/SelectPromptRenderer.php b/src/Themes/Default/SelectPromptRenderer.php ---- a/src/Themes/Default/SelectPromptRenderer.php -+++ b/src/Themes/Default/SelectPromptRenderer.php -@@ -2,6 +2,7 @@ - - namespace Laravel\Prompts\Themes\Default; - -+use Laravel\Prompts\Prompt; - use Laravel\Prompts\SelectPrompt; - use Laravel\Prompts\Themes\Contracts\Scrolling; - -@@ -9,6 +10,7 @@ - { - use Concerns\DrawsBoxes; - use Concerns\DrawsScrollbars; -+ use Concerns\RendersDescription; - - /** - * Render the select prompt. -@@ -17,17 +19,21 @@ - { - $maxWidth = $prompt->terminal()->cols() - 6; - -+ $hasDescription = $prompt->description && trim($prompt->description) !== ''; -+ - return match ($prompt->state) { - 'submit' => $this - ->box( - $this->dim($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $this->truncate($prompt->label(), $maxWidth), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->truncate($prompt->label(), $maxWidth), -+ $hasDescription ? $this->truncate($prompt->label(), $maxWidth) : '', - ), - - 'cancel' => $this - ->box( - $this->truncate($prompt->label, $prompt->terminal()->cols() - 6), -- $this->renderOptions($prompt), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->renderOptions($prompt), -+ $hasDescription ? $this->renderOptions($prompt) : '', - color: 'red', - ) - ->error($prompt->cancelMessage), -@@ -35,7 +41,8 @@ - 'error' => $this - ->box( - $this->truncate($prompt->label, $prompt->terminal()->cols() - 6), -- $this->renderOptions($prompt), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->renderOptions($prompt), -+ $hasDescription ? $this->renderOptions($prompt) : '', - color: 'yellow', - ) - ->warning($this->truncate($prompt->error, $prompt->terminal()->cols() - 5)), -@@ -43,7 +50,8 @@ - default => $this - ->box( - $this->cyan($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $this->renderOptions($prompt), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->renderOptions($prompt), -+ $hasDescription ? $this->renderOptions($prompt) : '', - info: $prompt->infoText(), - ) - ->when( -@@ -52,6 +60,21 @@ - fn () => $this->newLine() // Space for errors - ), - }; -+ } -+ -+ /** -+ * Calculate the description width based on options. -+ */ -+ protected function calculateDescriptionWidth(Prompt $prompt, int $maxWidth): int -+ { -+ if (! $prompt instanceof SelectPrompt) { -+ return $maxWidth; -+ } -+ -+ $optionsWidth = min($this->longest($prompt->options, padding: 6), $prompt->terminal()->cols() - 6); -+ $titleWidth = mb_strwidth($this->stripEscapeSequences($prompt->label)); -+ -+ return max($this->minWidth, max($titleWidth, $optionsWidth)); - } - - /** -diff -ruN a/src/Themes/Default/SuggestPromptRenderer.php b/src/Themes/Default/SuggestPromptRenderer.php ---- a/src/Themes/Default/SuggestPromptRenderer.php -+++ b/src/Themes/Default/SuggestPromptRenderer.php -@@ -2,6 +2,7 @@ - - namespace Laravel\Prompts\Themes\Default; - -+use Laravel\Prompts\Prompt; - use Laravel\Prompts\SuggestPrompt; - use Laravel\Prompts\Themes\Contracts\Scrolling; - -@@ -9,6 +10,7 @@ - { - use Concerns\DrawsBoxes; - use Concerns\DrawsScrollbars; -+ use Concerns\RendersDescription; - - /** - * Render the suggest prompt. -@@ -16,18 +18,21 @@ - public function __invoke(SuggestPrompt $prompt): string - { - $maxWidth = $prompt->terminal()->cols() - 6; -+ $hasDescription = $prompt->description && trim($prompt->description) !== ''; - - return match ($prompt->state) { - 'submit' => $this - ->box( - $this->dim($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $this->truncate($prompt->value(), $maxWidth), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->truncate($prompt->value(), $maxWidth), -+ $hasDescription ? $this->truncate($prompt->value(), $maxWidth) : '', - ), - - 'cancel' => $this - ->box( - $this->dim($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $this->strikethrough($this->dim($this->truncate($prompt->value() ?: $prompt->placeholder, $maxWidth))), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->strikethrough($this->dim($this->truncate($prompt->value() ?: $prompt->placeholder, $maxWidth))), -+ $hasDescription ? $this->strikethrough($this->dim($this->truncate($prompt->value() ?: $prompt->placeholder, $maxWidth))) : '', - color: 'red', - ) - ->error($prompt->cancelMessage), -@@ -35,8 +40,8 @@ - 'error' => $this - ->box( - $this->truncate($prompt->label, $prompt->terminal()->cols() - 6), -- $this->valueWithCursorAndArrow($prompt, $maxWidth), -- $this->renderOptions($prompt), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->valueWithCursorAndArrow($prompt, $maxWidth), -+ $hasDescription ? $this->valueWithCursorAndArrow($prompt, $maxWidth).PHP_EOL.$this->renderOptions($prompt) : $this->renderOptions($prompt), - color: 'yellow', - ) - ->warning($this->truncate($prompt->error, $prompt->terminal()->cols() - 5)), -@@ -44,8 +49,8 @@ - default => $this - ->box( - $this->cyan($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $this->valueWithCursorAndArrow($prompt, $maxWidth), -- $this->renderOptions($prompt), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->valueWithCursorAndArrow($prompt, $maxWidth), -+ $hasDescription ? $this->valueWithCursorAndArrow($prompt, $maxWidth).PHP_EOL.$this->renderOptions($prompt) : $this->renderOptions($prompt), - info: $prompt->infoText(), - ) - ->when( -@@ -112,6 +117,25 @@ - min($this->longest($prompt->matches(), padding: 4), $prompt->terminal()->cols() - 6), - $prompt->state === 'cancel' ? 'dim' : 'cyan' - )); -+ } -+ -+ /** -+ * Calculate the width for description text. -+ */ -+ protected function calculateDescriptionWidth(Prompt $prompt, int $maxWidth): int -+ { -+ if (! $prompt instanceof SuggestPrompt) { -+ return $this->minWidth; -+ } -+ -+ $titleWidth = mb_strwidth($this->stripEscapeSequences($prompt->label)); -+ $inputWidth = max( -+ mb_strwidth($prompt->placeholder), -+ mb_strwidth($prompt->default), -+ $this->longest($prompt->matches()) -+ ); -+ -+ return max($this->minWidth, max($titleWidth, min($inputWidth + 4, $maxWidth))); - } - - /** -diff -ruN a/src/Themes/Default/TextPromptRenderer.php b/src/Themes/Default/TextPromptRenderer.php ---- a/src/Themes/Default/TextPromptRenderer.php -+++ b/src/Themes/Default/TextPromptRenderer.php -@@ -2,11 +2,13 @@ - - namespace Laravel\Prompts\Themes\Default; - -+use Laravel\Prompts\Prompt; - use Laravel\Prompts\TextPrompt; - - class TextPromptRenderer extends Renderer - { - use Concerns\DrawsBoxes; -+ use Concerns\RendersDescription; - - /** - * Render the text prompt. -@@ -14,18 +16,21 @@ - public function __invoke(TextPrompt $prompt): string - { - $maxWidth = $prompt->terminal()->cols() - 6; -+ $hasDescription = $prompt->description && trim($prompt->description) !== ''; - - return match ($prompt->state) { - 'submit' => $this - ->box( - $this->dim($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $this->truncate($prompt->value(), $maxWidth), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->truncate($prompt->value(), $maxWidth), -+ $hasDescription ? $this->truncate($prompt->value(), $maxWidth) : '', - ), - - 'cancel' => $this - ->box( - $this->truncate($prompt->label, $prompt->terminal()->cols() - 6), -- $this->strikethrough($this->dim($this->truncate($prompt->value() ?: $prompt->placeholder, $maxWidth))), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->strikethrough($this->dim($this->truncate($prompt->value() ?: $prompt->placeholder, $maxWidth))), -+ $hasDescription ? $this->strikethrough($this->dim($this->truncate($prompt->value() ?: $prompt->placeholder, $maxWidth))) : '', - color: 'red', - ) - ->error($prompt->cancelMessage), -@@ -33,7 +38,8 @@ - 'error' => $this - ->box( - $this->truncate($prompt->label, $prompt->terminal()->cols() - 6), -- $prompt->valueWithCursor($maxWidth), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $prompt->valueWithCursor($maxWidth), -+ $hasDescription ? $prompt->valueWithCursor($maxWidth) : '', - color: 'yellow', - ) - ->warning($this->truncate($prompt->error, $prompt->terminal()->cols() - 5)), -@@ -41,7 +47,8 @@ - default => $this - ->box( - $this->cyan($this->truncate($prompt->label, $prompt->terminal()->cols() - 6)), -- $prompt->valueWithCursor($maxWidth), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $prompt->valueWithCursor($maxWidth), -+ $hasDescription ? $prompt->valueWithCursor($maxWidth) : '', - ) - ->when( - $prompt->hint, -@@ -49,5 +56,23 @@ - fn () => $this->newLine() // Space for errors - ) - }; -+ } -+ -+ /** -+ * Calculate the description width based on input content. -+ */ -+ protected function calculateDescriptionWidth(Prompt $prompt, int $maxWidth): int -+ { -+ if (! $prompt instanceof TextPrompt) { -+ return $this->minWidth; -+ } -+ -+ $titleWidth = mb_strwidth($this->stripEscapeSequences($prompt->label)); -+ $inputWidth = max( -+ mb_strwidth($this->stripEscapeSequences($prompt->value() ?: $prompt->placeholder)), -+ 40 // minimum reasonable input width -+ ); -+ -+ return max($this->minWidth, max($titleWidth, min($inputWidth, $maxWidth))); - } - } -diff -ruN a/src/Themes/Default/TextareaPromptRenderer.php b/src/Themes/Default/TextareaPromptRenderer.php ---- a/src/Themes/Default/TextareaPromptRenderer.php -+++ b/src/Themes/Default/TextareaPromptRenderer.php -@@ -2,6 +2,7 @@ - - namespace Laravel\Prompts\Themes\Default; - -+use Laravel\Prompts\Prompt; - use Laravel\Prompts\TextareaPrompt; - use Laravel\Prompts\Themes\Contracts\Scrolling; - -@@ -9,6 +10,7 @@ - { - use Concerns\DrawsBoxes; - use Concerns\DrawsScrollbars; -+ use Concerns\RendersDescription; - - /** - * Render the textarea prompt. -@@ -16,18 +18,22 @@ - public function __invoke(TextareaPrompt $prompt): string - { - $prompt->width = $prompt->terminal()->cols() - 8; -+ $maxWidth = $prompt->terminal()->cols() - 6; -+ $hasDescription = $prompt->description && trim($prompt->description) !== ''; - - return match ($prompt->state) { - 'submit' => $this - ->box( - $this->dim($this->truncate($prompt->label, $prompt->width)), -- implode(PHP_EOL, $prompt->lines()), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : implode(PHP_EOL, $prompt->lines()), -+ $hasDescription ? implode(PHP_EOL, $prompt->lines()) : '', - ), - - 'cancel' => $this - ->box( - $this->truncate($prompt->label, $prompt->width), -- implode(PHP_EOL, array_map(fn ($line) => $this->strikethrough($this->dim($line)), $prompt->lines())), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : implode(PHP_EOL, array_map(fn ($line) => $this->strikethrough($this->dim($line)), $prompt->lines())), -+ $hasDescription ? implode(PHP_EOL, array_map(fn ($line) => $this->strikethrough($this->dim($line)), $prompt->lines())) : '', - color: 'red', - ) - ->error($prompt->cancelMessage), -@@ -35,7 +41,8 @@ - 'error' => $this - ->box( - $this->truncate($prompt->label, $prompt->width), -- $this->renderText($prompt), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->renderText($prompt), -+ $hasDescription ? $this->renderText($prompt) : '', - color: 'yellow', - info: 'Ctrl+D to submit' - ) -@@ -44,7 +51,8 @@ - default => $this - ->box( - $this->cyan($this->truncate($prompt->label, $prompt->width)), -- $this->renderText($prompt), -+ $hasDescription ? $this->renderDescription($prompt, $maxWidth, fn () => $this->calculateDescriptionWidth($prompt, $maxWidth)) : $this->renderText($prompt), -+ $hasDescription ? $this->renderText($prompt) : '', - info: 'Ctrl+D to submit' - ) - ->when( -@@ -53,6 +61,21 @@ - fn () => $this->newLine() // Space for errors - ) - }; -+ } -+ -+ /** -+ * Calculate the description width based on textarea content. -+ */ -+ protected function calculateDescriptionWidth(Prompt $prompt, int $maxWidth): int -+ { -+ if (! $prompt instanceof TextareaPrompt) { -+ return $this->minWidth; -+ } -+ -+ $titleWidth = mb_strwidth($this->stripEscapeSequences($prompt->label)); -+ $textareaWidth = min($prompt->width, $maxWidth); -+ -+ return max($this->minWidth, max($titleWidth, $textareaWidth)); - } - - /** -diff -ruN a/src/helpers.php b/src/helpers.php ---- a/src/helpers.php -+++ b/src/helpers.php -@@ -17,6 +17,7 @@ - mixed $validate = null, - string $hint = '', - ?Closure $transform = null, -+ ?string $description = null, - ): string { - return (new TextPrompt(...get_defined_vars()))->prompt(); - } -@@ -37,6 +38,7 @@ - mixed $validate = null, - string $hint = '', - ?Closure $transform = null, -+ ?string $description = null, - ): string { - return (new AutoCompletePrompt(...get_defined_vars()))->prompt(); - } -@@ -46,7 +48,7 @@ - /** - * Prompt the user for number input. - */ -- function number(string $label, string $placeholder = '', string $default = '', bool|string $required = false, mixed $validate = null, string $hint = '', ?int $min = null, ?int $max = null, ?int $step = null): int|string -+ function number(string $label, string $placeholder = '', string $default = '', bool|string $required = false, mixed $validate = null, string $hint = '', ?int $min = null, ?int $max = null, ?int $step = null, ?string $description = null): int|string - { - return (new NumberPrompt(...get_defined_vars()))->prompt(); - } -@@ -65,6 +67,7 @@ - string $hint = '', - int $rows = 5, - ?Closure $transform = null, -+ ?string $description = null, - ): string { - return (new TextareaPrompt(...get_defined_vars()))->prompt(); - } -@@ -81,6 +84,7 @@ - mixed $validate = null, - string $hint = '', - ?Closure $transform = null, -+ ?string $description = null, - ): string { - return (new PasswordPrompt(...get_defined_vars()))->prompt(); - } -@@ -103,6 +107,7 @@ - bool|string $required = true, - ?Closure $transform = null, - string|Closure $info = '', -+ ?string $description = null, - ): int|string { - return (new SelectPrompt(...get_defined_vars()))->prompt(); - } -@@ -126,6 +131,7 @@ - string $hint = 'Use the space bar to select options.', - ?Closure $transform = null, - string|Closure $info = '', -+ ?string $description = null, - ): array { - return (new MultiSelectPrompt(...get_defined_vars()))->prompt(); - } -@@ -144,6 +150,7 @@ - mixed $validate = null, - string $hint = '', - ?Closure $transform = null, -+ ?string $description = null, - ): bool { - return (new ConfirmPrompt(...get_defined_vars()))->prompt(); - } -@@ -186,6 +193,7 @@ - string $hint = '', - ?Closure $transform = null, - string|Closure $info = '', -+ ?string $description = null, - ): string { - return (new SuggestPrompt(...get_defined_vars()))->prompt(); - } -@@ -208,6 +216,7 @@ - bool|string $required = true, - ?Closure $transform = null, - string|Closure $info = '', -+ ?string $description = null, - ): int|string { - return (new SearchPrompt(...get_defined_vars()))->prompt(); - } -@@ -230,6 +239,7 @@ - string $hint = 'Use the space bar to select options.', - ?Closure $transform = null, - string|Closure $info = '', -+ ?string $description = null, - ): array { - return (new MultiSearchPrompt(...get_defined_vars()))->prompt(); - } diff --git a/.vortex/installer/patches/reroot-patch.php b/.vortex/installer/patches/reroot-patch.php deleted file mode 100644 index 0ad577c071..0000000000 --- a/.vortex/installer/patches/reroot-patch.php +++ /dev/null @@ -1,86 +0,0 @@ - - * - * Example: - * php .vortex/installer/patches/reroot-patch.php \ - * /tmp/raw.patch \ - * .vortex/installer/patches/laravel-prompts-fork-parity.patch \ - * /tmp/prompts-upstream/ \ - * /tmp/prompts-fork/ - * - * The prefixes must end with a slash and correspond to the two directories - * passed to `diff -ruN` when generating the source patch. - */ - -if ($argc !== 5) { - fwrite(STDERR, "Usage: php reroot-patch.php \n"); - exit(2); -} - -[$_, $source, $target, $upstream_prefix, $fork_prefix] = $argv; - -if (!str_ends_with($upstream_prefix, '/') || !str_ends_with($fork_prefix, '/')) { - fwrite(STDERR, "Prefix arguments must end with a slash.\n"); - exit(2); -} - -$lines = file($source, FILE_IGNORE_NEW_LINES); -if ($lines === FALSE) { - fwrite(STDERR, sprintf("Failed to read source patch: %s\n", $source)); - exit(1); -} - -$out = []; - -foreach ($lines as $line) { - if (str_starts_with($line, 'diff -ruN ')) { - $line = str_replace($upstream_prefix, 'a/', $line); - $line = str_replace($fork_prefix, 'b/', $line); - $out[] = $line; - - continue; - } - - if (str_starts_with($line, '--- ')) { - $path = substr($line, 4); - $tab_pos = strpos($path, "\t"); - if ($tab_pos !== FALSE) { - $path = substr($path, 0, $tab_pos); - } - $path = str_replace($upstream_prefix, 'a/', $path); - $out[] = '--- ' . $path; - - continue; - } - - if (str_starts_with($line, '+++ ')) { - $path = substr($line, 4); - $tab_pos = strpos($path, "\t"); - if ($tab_pos !== FALSE) { - $path = substr($path, 0, $tab_pos); - } - $path = str_replace($fork_prefix, 'b/', $path); - $out[] = '+++ ' . $path; - - continue; - } - - $out[] = $line; -} - -$result = implode("\n", $out) . "\n"; - -if (file_put_contents($target, $result) === FALSE) { - fwrite(STDERR, sprintf("Failed to write target patch: %s\n", $target)); - exit(1); -} - -fwrite(STDOUT, sprintf("Wrote %d lines to %s\n", count($out), $target)); diff --git a/.vortex/installer/playground/task-streaming.php b/.vortex/installer/playground/task-streaming.php index 3370fd29ab..c56aa47932 100644 --- a/.vortex/installer/playground/task-streaming.php +++ b/.vortex/installer/playground/task-streaming.php @@ -129,23 +129,25 @@ Task::action( label: 'Streaming task with nested spinner', action: function () { - // The nested command uses spin() which outputs cursor control sequences. - \Laravel\Prompts\spin( - function () { + // The nested non-streaming task outputs cursor control sequences. + Task::action( + label: 'Nested spinner task...', + action: function () { usleep(300000); usleep(300000); usleep(300000); + return true; }, - 'Nested spinner task...' ); echo "AFTER SPINNER 1\n"; - \Laravel\Prompts\spin( - function () { + Task::action( + label: 'Another nested spinner task...', + action: function () { usleep(1000000); usleep(1000000); + return true; }, - 'Another nested spinner task...' ); echo "AFTER SPINNER 2\n"; diff --git a/.vortex/installer/playground/tui.php b/.vortex/installer/playground/tui.php index 54bca3b7e2..d036f08dfa 100755 --- a/.vortex/installer/playground/tui.php +++ b/.vortex/installer/playground/tui.php @@ -108,7 +108,7 @@ Tui::box("This is content inside a box.\nIt can have multiple lines.", "Box Title"); echo PHP_EOL; -// Info/Note/Error (Laravel Prompts styles). +// Info/Note/Error. echo "--- Messages ---" . PHP_EOL; Tui::info("This is an info message"); Tui::note("This is a note message"); diff --git a/.vortex/installer/src/Command/InstallCommand.php b/.vortex/installer/src/Command/InstallCommand.php index ba1082b0a3..101bc8ab8c 100644 --- a/.vortex/installer/src/Command/InstallCommand.php +++ b/.vortex/installer/src/Command/InstallCommand.php @@ -199,7 +199,11 @@ protected function execute(InputInterface $input, OutputInterface $output): int Tui::line(Tui::dim('Press any key to continue...')); Tui::getChar(); - $this->promptManager->runPrompts(); + if (!$this->promptManager->runPrompts()) { + Tui::info('Aborting project installation. No files were changed.'); + + return Command::FAILURE; + } Tui::list($this->promptManager->getResponsesSummary(), 'Installation summary'); diff --git a/.vortex/installer/src/Prompts/PromptManager.php b/.vortex/installer/src/Prompts/PromptManager.php index b1986f3730..f519d0a286 100644 --- a/.vortex/installer/src/Prompts/PromptManager.php +++ b/.vortex/installer/src/Prompts/PromptManager.php @@ -53,10 +53,7 @@ use DrevOps\VortexInstaller\Utils\Converter; use DrevOps\VortexInstaller\Utils\File; use DrevOps\VortexInstaller\Utils\Tui; -use Laravel\Prompts\FormBuilder; -use Laravel\Prompts\FormStep; use Symfony\Component\Console\Output\OutputInterface; -use function Laravel\Prompts\form; /** * Centralized place for providing prompts and their processing. @@ -66,7 +63,7 @@ class PromptManager { /** * Total number of top-level responses. * - * Counted from the form in runPrompts() and used to display the progress of + * Counted from the steps in runPrompts() and used to display the progress of * the prompts. */ protected int $totalResponses = 0; @@ -125,152 +122,45 @@ public function __construct( * * In non-interactive mode, each prompt returns its default, which includes * values discovered from the existing codebase. + * + * @return bool + * TRUE when every prompt was answered, FALSE when the user cancelled one. */ - public function runPrompts(): void { + public function runPrompts(): bool { // Quiet the TUI output in non-interactive mode; the original verbosity is - // restored after the form completes. + // restored after the prompts complete. $original_verbosity = Tui::output()->getVerbosity(); if ($this->config->getNoInteraction()) { Tui::output()->setVerbosity(OutputInterface::VERBOSITY_QUIET); } - // @formatter:off - // phpcs:disable Generic.Functions.FunctionCallArgumentSpacing.TooMuchSpaceAfterComma - // phpcs:disable Drupal.WhiteSpace.Comma.TooManySpaces - // phpcs:disable Drupal.WhiteSpace.ObjectOperatorIndent.Indent - // phpcs:disable Drupal.WhiteSpace.ScopeIndent.IncorrectExact - $form = form() - ->intro('General information') - ->add(fn($r, $pr, $n): mixed => $this->prompt(Name::class), Name::id()) - ->add(fn(array $r, $pr, $n): mixed => $this->prompt(MachineName::class, $r), MachineName::id()) - ->add(fn(array $r, $pr, $n): mixed => $this->prompt(Org::class, $r), Org::id()) - ->add(fn(array $r, $pr, $n): mixed => $this->prompt(OrgMachineName::class, $r), OrgMachineName::id()) - ->add(fn(array $r, $pr, $n): mixed => $this->prompt(Domain::class, $r), Domain::id()) - - ->intro('Drupal') - ->addIf( - fn(array $r): bool => $this->handler(Starter::id())->shouldRun($r), - fn(array $r, $pr, $n): mixed => $this->prompt(Starter::class, $r), - Starter::id() - ) - ->add( - fn(array $r, $pr, $n): string => $this->resolveOrPrompt(Profile::id(), $r, fn(): mixed => $this->prompt(Profile::class)), - Profile::id() - ) - ->addIf( - fn(array $r): bool => $this->handler(ProfileCustom::id())->shouldRun($r), - fn($r, $pr, $n): mixed => $this->prompt(ProfileCustom::class), - ProfileCustom::id() - ) - ->add(fn(array $r, $pr, $n): mixed => $this->prompt(Modules::class, $r), Modules::id()) - ->add(fn(array $r, $pr, $n): mixed => $this->prompt(ModulePrefix::class, $r), ModulePrefix::id()) - ->add(fn(array $r, $pr, $n): mixed => $this->prompt(CustomModules::class, $r), CustomModules::id()) - ->add( - fn(array $r, $pr, $n): string => $this->resolveOrPrompt(Theme::id(), $r, fn(): mixed => $this->prompt(Theme::class)), - Theme::id() - ) - ->addIf( - fn(array $r): bool => $this->handler(ThemeCustom::id())->shouldRun($r), - fn(array $r, $pr, $n): mixed => $this->prompt(ThemeCustom::class, $r), - ThemeCustom::id() - ) - ->addIf( - fn(array $r): bool => $this->handler(FrontendBuild::id())->shouldRun($r), - fn(array $r, $pr, $n): mixed => $this->prompt(FrontendBuild::class, $r), - FrontendBuild::id() - ) - ->addIf( - fn(array $r): bool => $this->handler(Storybook::id())->shouldRun($r), - fn(array $r, $pr, $n): mixed => $this->prompt(Storybook::class, $r), - Storybook::id() - ) - - ->intro('Code repository') - ->add(fn($r, $pr, $n): mixed => $this->prompt(CodeProvider::class), CodeProvider::id()) - ->add(fn($r, $pr, $n): mixed => $this->prompt(VersionScheme::class), VersionScheme::id()) - - ->intro('Environment') - ->add(fn($r, $pr, $n): mixed => $this->prompt(Timezone::class), Timezone::id()) - ->add(fn($r, $pr, $n): mixed => $this->prompt(Services::class), Services::id()) - ->add(fn($r, $pr, $n): mixed => $this->prompt(Tools::class), Tools::id()) - - ->intro('Hosting') - ->add(fn($r, $pr, $n): mixed => $this->prompt(HostingProvider::class), HostingProvider::id()) - ->addIf( - fn(array $r): bool => $this->handler(HostingProjectName::id())->shouldRun($r), - fn(array $r, $pr, $n): mixed => $this->prompt(HostingProjectName::class, $r), - HostingProjectName::id() - ) - ->add( - fn(array $r, $pr, $n): string => $this->resolveOrPrompt(Webroot::id(), $r, fn(): mixed => $this->prompt(Webroot::class, $r)), - Webroot::id() - ) - - ->intro('Deployment') - ->add(fn(array $r, $pr, $n): mixed => $this->prompt(DeployTypes::class, $r), DeployTypes::id()) - - ->intro('Workflow') - ->add(fn($r, $pr, $n): mixed => $this->prompt(ProvisionType::class), ProvisionType::id()) - ->addIf( - fn(array $r): bool => $this->handler(DatabaseFetchSource::id())->shouldRun($r), - fn(array $r, $pr, $n): mixed => $this->prompt(DatabaseFetchSource::class, $r), - DatabaseFetchSource::id() - ) - ->addIf( - fn(array $r): bool => $this->handler(DatabaseImage::id())->shouldRun($r), - fn(array $r, $pr, $n): mixed => $this->prompt(DatabaseImage::class, $r), - DatabaseImage::id() - ) - ->add(fn($r, $pr, $n): mixed => $this->prompt(Migration::class), Migration::id()) - ->addIf( - fn(array $r): bool => $this->handler(MigrationFetchSource::id())->shouldRun($r), - fn(array $r, $pr, $n): mixed => $this->prompt(MigrationFetchSource::class, $r), - MigrationFetchSource::id() - ) - ->addIf( - fn(array $r): bool => $this->handler(MigrationImage::id())->shouldRun($r), - fn(array $r, $pr, $n): mixed => $this->prompt(MigrationImage::class, $r), - MigrationImage::id() - ) - - ->intro('Notifications') - ->add(fn($r, $pr, $n): mixed => $this->prompt(NotificationChannels::class), NotificationChannels::id()) - - ->intro('Continuous Integration') - ->add(fn(array $r, $pr, $n): mixed => $this->prompt(CiProvider::class, $r), CiProvider::id()) - ->add(fn($r, $pr, $n): mixed => $this->prompt(VisualRegression::class), VisualRegression::id()) - ->add(fn($r, $pr, $n): mixed => $this->prompt(Gitleaks::class), Gitleaks::id()) - - ->intro('Automations') - ->add(fn($r, $pr, $n): mixed => $this->prompt(DependencyUpdatesProvider::class), DependencyUpdatesProvider::id()) - ->addIf( - fn(array $r): bool => $this->handler(DependencyUpdatesAutomerge::id())->shouldRun($r), - fn(array $r, $pr, $n): mixed => $this->prompt(DependencyUpdatesAutomerge::class, $r), - DependencyUpdatesAutomerge::id() - ) - ->add(fn($r, $pr, $n): mixed => $this->prompt(CodeCoverageProvider::class), CodeCoverageProvider::id()) - ->add(fn($r, $pr, $n): mixed => $this->prompt(AssignAuthorPr::class), AssignAuthorPr::id()) - ->add(fn($r, $pr, $n): mixed => $this->prompt(LabelMergeConflictsPr::class), LabelMergeConflictsPr::id()) - - ->intro('Documentation') - ->add(fn($r, $pr, $n): mixed => $this->prompt(PreserveDocsProject::class), PreserveDocsProject::id()) - - ->intro('AI') - ->add(fn($r, $pr, $n): mixed => $this->prompt(AiCodeInstructions::class), AiCodeInstructions::id()) - ->add(fn($r, $pr, $n): mixed => $this->prompt(AiCodeReview::class), AiCodeReview::id()); - - // @formatter:on - // phpcs:enable Generic.Functions.FunctionCallArgumentSpacing.TooMuchSpaceAfterComma - // phpcs:enable Drupal.WhiteSpace.Comma.TooManySpaces - // phpcs:enable Drupal.WhiteSpace.ObjectOperatorIndent.Indent - // phpcs:enable Drupal.WhiteSpace.ScopeIndent.IncorrectExact - - $this->totalResponses = $this->countPrompts($form); - - $responses = $form->submit(); - - // Filter out elements with numeric keys returned by intro() calls. - $responses = array_filter($responses, fn($key): bool => !is_numeric($key), ARRAY_FILTER_USE_KEY); + $sections = $this->steps(); + + $this->totalResponses = array_sum(array_map(count(...), $sections)); + + $responses = []; + + foreach ($sections as $section => $steps) { + Tui::info($section); + + foreach ($steps as $id => $step) { + if (!$this->handler($id)->shouldRun($responses)) { + $responses[$id] = NULL; + continue; + } + + $response = $step($responses); + + // A widget answers NULL only when the user cancels it. + if ($response === NULL) { + Tui::output()->setVerbosity($original_verbosity); + + return FALSE; + } + + $responses[$id] = $response; + } + } if ($this->config->getNoInteraction()) { Tui::output()->setVerbosity($original_verbosity); @@ -294,6 +184,88 @@ public function runPrompts(): void { // Discovery covers only the handlers that read the destination, so the // collected answers fill the rest. $this->discoveredResponses = $this->normalizeResponses(array_replace($responses, $this->discoveredResponses)); + + return TRUE; + } + + /** + * Define the prompts in the order they are asked, grouped by section. + * + * Every step runs only when its handler's shouldRun() accepts the responses + * collected so far; a skipped step responds with NULL. + * + * @return array> + * Steps keyed by handler ID, grouped under their section heading. + */ + protected function steps(): array { + return [ + 'General information' => [ + Name::id() => fn(array $r): mixed => $this->prompt(Name::class), + MachineName::id() => fn(array $r): mixed => $this->prompt(MachineName::class, $r), + Org::id() => fn(array $r): mixed => $this->prompt(Org::class, $r), + OrgMachineName::id() => fn(array $r): mixed => $this->prompt(OrgMachineName::class, $r), + Domain::id() => fn(array $r): mixed => $this->prompt(Domain::class, $r), + ], + 'Drupal' => [ + Starter::id() => fn(array $r): mixed => $this->prompt(Starter::class, $r), + Profile::id() => fn(array $r): ?string => $this->resolveOrPrompt(Profile::id(), $r, fn(): mixed => $this->prompt(Profile::class)), + ProfileCustom::id() => fn(array $r): mixed => $this->prompt(ProfileCustom::class), + Modules::id() => fn(array $r): mixed => $this->prompt(Modules::class, $r), + ModulePrefix::id() => fn(array $r): mixed => $this->prompt(ModulePrefix::class, $r), + CustomModules::id() => fn(array $r): mixed => $this->prompt(CustomModules::class, $r), + Theme::id() => fn(array $r): ?string => $this->resolveOrPrompt(Theme::id(), $r, fn(): mixed => $this->prompt(Theme::class)), + ThemeCustom::id() => fn(array $r): mixed => $this->prompt(ThemeCustom::class, $r), + FrontendBuild::id() => fn(array $r): mixed => $this->prompt(FrontendBuild::class, $r), + Storybook::id() => fn(array $r): mixed => $this->prompt(Storybook::class, $r), + ], + 'Code repository' => [ + CodeProvider::id() => fn(array $r): mixed => $this->prompt(CodeProvider::class), + VersionScheme::id() => fn(array $r): mixed => $this->prompt(VersionScheme::class), + ], + 'Environment' => [ + Timezone::id() => fn(array $r): mixed => $this->prompt(Timezone::class), + Services::id() => fn(array $r): mixed => $this->prompt(Services::class), + Tools::id() => fn(array $r): mixed => $this->prompt(Tools::class), + ], + 'Hosting' => [ + HostingProvider::id() => fn(array $r): mixed => $this->prompt(HostingProvider::class), + HostingProjectName::id() => fn(array $r): mixed => $this->prompt(HostingProjectName::class, $r), + Webroot::id() => fn(array $r): ?string => $this->resolveOrPrompt(Webroot::id(), $r, fn(): mixed => $this->prompt(Webroot::class, $r)), + ], + 'Deployment' => [ + DeployTypes::id() => fn(array $r): mixed => $this->prompt(DeployTypes::class, $r), + ], + 'Workflow' => [ + ProvisionType::id() => fn(array $r): mixed => $this->prompt(ProvisionType::class), + DatabaseFetchSource::id() => fn(array $r): mixed => $this->prompt(DatabaseFetchSource::class, $r), + DatabaseImage::id() => fn(array $r): mixed => $this->prompt(DatabaseImage::class, $r), + Migration::id() => fn(array $r): mixed => $this->prompt(Migration::class), + MigrationFetchSource::id() => fn(array $r): mixed => $this->prompt(MigrationFetchSource::class, $r), + MigrationImage::id() => fn(array $r): mixed => $this->prompt(MigrationImage::class, $r), + ], + 'Notifications' => [ + NotificationChannels::id() => fn(array $r): mixed => $this->prompt(NotificationChannels::class), + ], + 'Continuous Integration' => [ + CiProvider::id() => fn(array $r): mixed => $this->prompt(CiProvider::class, $r), + VisualRegression::id() => fn(array $r): mixed => $this->prompt(VisualRegression::class), + Gitleaks::id() => fn(array $r): mixed => $this->prompt(Gitleaks::class), + ], + 'Automations' => [ + DependencyUpdatesProvider::id() => fn(array $r): mixed => $this->prompt(DependencyUpdatesProvider::class), + DependencyUpdatesAutomerge::id() => fn(array $r): mixed => $this->prompt(DependencyUpdatesAutomerge::class, $r), + CodeCoverageProvider::id() => fn(array $r): mixed => $this->prompt(CodeCoverageProvider::class), + AssignAuthorPr::id() => fn(array $r): mixed => $this->prompt(AssignAuthorPr::class), + LabelMergeConflictsPr::id() => fn(array $r): mixed => $this->prompt(LabelMergeConflictsPr::class), + ], + 'Documentation' => [ + PreserveDocsProject::id() => fn(array $r): mixed => $this->prompt(PreserveDocsProject::class), + ], + 'AI' => [ + AiCodeInstructions::id() => fn(array $r): mixed => $this->prompt(AiCodeInstructions::class), + AiCodeReview::id() => fn(array $r): mixed => $this->prompt(AiCodeReview::class), + ], + ]; } /** @@ -572,27 +544,6 @@ protected function label(string $text, ?string $suffix = NULL): string { return $text . ' ' . Tui::dim('(' . $suffix . '/' . $this->totalResponses . ')'); } - /** - * Count the prompts a form defines. - * - * Steps added by intro() carry no name, so the named steps are the prompts. - * Conditional steps are counted as well, because whether they run depends on - * answers the run has not collected yet, so the result is the most prompts a - * run can ask. - * - * @param \Laravel\Prompts\FormBuilder $form - * The form built in runPrompts(). - * - * @return int - * The number of prompts. - */ - protected function countPrompts(FormBuilder $form): int { - /** @var array $steps */ - $steps = (new \ReflectionProperty($form, 'steps'))->getValue($form); - - return count(array_filter($steps, fn(FormStep $step): bool => $step->name !== NULL)); - } - /** * Collect and initialize handlers. */ @@ -676,13 +627,23 @@ protected function resolvePromptOverrides(): void { * The prompt result. */ protected function prompt(string $handler_class, array $responses = []): mixed { - $fn = $this->handler($handler_class::id())->type()->promptFunction(); + $type = $this->handler($handler_class::id())->type(); + $args = $this->args($handler_class, NULL, $responses); - return $fn(...$this->args($handler_class, NULL, $responses)); + $response = $type->promptFunction()(...$args); + + // The widget answers in option order. Keeping the selected defaults in + // their own order first leaves a discovered list in the order the project + // already has it. + if ($type === PromptType::MultiSelect && is_array($response) && is_array($args['default'] ?? NULL)) { + $response = array_values(array_unique(array_merge(array_intersect($args['default'], $response), $response))); + } + + return $response; } /** - * Convert handler properties to Laravel prompts. + * Convert handler properties to Prompty widget arguments. * * Kept deliberately unoptimized to ease debugging and future changes. * @@ -694,7 +655,7 @@ protected function prompt(string $handler_class, array $responses = []): mixed { * Current form responses for context-aware methods. * * @return array - * Array of prompt arguments suitable for Laravel prompts. + * Array of named arguments for the handler's Prompty widget. */ protected function args(string $handler_class, mixed $default_override = NULL, array $responses = []): array { $id = $handler_class::id(); @@ -702,21 +663,13 @@ protected function args(string $handler_class, mixed $default_override = NULL, a $args = [ 'label' => $this->label($handler->label()), - 'hint' => $handler->hint($responses), + 'help' => $handler->hint($responses), 'placeholder' => $handler->placeholder($responses), 'transform' => $handler->transform(), - 'validate' => $handler->validate(), + 'validate' => $this->validator($handler), + 'description' => $handler::description($responses), ]; - $description = $handler::description($responses); - if ($description !== NULL) { - $args['description'] = PHP_EOL . $description . PHP_EOL; - } - - if ($handler->isRequired()) { - $args['required'] = TRUE; - } - $options = $handler->options($responses); if (is_array($options)) { $args['options'] = $options; @@ -744,6 +697,17 @@ protected function args(string $handler_class, mixed $default_override = NULL, a $default = $default_from_handler; } + // The widgets reject a default outside the options, so a default that no + // longer matches one is dropped and the widget starts from its first + // option. + if (is_array($options) && $handler->type() === PromptType::Select && !array_key_exists((string) $default, $options)) { + $default = NULL; + } + + if (is_array($options) && $handler->type() === PromptType::MultiSelect && is_array($default)) { + $default = array_values(array_filter($default, fn($value): bool => array_key_exists($value, $options))); + } + if ($default !== NULL && $default !== '') { $args['default'] = $default; } @@ -751,6 +715,35 @@ protected function args(string $handler_class, mixed $default_override = NULL, a return array_filter($args, fn($value): bool => $value !== NULL); } + /** + * Build the validator for a handler's prompt. + * + * A required prompt rejects an empty answer before the handler's own + * validation runs. + * + * @param \DrevOps\VortexInstaller\Prompts\Handlers\HandlerInterface $handler + * The handler. + * + * @return \Closure|null + * The validator, or NULL when the answer is not validated. + */ + protected function validator(HandlerInterface $handler): ?\Closure { + $validate = $handler->validate(); + $is_required = $handler->isRequired(); + + if ($validate === NULL && !$is_required) { + return NULL; + } + + return function (mixed $value) use ($validate, $is_required): ?string { + if ($is_required && ($value === '' || $value === [])) { + return 'Required.'; + } + + return $validate === NULL ? NULL : $validate($value); + }; + } + /** * Resolve a value via handler or prompt the user. * @@ -761,10 +754,10 @@ protected function args(string $handler_class, mixed $default_override = NULL, a * @param callable $prompt * The prompt callable to use if the value is not resolved. * - * @return string - * The resolved value. + * @return string|null + * The resolved value, or NULL when the prompt was cancelled. */ - protected function resolveOrPrompt(string $handler_id, array $r, callable $prompt): string { + protected function resolveOrPrompt(string $handler_id, array $r, callable $prompt): ?string { $handler = $this->handler($handler_id); $resolved = $handler->resolvedValue($r); @@ -782,7 +775,9 @@ protected function resolveOrPrompt(string $handler_id, array $r, callable $promp return $resolved; } - return (string) $prompt(); + $value = $prompt(); + + return $value === NULL ? NULL : (string) $value; } /** diff --git a/.vortex/installer/src/Prompts/PromptType.php b/.vortex/installer/src/Prompts/PromptType.php index db8a0a799d..7d38332542 100644 --- a/.vortex/installer/src/Prompts/PromptType.php +++ b/.vortex/installer/src/Prompts/PromptType.php @@ -4,20 +4,10 @@ namespace DrevOps\VortexInstaller\Prompts; -use function Laravel\Prompts\confirm; -use function Laravel\Prompts\multisearch; -use function Laravel\Prompts\multiselect; -use function Laravel\Prompts\number; -use function Laravel\Prompts\password; -use function Laravel\Prompts\pause; -use function Laravel\Prompts\search; -use function Laravel\Prompts\select; -use function Laravel\Prompts\suggest; -use function Laravel\Prompts\text; -use function Laravel\Prompts\textarea; +use AlexSkrypnyk\Prompty\Prompty; /** - * Prompt input types covering all Laravel Prompts input types. + * Prompt input types covering all Prompty widgets. */ enum PromptType: string { @@ -31,34 +21,16 @@ enum PromptType: string { case Suggest = 'suggest'; - case Number = 'number'; - - case Textarea = 'textarea'; - - case Password = 'password'; - - case Search = 'search'; - - case MultiSearch = 'multisearch'; - - case Pause = 'pause'; - /** - * Get the Laravel Prompts function for this type. + * Get the Prompty widget for this type. */ public function promptFunction(): \Closure { return match ($this) { - self::Text => text(...), - self::Select => select(...), - self::MultiSelect => multiselect(...), - self::Confirm => confirm(...), - self::Suggest => suggest(...), - self::Number => number(...), - self::Textarea => textarea(...), - self::Password => password(...), - self::Search => search(...), - self::MultiSearch => multisearch(...), - self::Pause => pause(...), + self::Text => Prompty::text(...), + self::Select => Prompty::select(...), + self::MultiSelect => Prompty::multiselect(...), + self::Confirm => Prompty::confirm(...), + self::Suggest => Prompty::suggest(...), }; } diff --git a/.vortex/installer/src/Task/Task.php b/.vortex/installer/src/Task/Task.php index a6560b361f..0d5ba62cff 100644 --- a/.vortex/installer/src/Task/Task.php +++ b/.vortex/installer/src/Task/Task.php @@ -6,7 +6,6 @@ use DrevOps\VortexInstaller\Utils\Strings; use DrevOps\VortexInstaller\Utils\Tui; -use function Laravel\Prompts\spin; class Task { @@ -50,8 +49,7 @@ public static function action( Tui::setOutput($original_output); } else { - // @phpstan-ignore-next-line - $return = spin($action, Tui::yellow($label)); + $return = self::spin($action, Tui::yellow($label)); self::label($label, $hint && is_callable($hint) ? $hint() : $hint, is_array($return) ? $return : NULL, Strings::isAsciiStart($label) ? 2 : 3); } @@ -67,6 +65,29 @@ public static function action( return $return; } + /** + * Show the label while the action runs, then erase it. + * + * @param \Closure $action + * The action to run. + * @param string $label + * The label to show while the action runs. + * + * @return mixed + * The value the action returns. + */ + protected static function spin(\Closure $action, string $label): mixed { + Tui::output()->write(PHP_EOL . ' ' . Tui::cyan('⠂') . ' ' . $label . PHP_EOL); + + try { + return $action(); + } + finally { + // Move to the start of the blank line above the label and clear down. + Tui::output()->write("\033[999D\033[2A\033[J"); + } + } + protected static function label(string $message, ?string $hint = NULL, ?array $sublist = NULL, int $sublist_indent = 3): void { $width = Tui::terminalWidth(); $right_offset = 10; diff --git a/.vortex/installer/src/Utils/Tui.php b/.vortex/installer/src/Utils/Tui.php index 76fc5adf42..f62c6702ee 100644 --- a/.vortex/installer/src/Utils/Tui.php +++ b/.vortex/installer/src/Utils/Tui.php @@ -4,15 +4,12 @@ namespace DrevOps\VortexInstaller\Utils; -use Laravel\Prompts\Prompt; -use Laravel\Prompts\Terminal; +use AlexSkrypnyk\Prompty\Prompty; +use Symfony\Component\Console\Helper\Table; +use Symfony\Component\Console\Helper\TableStyle; +use Symfony\Component\Console\Output\BufferedOutput; use Symfony\Component\Console\Output\OutputInterface; -use function Laravel\Prompts\confirm; -use function Laravel\Prompts\error; -use function Laravel\Prompts\info; -use function Laravel\Prompts\intro; -use function Laravel\Prompts\note; -use function Laravel\Prompts\table; +use Symfony\Component\Console\Terminal; class Tui { @@ -26,15 +23,16 @@ public static function init(OutputInterface $output, bool $is_interactive = TRUE self::$output = $output; self::$isInteractive = $is_interactive; - // Symfony console styles are not used here because Laravel Prompts does - // not correctly calculate the length of strings with style tags, which - // breaks the layout. Instead, helpers in this class apply ANSI escape - // codes directly. - Prompt::setOutput($output); - - if (!$is_interactive) { - Prompt::interactive(FALSE); - } + // The writer reads the output on each call, so a replacement set with + // setOutput() receives the prompts too. Raw output keeps the prompt frames + // away from the console formatter. + Prompty::configure( + unicode: TRUE, + ansi: $output->isDecorated(), + output: fn(string $chunk) => self::$output->write($chunk, FALSE, OutputInterface::OUTPUT_RAW), + interactive: $is_interactive, + placeholder_fallback: FALSE, + ); } public static function output(): OutputInterface { @@ -46,23 +44,25 @@ public static function output(): OutputInterface { public static function setOutput(OutputInterface $output): void { self::$output = $output; - Prompt::setOutput($output); } public static function info(string $message): void { - intro($message); + $lines = array_map(fn(string $line): string => ' ' . $line . ' ', explode(PHP_EOL, $message)); + $longest = max(array_map(mb_strlen(...), $lines)); + + self::block(array_map(fn(string $line): string => " \033[46m\033[30m" . mb_str_pad($line, $longest) . "\033[39m\033[49m", $lines)); } public static function note(string $message): void { - note($message); + self::block(array_map(fn(string $line): string => ' ' . $line, explode(PHP_EOL, $message))); } public static function success(string $message): void { - info($message); + self::block(array_map(fn(string $line): string => "\033[32m " . $line . "\033[39m", explode(PHP_EOL, $message))); } public static function error(string $message): void { - error('✕ ' . $message); + self::block(array_map(fn(string $line): string => "\033[31m " . $line . "\033[39m", explode(PHP_EOL, '✕ ' . $message))); } public static function confirm(string $label, bool $default = TRUE, ?string $hint = NULL): bool { @@ -70,11 +70,8 @@ public static function confirm(string $label, bool $default = TRUE, ?string $hin return $default; } - return confirm( - label: $label, - default: $default, - hint: $hint ?? '', - ); + // A cancelled prompt answers NULL, which declines. + return (bool) Prompty::confirm($label, default: $default, help: $hint ?? ''); } public static function line(string $message, int $padding = 1): void { @@ -190,8 +187,8 @@ public static function list(array $values, ?string $title): void { $rows[] = [$key, $value]; } - intro(PHP_EOL . self::normalizeText($title) . PHP_EOL); - table($header, $rows); + self::info(PHP_EOL . self::normalizeText($title) . PHP_EOL); + self::table($header, $rows); } public static function box(string $content, ?string $title = NULL, ?int $width = NULL): void { @@ -212,7 +209,46 @@ public static function box(string $content, ?string $title = NULL, ?int $width = $rows[] = [$content]; - table([], $rows); + self::table([], $rows); + } + + /** + * Render rows as a bordered table with a 1-column margin. + * + * @param array $header + * Header cells. An empty header draws no header row. + * @param array> $rows + * Table rows. + */ + public static function table(array $header, array $rows): void { + $style = (new TableStyle()) + ->setHorizontalBorderChars('─') + ->setVerticalBorderChars('│', '│') + ->setCellHeaderFormat("\033[2m%s\033[22m") + ->setCellRowFormat('%s'); + + if (empty($header)) { + $style->setCrossingChars('┼', '┌', '┬', '┐', '┤', '┘', '┴', '└', '├', '┌', '┬', '┐'); + } + else { + $style->setCrossingChars('┼', '┌', '┬', '┐', '┤', '┘', '┴', '└', '├'); + } + + $buffered = new BufferedOutput(OutputInterface::VERBOSITY_NORMAL, self::output()->isDecorated()); + + (new Table($buffered))->setHeaders($header)->setRows($rows)->setStyle($style)->render(); + + self::block(array_map(fn(string $line): string => ' ' . $line, explode(PHP_EOL, trim($buffered->fetch(), PHP_EOL)))); + } + + /** + * Write lines as a block separated from the output around it. + * + * @param array $lines + * Lines to write. + */ + protected static function block(array $lines): void { + self::output()->write(PHP_EOL . implode('', array_map(fn(string $line): string => $line . PHP_EOL, $lines)) . PHP_EOL); } public static function center(string $text, int $width = 80, ?string $border = NULL): string { @@ -244,7 +280,7 @@ public static function center(string $text, int $width = 80, ?string $border = N } public static function terminalWidth(int $max = 100): int { - return min($max, max(20, (new Terminal())->cols())); + return min($max, max(20, (new Terminal())->getWidth())); } public static function normalizeText(string $text): string { diff --git a/.vortex/installer/tests/Functional/FunctionalTestCase.php b/.vortex/installer/tests/Functional/FunctionalTestCase.php index dd086cd3aa..4204199187 100644 --- a/.vortex/installer/tests/Functional/FunctionalTestCase.php +++ b/.vortex/installer/tests/Functional/FunctionalTestCase.php @@ -37,7 +37,7 @@ public static function setUpBeforeClass(): void { * {@inheritdoc} */ protected function tearDown(): void { - static::tuiTeardown(); + $this->tuiTeardown(); if (empty(static::$fixtures)) { throw new \RuntimeException('Fixtures directory is not set.'); diff --git a/.vortex/installer/tests/Functional/PharTest.php b/.vortex/installer/tests/Functional/PharTest.php index 2b0ce6a919..7e9dac432b 100644 --- a/.vortex/installer/tests/Functional/PharTest.php +++ b/.vortex/installer/tests/Functional/PharTest.php @@ -111,11 +111,8 @@ protected function runInstallationWithPhar(string $phar_path, array $options = [ ]; $options += $defaults; - // The interactive mode is not supported in the tests as installer - // uses Laravel\Prompts which require a real TTY or a series of fallback - // callbacks to be defined. These callbacks are not implemented yet, so - // we enforce the non-interactive mode for the tests. - // @see https://github.com/drush-ops/drush/blob/13.x/src/Commands/ConfiguresPrompts.php + // Interactive prompts need a real TTY, which the PHAR process does not + // have. $options['no-interaction'] = TRUE; foreach ($options as $option => $value) { diff --git a/.vortex/installer/tests/Traits/TuiTrait.php b/.vortex/installer/tests/Traits/TuiTrait.php index ef0bb11c9d..3335c3c3cc 100644 --- a/.vortex/installer/tests/Traits/TuiTrait.php +++ b/.vortex/installer/tests/Traits/TuiTrait.php @@ -4,32 +4,51 @@ namespace DrevOps\VortexInstaller\Tests\Traits; +use AlexSkrypnyk\Prompty\PromptyTestTrait; use DrevOps\VortexInstaller\Utils\Tui; -use Laravel\Prompts\Output\BufferedConsoleOutput; -use Laravel\Prompts\Prompt; +use Symfony\Component\Console\Output\BufferedOutput; trait TuiTrait { - protected static function tuiSetUp(): void { - Tui::init((new BufferedConsoleOutput()), FALSE); - - // Override how validation is handled (it expects a user input on incorrect - // validation) to throw an exception instead so that we can assert on it - // in the tests. - Prompt::validateUsing(function (Prompt $prompt, mixed $value): null { - if (is_callable($prompt->validate)) { - $error = ($prompt->validate)($value); - if ($error) { - throw new \RuntimeException(sprintf('Validation failed with error "%s".', $error)); - } - } - - return NULL; - }); + use PromptyTestTrait; + + protected static function tuiSetUp(bool $is_interactive = FALSE): void { + Tui::init(new BufferedOutput(), $is_interactive); + } + + protected function tuiTeardown(): void { + // Tui::init() configures a new Prompty instance in the next test. + $this->promptyTearDown(); } - protected static function tuiTeardown(): void { - Prompt::validateUsing(NULL); + /** + * Feed keystrokes to the prompts. + * + * A rejected answer throws instead of re-prompting, so a test can assert on + * the validation message rather than on a prompt cancelled at the end of the + * input. + * + * @param array $keystrokes + * Keystrokes in the order the prompts read them. + */ + protected function tuiInput(array $keystrokes): void { + $stream = fopen('php://memory', 'r+'); + + if ($stream === FALSE) { + throw new \RuntimeException('Could not open a memory stream for the keystrokes.'); + } + + fwrite($stream, implode('', $keystrokes)); + rewind($stream); + + $instance = $this->promptyGetStatic('instance'); + + if (!is_object($instance)) { + throw new \RuntimeException('Prompty is not initialized. Call tuiSetUp() first.'); + } + + $this->promptySetProperty($instance, 'input', $stream); + $this->promptyThrowOnInvalid(); } /** diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/AbstractHandlerDiscoveryTestCase.php b/.vortex/installer/tests/Unit/Prompts/Handlers/AbstractHandlerDiscoveryTestCase.php index d45f95bb26..7f4049e7eb 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/AbstractHandlerDiscoveryTestCase.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/AbstractHandlerDiscoveryTestCase.php @@ -52,7 +52,6 @@ use DrevOps\VortexInstaller\Tests\Unit\UnitTestCase; use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\File; -use Laravel\Prompts\Prompt; use PHPUnit\Framework\Attributes\DataProvider; /** @@ -73,7 +72,7 @@ protected function setUp(): void { static::envUnsetProjectVars(); - static::tuiSetUp(); + static::tuiSetUp(TRUE); static::$sut = File::mkdir(static::$sut . DIRECTORY_SEPARATOR . 'myproject'); } @@ -82,7 +81,7 @@ protected function setUp(): void { * {@inheritdoc} */ protected function tearDown(): void { - static::tuiTeardown(); + $this->tuiTeardown(); parent::tearDown(); } @@ -109,7 +108,7 @@ public function testRunPrompts( $answers = array_replace(static::defaultTuiAnswers(), $answers); $keystrokes = static::tuiKeystrokes($answers, 40); - Prompt::fake($keystrokes); + $this->tuiInput($keystrokes); $pm = new PromptManager($config); $pm->runPrompts(); diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/AiCodeInstructionsHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/AiCodeInstructionsHandlerDiscoveryTest.php index cfc073e4c5..af9db7711c 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/AiCodeInstructionsHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/AiCodeInstructionsHandlerDiscoveryTest.php @@ -7,7 +7,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\AiCodeInstructions; use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\File; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(AiCodeInstructions::class)] @@ -17,7 +16,7 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); $expected_installed = static::getExpectedInstalled(); yield 'ai instructions - prompt' => [ - [AiCodeInstructions::id() => Key::ENTER], + [AiCodeInstructions::id() => self::KEY_ENTER], [AiCodeInstructions::id() => TRUE] + $expected_defaults, ]; yield 'ai instructions - discovery' => [ diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/AiCodeReviewHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/AiCodeReviewHandlerDiscoveryTest.php index ff7670ba4a..8f6469c2e8 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/AiCodeReviewHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/AiCodeReviewHandlerDiscoveryTest.php @@ -7,7 +7,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\AiCodeReview; use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\File; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(AiCodeReview::class)] @@ -17,11 +16,11 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); $expected_installed = static::getExpectedInstalled(); yield 'ai code review - prompt' => [ - [AiCodeReview::id() => Key::ENTER], + [AiCodeReview::id() => self::KEY_ENTER], [AiCodeReview::id() => FALSE] + $expected_defaults, ]; yield 'ai code review - prompt - enabled' => [ - [AiCodeReview::id() => Key::LEFT . Key::ENTER], + [AiCodeReview::id() => self::KEY_LEFT . self::KEY_ENTER], [AiCodeReview::id() => TRUE] + $expected_defaults, ]; yield 'ai code review - discovery' => [ diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/CiProviderHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/CiProviderHandlerDiscoveryTest.php index d84e2bb122..dffd2829f2 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/CiProviderHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/CiProviderHandlerDiscoveryTest.php @@ -7,7 +7,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\CiProvider; use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\File; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(CiProvider::class)] @@ -17,7 +16,7 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); $expected_installed = static::getExpectedInstalled(); yield 'ci provider - prompt' => [ - [CiProvider::id() => Key::ENTER], + [CiProvider::id() => self::KEY_ENTER], [CiProvider::id() => CiProvider::GITHUB_ACTIONS] + $expected_defaults, ]; yield 'ci provider - discovery - gha' => [ diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/CodeCoverageProviderHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/CodeCoverageProviderHandlerDiscoveryTest.php index 23ebc1cab6..a40a0384c1 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/CodeCoverageProviderHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/CodeCoverageProviderHandlerDiscoveryTest.php @@ -8,7 +8,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\CodeCoverageProvider; use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\File; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(CodeCoverageProvider::class)] @@ -18,7 +17,7 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); $expected_installed = static::getExpectedInstalled(); yield 'code coverage provider - prompt' => [ - [CodeCoverageProvider::id() => Key::ENTER], + [CodeCoverageProvider::id() => self::KEY_ENTER], [CodeCoverageProvider::id() => CodeCoverageProvider::NONE] + $expected_defaults, ]; yield 'code coverage provider - discovery - codecov - gha' => [ diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/CodeProviderHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/CodeProviderHandlerDiscoveryTest.php index 9a5044e2b8..6f9ca15161 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/CodeProviderHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/CodeProviderHandlerDiscoveryTest.php @@ -9,7 +9,6 @@ use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\File; use DrevOps\VortexInstaller\Utils\Git; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(CodeProvider::class)] @@ -19,11 +18,11 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); $expected_installed = static::getExpectedInstalled(); yield 'code repo - prompt' => [ - [CodeProvider::id() => Key::ENTER], + [CodeProvider::id() => self::KEY_ENTER], [CodeProvider::id() => CodeProvider::GITHUB] + $expected_defaults, ]; yield 'code repo - prompt - other' => [ - [CodeProvider::id() => Key::DOWN . Key::ENTER], + [CodeProvider::id() => self::KEY_DOWN . self::KEY_ENTER], [ CodeProvider::id() => CodeProvider::OTHER, CiProvider::id() => CiProvider::CIRCLECI, diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/CustomModulesHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/CustomModulesHandlerDiscoveryTest.php index 0aac3256c5..06d492c55a 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/CustomModulesHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/CustomModulesHandlerDiscoveryTest.php @@ -7,7 +7,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\CustomModules; use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\File; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(CustomModules::class)] @@ -17,7 +16,7 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); $expected_installed = static::getExpectedInstalled(); yield 'custom_modules - prompt' => [ - [CustomModules::id() => Key::ENTER], + [CustomModules::id() => self::KEY_ENTER], [CustomModules::id() => [CustomModules::BASE, CustomModules::SEARCH, CustomModules::DEMO]] + $expected_defaults, ]; yield 'custom_modules - discovery - all' => [ diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/DatabaseFetchSourceHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/DatabaseFetchSourceHandlerDiscoveryTest.php index bcc78955b3..444a5470be 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/DatabaseFetchSourceHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/DatabaseFetchSourceHandlerDiscoveryTest.php @@ -5,7 +5,6 @@ namespace DrevOps\VortexInstaller\Tests\Unit\Prompts\Handlers; use DrevOps\VortexInstaller\Prompts\Handlers\DatabaseFetchSource; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(DatabaseFetchSource::class)] @@ -14,7 +13,7 @@ class DatabaseFetchSourceHandlerDiscoveryTest extends AbstractHandlerDiscoveryTe public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); yield 'database fetch source - prompt' => [ - [DatabaseFetchSource::id() => Key::ENTER], + [DatabaseFetchSource::id() => self::KEY_ENTER], [DatabaseFetchSource::id() => DatabaseFetchSource::URL] + $expected_defaults, ]; yield 'database fetch source - discovery' => [ diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/DatabaseImageHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/DatabaseImageHandlerDiscoveryTest.php index 06a772b02f..2eaf11b04d 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/DatabaseImageHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/DatabaseImageHandlerDiscoveryTest.php @@ -7,7 +7,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\DatabaseFetchSource; use DrevOps\VortexInstaller\Prompts\Handlers\DatabaseImage; use DrevOps\VortexInstaller\Utils\Config; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(DatabaseImage::class)] @@ -17,28 +16,29 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); yield 'database image - prompt' => [ [ - DatabaseFetchSource::id() => Key::DOWN . Key::DOWN . Key::DOWN . Key::DOWN . Key::ENTER, + DatabaseFetchSource::id() => self::KEY_DOWN . self::KEY_DOWN . self::KEY_DOWN . self::KEY_DOWN . self::KEY_ENTER, DatabaseImage::id() => 'myregistry/myimage:mytag', ], [DatabaseFetchSource::id() => DatabaseFetchSource::CONTAINER_REGISTRY, DatabaseImage::id() => 'myregistry/myimage:mytag'] + $expected_defaults, ]; yield 'database image - invalid' => [ [ - DatabaseFetchSource::id() => Key::DOWN . Key::DOWN . Key::DOWN . Key::DOWN . Key::ENTER, + DatabaseFetchSource::id() => self::KEY_DOWN . self::KEY_DOWN . self::KEY_DOWN . self::KEY_DOWN . self::KEY_ENTER, DatabaseImage::id() => 'myregistry:myimage:mytag', ], 'Please enter a valid container image name with an optional tag.', ]; yield 'database image - invalid - capitalization' => [ [ - DatabaseFetchSource::id() => Key::DOWN . Key::DOWN . Key::DOWN . Key::DOWN . Key::ENTER, + DatabaseFetchSource::id() => self::KEY_DOWN . self::KEY_DOWN . self::KEY_DOWN . self::KEY_DOWN . self::KEY_ENTER, DatabaseImage::id() => 'MyRegistry/MyImage:mytag', ], 'Please enter a valid container image name with an optional tag.', ]; yield 'database image - discovery' => [ [ - DatabaseFetchSource::id() => Key::DOWN . Key::DOWN . Key::DOWN . Key::DOWN . Key::ENTER, + DatabaseFetchSource::id() => self::KEY_DOWN . self::KEY_DOWN . self::KEY_DOWN . self::KEY_DOWN . self::KEY_ENTER, + DatabaseImage::id() => static::TUI_DEFAULT, ], [ DatabaseFetchSource::id() => DatabaseFetchSource::CONTAINER_REGISTRY, diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/DependencyUpdatesProviderHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/DependencyUpdatesProviderHandlerDiscoveryTest.php index 8d87c1a285..0e50cc3436 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/DependencyUpdatesProviderHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/DependencyUpdatesProviderHandlerDiscoveryTest.php @@ -9,7 +9,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\DependencyUpdatesProvider; use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\File; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(DependencyUpdatesProvider::class)] @@ -21,7 +20,7 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_installed = static::getExpectedInstalled(); $all_groups = array_keys(DependencyUpdatesAutomerge::GROUPS); yield 'dependency updates provider - prompt' => [ - [DependencyUpdatesProvider::id() => Key::ENTER], + [DependencyUpdatesProvider::id() => self::KEY_ENTER], [DependencyUpdatesProvider::id() => DependencyUpdatesProvider::RENOVATEBOT_APP] + $expected_defaults, ]; yield 'dependency updates provider - discovery - renovate self-hosted - gha' => [ @@ -75,11 +74,11 @@ function (AbstractHandlerDiscoveryTestCase $test): void { }, ]; yield 'dependency updates automerge - prompt - deselect first group' => [ - [DependencyUpdatesAutomerge::id() => Key::SPACE . Key::ENTER], + [DependencyUpdatesAutomerge::id() => self::KEY_SPACE . self::KEY_ENTER], [DependencyUpdatesAutomerge::id() => array_values(array_diff($all_groups, [DependencyUpdatesAutomerge::PHP]))] + $expected_defaults, ]; yield 'dependency updates automerge - prompt - skipped without renovate' => [ - [DependencyUpdatesProvider::id() => Key::DOWN . Key::DOWN . Key::ENTER], + [DependencyUpdatesProvider::id() => self::KEY_DOWN . self::KEY_DOWN . self::KEY_ENTER], [ DependencyUpdatesProvider::id() => DependencyUpdatesProvider::NONE, DependencyUpdatesAutomerge::id() => NULL, diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/DeployTypesHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/DeployTypesHandlerDiscoveryTest.php index 347e824e59..e33239c583 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/DeployTypesHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/DeployTypesHandlerDiscoveryTest.php @@ -7,7 +7,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\DeployTypes; use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\Converter; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(DeployTypes::class)] @@ -16,7 +15,7 @@ class DeployTypesHandlerDiscoveryTest extends AbstractHandlerDiscoveryTestCase { public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); yield 'deploy types - prompt' => [ - [DeployTypes::id() => Key::ENTER], + [DeployTypes::id() => self::KEY_ENTER], [DeployTypes::id() => [DeployTypes::WEBHOOK]] + $expected_defaults, ]; yield 'deploy types - discovery' => [ diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/DocsHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/DocsHandlerDiscoveryTest.php index 86e77a6608..c1caacf3f3 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/DocsHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/DocsHandlerDiscoveryTest.php @@ -7,7 +7,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\PreserveDocsProject; use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\File; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(PreserveDocsProject::class)] @@ -17,7 +16,7 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); $expected_installed = static::getExpectedInstalled(); yield 'preserve project documentation - prompt' => [ - [PreserveDocsProject::id() => Key::ENTER], + [PreserveDocsProject::id() => self::KEY_ENTER], [PreserveDocsProject::id() => TRUE] + $expected_defaults, ]; yield 'preserve project documentation - discovery' => [ diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/FrontendBuildHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/FrontendBuildHandlerDiscoveryTest.php index d2b18f432e..43490fcb73 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/FrontendBuildHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/FrontendBuildHandlerDiscoveryTest.php @@ -8,7 +8,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\Storybook; use DrevOps\VortexInstaller\Prompts\Handlers\Theme; use DrevOps\VortexInstaller\Utils\Config; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(FrontendBuild::class)] @@ -25,11 +24,11 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_defaults_core[Storybook::id()] = NULL; yield 'frontend build - prompt' => [ - [FrontendBuild::id() => Key::ENTER], + [FrontendBuild::id() => self::KEY_ENTER], [FrontendBuild::id() => TRUE] + $expected_defaults, ]; yield 'frontend build - not shown for core theme' => [ - [Theme::id() => Key::DOWN . Key::ENTER], + [Theme::id() => self::KEY_DOWN . self::KEY_ENTER], [Theme::id() => Theme::OLIVERO] + $expected_defaults_core, ]; yield 'frontend build - discovery - build in container' => [ diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/HostingProjectNameHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/HostingProjectNameHandlerDiscoveryTest.php index 59a9fbe6d5..cc9dd7d1dd 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/HostingProjectNameHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/HostingProjectNameHandlerDiscoveryTest.php @@ -11,7 +11,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\Webroot; use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\File; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(HostingProjectName::class)] @@ -20,10 +19,10 @@ class HostingProjectNameHandlerDiscoveryTest extends AbstractHandlerDiscoveryTes public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); - $clear_keys = implode('', array_fill(0, 20, Key::BACKSPACE)); + $clear_keys = implode('', array_fill(0, 20, self::KEY_BACKSPACE)); yield 'hosting project name - acquia - prompt' => [ [ - HostingProvider::id() => Key::DOWN . Key::ENTER . $clear_keys . 'my_acquia-project', + HostingProvider::id() => self::KEY_DOWN . self::KEY_ENTER . $clear_keys . 'my_acquia-project', ], [ HostingProvider::id() => HostingProvider::ACQUIA, @@ -34,12 +33,12 @@ public static function dataProviderRunPrompts(): \Iterator { ] + $expected_defaults, ]; yield 'hosting project name - acquia - prompt - invalid' => [ - [HostingProvider::id() => Key::DOWN . Key::ENTER . $clear_keys . 'my_acquia project'], + [HostingProvider::id() => self::KEY_DOWN . self::KEY_ENTER . $clear_keys . 'my_acquia project'], 'Please enter a valid machine name: only lowercase letters, numbers, hyphens and underscores are allowed.', ]; yield 'hosting project name - acquia - discovery from .env' => [ [ - HostingProvider::id() => Key::DOWN . Key::ENTER, + HostingProvider::id() => self::KEY_DOWN . self::KEY_ENTER, ], [ HostingProvider::id() => HostingProvider::ACQUIA, @@ -54,7 +53,7 @@ function (AbstractHandlerDiscoveryTestCase $test, Config $config): void { ]; yield 'hosting project name - acquia - discovery from settings.acquia.php' => [ [ - HostingProvider::id() => Key::DOWN . Key::ENTER, + HostingProvider::id() => self::KEY_DOWN . self::KEY_ENTER, ], [ HostingProvider::id() => HostingProvider::ACQUIA, @@ -74,7 +73,7 @@ function (AbstractHandlerDiscoveryTestCase $test, Config $config): void { ]; yield 'hosting project name - lagoon - prompt' => [ [ - HostingProvider::id() => Key::DOWN . Key::DOWN . Key::ENTER . $clear_keys . 'my_lagoon-project', + HostingProvider::id() => self::KEY_DOWN . self::KEY_DOWN . self::KEY_ENTER . $clear_keys . 'my_lagoon-project' . self::KEY_ENTER, ], [ HostingProvider::id() => HostingProvider::LAGOON, @@ -84,12 +83,12 @@ function (AbstractHandlerDiscoveryTestCase $test, Config $config): void { ] + $expected_defaults, ]; yield 'hosting project name - lagoon - prompt - invalid' => [ - [HostingProvider::id() => Key::DOWN . Key::DOWN . Key::ENTER . $clear_keys . 'my_lagoon project'], + [HostingProvider::id() => self::KEY_DOWN . self::KEY_DOWN . self::KEY_ENTER . $clear_keys . 'my_lagoon project'], 'Please enter a valid machine name: only lowercase letters, numbers, hyphens and underscores are allowed.', ]; yield 'hosting project name - lagoon - discovery from .env' => [ [ - HostingProvider::id() => Key::DOWN . Key::DOWN . Key::ENTER, + HostingProvider::id() => self::KEY_DOWN . self::KEY_DOWN . self::KEY_ENTER . self::KEY_ENTER, ], [ HostingProvider::id() => HostingProvider::LAGOON, @@ -103,7 +102,7 @@ function (AbstractHandlerDiscoveryTestCase $test, Config $config): void { ]; yield 'hosting project name - lagoon - discovery from drush lagoon.site.yml' => [ [ - HostingProvider::id() => Key::DOWN . Key::DOWN . Key::ENTER, + HostingProvider::id() => self::KEY_DOWN . self::KEY_DOWN . self::KEY_ENTER . self::KEY_ENTER, ], [ HostingProvider::id() => HostingProvider::LAGOON, diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/HostingProviderHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/HostingProviderHandlerDiscoveryTest.php index fc8558a38a..4d9fd20946 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/HostingProviderHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/HostingProviderHandlerDiscoveryTest.php @@ -11,7 +11,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\Webroot; use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\File; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(HostingProvider::class)] @@ -20,7 +19,7 @@ class HostingProviderHandlerDiscoveryTest extends AbstractHandlerDiscoveryTestCa public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); yield 'hosting provider - prompt' => [ - [HostingProvider::id() => Key::ENTER], + [HostingProvider::id() => self::KEY_ENTER], [HostingProvider::id() => HostingProvider::NONE] + $expected_defaults, ]; yield 'hosting provider - discovery - Acquia' => [ @@ -50,7 +49,7 @@ function (AbstractHandlerDiscoveryTestCase $test, Config $config): void { }, ]; yield 'hosting provider - discovery - Lagoon' => [ - [], + [HostingProvider::id() => self::KEY_ENTER . self::KEY_ENTER], [ HostingProvider::id() => HostingProvider::LAGOON, HostingProjectName::id() => 'myproject', diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/MigrationFetchSourceHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/MigrationFetchSourceHandlerDiscoveryTest.php index fa6800840e..2e800ecf29 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/MigrationFetchSourceHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/MigrationFetchSourceHandlerDiscoveryTest.php @@ -6,7 +6,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\Migration; use DrevOps\VortexInstaller\Prompts\Handlers\MigrationFetchSource; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(MigrationFetchSource::class)] @@ -16,21 +15,22 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); yield 'migration download source - prompt' => [ [ - Migration::id() => Key::LEFT . Key::ENTER, - MigrationFetchSource::id() => Key::ENTER, + Migration::id() => self::KEY_LEFT . self::KEY_ENTER, + MigrationFetchSource::id() => self::KEY_ENTER, ], [Migration::id() => TRUE, MigrationFetchSource::id() => MigrationFetchSource::URL] + $expected_defaults, ]; yield 'migration download source - prompt - ftp' => [ [ - Migration::id() => Key::LEFT . Key::ENTER, - MigrationFetchSource::id() => Key::DOWN . Key::ENTER, + Migration::id() => self::KEY_LEFT . self::KEY_ENTER, + MigrationFetchSource::id() => self::KEY_DOWN . self::KEY_ENTER, ], [Migration::id() => TRUE, MigrationFetchSource::id() => MigrationFetchSource::FTP] + $expected_defaults, ]; yield 'migration download source - discovery' => [ [ - Migration::id() => Key::LEFT . Key::ENTER, + Migration::id() => self::KEY_LEFT . self::KEY_ENTER, + MigrationFetchSource::id() => self::KEY_ENTER, ], [Migration::id() => TRUE, MigrationFetchSource::id() => MigrationFetchSource::FTP] + $expected_defaults, function (AbstractHandlerDiscoveryTestCase $test): void { @@ -39,7 +39,8 @@ function (AbstractHandlerDiscoveryTestCase $test): void { ]; yield 'migration download source - discovery - s3' => [ [ - Migration::id() => Key::LEFT . Key::ENTER, + Migration::id() => self::KEY_LEFT . self::KEY_ENTER, + MigrationFetchSource::id() => self::KEY_ENTER, ], [Migration::id() => TRUE, MigrationFetchSource::id() => MigrationFetchSource::S3] + $expected_defaults, function (AbstractHandlerDiscoveryTestCase $test): void { @@ -48,8 +49,8 @@ function (AbstractHandlerDiscoveryTestCase $test): void { ]; yield 'migration download source - discovery - invalid' => [ [ - Migration::id() => Key::LEFT . Key::ENTER, - MigrationFetchSource::id() => Key::ENTER, + Migration::id() => self::KEY_LEFT . self::KEY_ENTER, + MigrationFetchSource::id() => self::KEY_ENTER, ], [Migration::id() => TRUE, MigrationFetchSource::id() => MigrationFetchSource::URL] + $expected_defaults, function (AbstractHandlerDiscoveryTestCase $test): void { diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/MigrationHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/MigrationHandlerDiscoveryTest.php index 5eebc65d8c..ca38df3687 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/MigrationHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/MigrationHandlerDiscoveryTest.php @@ -10,7 +10,6 @@ use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\File; use DrevOps\VortexInstaller\Utils\Yaml; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(Migration::class)] @@ -20,19 +19,19 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); $expected_installed = static::getExpectedInstalled(); yield 'migration - prompt - disabled' => [ - [Migration::id() => Key::ENTER], + [Migration::id() => self::KEY_ENTER], [Migration::id() => FALSE] + $expected_defaults, ]; yield 'migration - prompt - enabled' => [ [ - Migration::id() => Key::LEFT . Key::ENTER, - MigrationFetchSource::id() => Key::ENTER, + Migration::id() => self::KEY_LEFT . self::KEY_ENTER, + MigrationFetchSource::id() => self::KEY_ENTER, ], [Migration::id() => TRUE, MigrationFetchSource::id() => MigrationFetchSource::URL] + $expected_defaults, ]; yield 'migration - discovery - database2 exists' => [ [ - MigrationFetchSource::id() => Key::ENTER, + MigrationFetchSource::id() => self::KEY_ENTER, ], [Migration::id() => TRUE, MigrationFetchSource::id() => MigrationFetchSource::URL] + $expected_installed, function (AbstractHandlerDiscoveryTestCase $test, Config $config): void { diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/MigrationImageHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/MigrationImageHandlerDiscoveryTest.php index 34769268f0..20ff21d460 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/MigrationImageHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/MigrationImageHandlerDiscoveryTest.php @@ -8,7 +8,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\MigrationFetchSource; use DrevOps\VortexInstaller\Prompts\Handlers\MigrationImage; use DrevOps\VortexInstaller\Utils\Config; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(MigrationImage::class)] @@ -18,24 +17,25 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); yield 'migration image - default' => [ [ - Migration::id() => Key::LEFT . Key::ENTER, - MigrationFetchSource::id() => Key::DOWN . Key::DOWN . Key::DOWN . Key::DOWN . Key::ENTER, + Migration::id() => self::KEY_LEFT . self::KEY_ENTER, + MigrationFetchSource::id() => self::KEY_DOWN . self::KEY_DOWN . self::KEY_DOWN . self::KEY_DOWN . self::KEY_ENTER, MigrationImage::id() => static::TUI_DEFAULT, ], [Migration::id() => TRUE, MigrationFetchSource::id() => MigrationFetchSource::CONTAINER_REGISTRY, MigrationImage::id() => 'myprojectorg/myproject-data-migration:latest'] + $expected_defaults, ]; yield 'migration image - invalid' => [ [ - Migration::id() => Key::LEFT . Key::ENTER, - MigrationFetchSource::id() => Key::DOWN . Key::DOWN . Key::DOWN . Key::DOWN . Key::ENTER, + Migration::id() => self::KEY_LEFT . self::KEY_ENTER, + MigrationFetchSource::id() => self::KEY_DOWN . self::KEY_DOWN . self::KEY_DOWN . self::KEY_DOWN . self::KEY_ENTER, MigrationImage::id() => 'myregistry:myimage:mytag', ], 'Please enter a valid container image name with an optional tag.', ]; yield 'migration image - discovery' => [ [ - Migration::id() => Key::LEFT . Key::ENTER, - MigrationFetchSource::id() => Key::DOWN . Key::DOWN . Key::DOWN . Key::DOWN . Key::ENTER, + Migration::id() => self::KEY_LEFT . self::KEY_ENTER, + MigrationFetchSource::id() => self::KEY_DOWN . self::KEY_DOWN . self::KEY_DOWN . self::KEY_DOWN . self::KEY_ENTER, + MigrationImage::id() => static::TUI_DEFAULT, ], [ Migration::id() => TRUE, diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/ModulesHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/ModulesHandlerDiscoveryTest.php index 45b37aa477..cf1f8546c9 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/ModulesHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/ModulesHandlerDiscoveryTest.php @@ -7,7 +7,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\Modules; use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\File; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(Modules::class)] @@ -17,7 +16,7 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); $expected_installed = static::getExpectedInstalled(); yield 'modules - prompt' => [ - [Modules::id() => Key::ENTER], + [Modules::id() => self::KEY_ENTER], [Modules::id() => array_keys(Modules::getAvailableModules())] + $expected_defaults, ]; yield 'modules - discovery - some modules' => [ diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/NotificationChannelsHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/NotificationChannelsHandlerDiscoveryTest.php index 17a8493b60..bf827d2f8d 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/NotificationChannelsHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/NotificationChannelsHandlerDiscoveryTest.php @@ -7,7 +7,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\NotificationChannels; use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\Converter; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(NotificationChannels::class)] @@ -17,7 +16,7 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); $expected_installed = static::getExpectedInstalled(); yield 'notification channels - prompt' => [ - [NotificationChannels::id() => Key::ENTER], + [NotificationChannels::id() => self::KEY_ENTER], $expected_defaults, ]; yield 'notification channels - discovery - email only' => [ diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/ProfileHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/ProfileHandlerDiscoveryTest.php index fc302fc98e..325dd11280 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/ProfileHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/ProfileHandlerDiscoveryTest.php @@ -7,7 +7,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\Profile; use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\File; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(Profile::class)] @@ -17,15 +16,15 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); $expected_installed = static::getExpectedInstalled(); yield 'profile - prompt' => [ - [Profile::id() => Key::DOWN . Key::ENTER], + [Profile::id() => self::KEY_DOWN . self::KEY_ENTER], [Profile::id() => 'minimal'] + $expected_defaults, ]; yield 'profile - prompt - custom' => [ - [Profile::id() => Key::DOWN . Key::DOWN . Key::DOWN . Key::ENTER . 'myprofile'], + [Profile::id() => self::KEY_DOWN . self::KEY_DOWN . self::KEY_DOWN . self::KEY_ENTER . 'myprofile' . self::KEY_ENTER], [Profile::id() => 'myprofile'] + $expected_defaults, ]; yield 'profile - prompt - invalid' => [ - [Profile::id() => Key::DOWN . Key::DOWN . Key::DOWN . Key::ENTER . 'my profile'], + [Profile::id() => self::KEY_DOWN . self::KEY_DOWN . self::KEY_DOWN . self::KEY_ENTER . 'my profile'], 'Please enter a valid profile name: only lowercase letters, numbers, and underscores are allowed.', ]; yield 'profile - discovery' => [ diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/ProvisionTypeHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/ProvisionTypeHandlerDiscoveryTest.php index 586614f9e4..699d1c462e 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/ProvisionTypeHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/ProvisionTypeHandlerDiscoveryTest.php @@ -7,7 +7,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\DatabaseFetchSource; use DrevOps\VortexInstaller\Prompts\Handlers\ProvisionType; use DrevOps\VortexInstaller\Utils\Config; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(ProvisionType::class)] @@ -16,7 +15,7 @@ class ProvisionTypeHandlerDiscoveryTest extends AbstractHandlerDiscoveryTestCase public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); yield 'provision type - prompt' => [ - [ProvisionType::id() => Key::ENTER], + [ProvisionType::id() => self::KEY_ENTER], [ProvisionType::id() => ProvisionType::DATABASE] + $expected_defaults, ]; yield 'provision type - discovery - database' => [ diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/PullRequestHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/PullRequestHandlerDiscoveryTest.php index cfa0cb8069..7f06c10860 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/PullRequestHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/PullRequestHandlerDiscoveryTest.php @@ -8,7 +8,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\LabelMergeConflictsPr; use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\File; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(AssignAuthorPr::class)] @@ -19,7 +18,7 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); $expected_installed = static::getExpectedInstalled(); yield 'auto assign pr - prompt' => [ - [AssignAuthorPr::id() => Key::ENTER], + [AssignAuthorPr::id() => self::KEY_ENTER], [AssignAuthorPr::id() => TRUE] + $expected_defaults, ]; yield 'auto assign pr - discovery' => [ @@ -52,7 +51,7 @@ function (AbstractHandlerDiscoveryTestCase $test): void { }, ]; yield 'label merge conflicts - prompt' => [ - [LabelMergeConflictsPr::id() => Key::ENTER], + [LabelMergeConflictsPr::id() => self::KEY_ENTER], [LabelMergeConflictsPr::id() => TRUE] + $expected_defaults, ]; yield 'label merge conflicts - discovery' => [ diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/ServicesHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/ServicesHandlerDiscoveryTest.php index 9daed2c03a..02f2fd16a8 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/ServicesHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/ServicesHandlerDiscoveryTest.php @@ -8,7 +8,6 @@ use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\File; use DrevOps\VortexInstaller\Utils\Yaml; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(Services::class)] @@ -18,7 +17,7 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); $expected_installed = static::getExpectedInstalled(); yield 'services - prompt' => [ - [Services::id() => Key::ENTER], + [Services::id() => self::KEY_ENTER], [Services::id() => [Services::CLAMAV, Services::REDIS, Services::SOLR]] + $expected_defaults, ]; yield 'services - discovery - solr' => [ diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/StarterHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/StarterHandlerDiscoveryTest.php index 3c5f9704d2..d0ef6b9fbc 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/StarterHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/StarterHandlerDiscoveryTest.php @@ -7,7 +7,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\Profile; use DrevOps\VortexInstaller\Prompts\Handlers\Starter; use DrevOps\VortexInstaller\Utils\Config; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(Starter::class)] @@ -16,15 +15,15 @@ class StarterHandlerDiscoveryTest extends AbstractHandlerDiscoveryTestCase { public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); yield 'starter - prompt' => [ - [Starter::id() => Key::ENTER], + [Starter::id() => self::KEY_ENTER], [Starter::id() => Starter::LOAD_DATABASE_DEMO] + $expected_defaults, ]; yield 'starter - prompt - Drupal profile' => [ - [Starter::id() => Key::DOWN . Key::ENTER], + [Starter::id() => self::KEY_DOWN . self::KEY_ENTER], [Starter::id() => Starter::INSTALL_PROFILE_CORE] + $expected_defaults, ]; yield 'starter - prompt - Drupal CMS profile' => [ - [Starter::id() => Key::DOWN . Key::DOWN . Key::ENTER], + [Starter::id() => self::KEY_DOWN . self::KEY_DOWN . self::KEY_ENTER], [ Starter::id() => Starter::INSTALL_PROFILE_DRUPALCMS, Profile::id() => Starter::INSTALL_PROFILE_DRUPALCMS_PATH, diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/StorybookHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/StorybookHandlerDiscoveryTest.php index b4b017634b..d35023823d 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/StorybookHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/StorybookHandlerDiscoveryTest.php @@ -9,7 +9,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\Theme; use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\File; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(Storybook::class)] @@ -26,15 +25,15 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_defaults_core[Storybook::id()] = NULL; yield 'storybook - prompt - disabled' => [ - [Storybook::id() => Key::ENTER], + [Storybook::id() => self::KEY_ENTER], [Storybook::id() => FALSE] + $expected_defaults, ]; yield 'storybook - prompt - enabled' => [ - [Storybook::id() => Key::LEFT . Key::ENTER], + [Storybook::id() => self::KEY_LEFT . self::KEY_ENTER], [Storybook::id() => TRUE] + $expected_defaults, ]; yield 'storybook - not shown for core theme' => [ - [Theme::id() => Key::DOWN . Key::ENTER], + [Theme::id() => self::KEY_DOWN . self::KEY_ENTER], [Theme::id() => Theme::OLIVERO] + $expected_defaults_core, ]; yield 'storybook - discovery - provision script present' => [ diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/ThemeHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/ThemeHandlerDiscoveryTest.php index 51ef0cd63a..a3cd8bf698 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/ThemeHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/ThemeHandlerDiscoveryTest.php @@ -9,7 +9,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\Theme; use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\File; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(Theme::class)] @@ -28,29 +27,29 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_installed_core[FrontendBuild::id()] = NULL; $expected_installed_core[Storybook::id()] = NULL; - $clear_keys = implode('', array_fill(0, 20, Key::BACKSPACE)); + $clear_keys = implode('', array_fill(0, 20, self::KEY_BACKSPACE)); yield 'theme - prompt - olivero' => [ - [Theme::id() => Key::DOWN . Key::ENTER], + [Theme::id() => self::KEY_DOWN . self::KEY_ENTER], [Theme::id() => Theme::OLIVERO] + $expected_defaults_core, ]; yield 'theme - prompt - claro' => [ - [Theme::id() => Key::DOWN . Key::DOWN . Key::ENTER], + [Theme::id() => self::KEY_DOWN . self::KEY_DOWN . self::KEY_ENTER], [Theme::id() => Theme::CLARO] + $expected_defaults_core, ]; yield 'theme - prompt - stark' => [ - [Theme::id() => Key::DOWN . Key::DOWN . Key::DOWN . Key::ENTER], + [Theme::id() => self::KEY_DOWN . self::KEY_DOWN . self::KEY_DOWN . self::KEY_ENTER], [Theme::id() => Theme::STARK] + $expected_defaults_core, ]; yield 'theme - prompt - custom' => [ - [Theme::id() => Key::ENTER . $clear_keys . 'mytheme'], + [Theme::id() => self::KEY_ENTER . $clear_keys . 'mytheme'], [Theme::id() => 'mytheme'] + $expected_defaults, ]; yield 'theme - prompt - custom - invalid' => [ - [Theme::id() => Key::ENTER . $clear_keys . 'my theme'], + [Theme::id() => self::KEY_ENTER . $clear_keys . 'my theme'], 'Please enter a valid theme machine name: only lowercase letters, numbers, and underscores are allowed.', ]; yield 'theme - prompt - custom - invalid - capitalization' => [ - [Theme::id() => Key::ENTER . $clear_keys . 'MyTheme'], + [Theme::id() => self::KEY_ENTER . $clear_keys . 'MyTheme'], 'Please enter a valid theme machine name: only lowercase letters, numbers, and underscores are allowed.', ]; yield 'theme - discovery - olivero' => [ diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/ToolsHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/ToolsHandlerDiscoveryTest.php index 68ef729a35..56fb29f6ab 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/ToolsHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/ToolsHandlerDiscoveryTest.php @@ -8,7 +8,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\Tools; use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\File; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(Tools::class)] @@ -18,7 +17,7 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); $expected_installed = static::getExpectedInstalled(); yield 'tools - prompt - defaults' => [ - [Tools::id() => Key::ENTER], + [Tools::id() => self::KEY_ENTER], [Tools::id() => [Tools::BEHAT, Tools::DCLINT, Tools::ESLINT, Tools::HADOLINT, Tools::JEST, Tools::PHPCS, Tools::PHPSTAN, Tools::PHPUNIT, Tools::RECTOR, Tools::STYLELINT, Tools::TWIG_CS_FIXER]] + $expected_defaults, ]; yield 'tools - discovery - all tools' => [ diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/VersionSchemeHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/VersionSchemeHandlerDiscoveryTest.php index c6c15617ba..6633ba9945 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/VersionSchemeHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/VersionSchemeHandlerDiscoveryTest.php @@ -6,7 +6,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\VersionScheme; use DrevOps\VortexInstaller\Utils\Config; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(VersionScheme::class)] @@ -16,7 +15,7 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); $expected_installed = static::getExpectedInstalled(); yield 'version scheme - prompt' => [ - [VersionScheme::id() => Key::ENTER], + [VersionScheme::id() => self::KEY_ENTER], $expected_defaults, ]; yield 'version scheme - discovery - calver' => [ diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/WebrootHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/WebrootHandlerDiscoveryTest.php index eed0026ca8..73e24f4f5f 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/WebrootHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/WebrootHandlerDiscoveryTest.php @@ -7,7 +7,6 @@ use DrevOps\VortexInstaller\Prompts\Handlers\HostingProvider; use DrevOps\VortexInstaller\Prompts\Handlers\Webroot; use DrevOps\VortexInstaller\Utils\Config; -use Laravel\Prompts\Key; use PHPUnit\Framework\Attributes\CoversClass; #[CoversClass(Webroot::class)] @@ -17,7 +16,7 @@ public static function dataProviderRunPrompts(): \Iterator { $expected_defaults = static::getExpectedDefaults(); yield 'webroot - prompt' => [ [ - HostingProvider::id() => Key::DOWN . Key::DOWN . Key::DOWN . Key::ENTER, + HostingProvider::id() => self::KEY_DOWN . self::KEY_DOWN . self::KEY_DOWN . self::KEY_ENTER, Webroot::id() => 'my_webroot', ], [ @@ -27,7 +26,7 @@ public static function dataProviderRunPrompts(): \Iterator { ]; yield 'webroot - prompt - capitalization' => [ [ - HostingProvider::id() => Key::DOWN . Key::DOWN . Key::DOWN . Key::ENTER, + HostingProvider::id() => self::KEY_DOWN . self::KEY_DOWN . self::KEY_DOWN . self::KEY_ENTER, Webroot::id() => 'MyWebroot', ], [ @@ -37,7 +36,7 @@ public static function dataProviderRunPrompts(): \Iterator { ]; yield 'webroot - prompt - invalid' => [ [ - HostingProvider::id() => Key::DOWN . Key::DOWN . Key::DOWN . Key::ENTER, + HostingProvider::id() => self::KEY_DOWN . self::KEY_DOWN . self::KEY_DOWN . self::KEY_ENTER, Webroot::id() => 'my webroot', ], 'Please enter a valid webroot name: only lowercase letters, numbers, and underscores are allowed.', diff --git a/.vortex/installer/tests/Unit/Prompts/PromptTypeTest.php b/.vortex/installer/tests/Unit/Prompts/PromptTypeTest.php index 02c2f1c034..e3e038a859 100644 --- a/.vortex/installer/tests/Unit/Prompts/PromptTypeTest.php +++ b/.vortex/installer/tests/Unit/Prompts/PromptTypeTest.php @@ -4,6 +4,7 @@ namespace DrevOps\VortexInstaller\Tests\Unit\Prompts; +use AlexSkrypnyk\Prompty\Prompty; use DrevOps\VortexInstaller\Prompts\PromptType; use DrevOps\VortexInstaller\Tests\Unit\UnitTestCase; use PHPUnit\Framework\Attributes\CoversClass; @@ -15,17 +16,18 @@ #[CoversClass(PromptType::class)] class PromptTypeTest extends UnitTestCase { - #[DataProvider('dataProviderPromptFunctionResolvesToNamedHelper')] - public function testPromptFunctionResolvesToNamedHelper(PromptType $case): void { + #[DataProvider('dataProviderPromptFunctionResolvesToWidget')] + public function testPromptFunctionResolvesToWidget(PromptType $case): void { $reflection = new \ReflectionFunction($case->promptFunction()); - $this->assertSame('Laravel\Prompts\\' . $case->value, $reflection->getName()); + $this->assertSame(Prompty::class, $reflection->getClosureScopeClass()?->getName()); + $this->assertSame($case->value, $reflection->getName()); } /** - * Data provider for testPromptFunctionResolvesToNamedHelper. + * Data provider for testPromptFunctionResolvesToWidget. */ - public static function dataProviderPromptFunctionResolvesToNamedHelper(): \Iterator { + public static function dataProviderPromptFunctionResolvesToWidget(): \Iterator { foreach (PromptType::cases() as $case) { yield $case->name => [$case]; } @@ -45,12 +47,6 @@ public static function dataProviderFromValidString(): \Iterator { yield 'multiselect' => ['multiselect', PromptType::MultiSelect]; yield 'confirm' => ['confirm', PromptType::Confirm]; yield 'suggest' => ['suggest', PromptType::Suggest]; - yield 'number' => ['number', PromptType::Number]; - yield 'textarea' => ['textarea', PromptType::Textarea]; - yield 'password' => ['password', PromptType::Password]; - yield 'search' => ['search', PromptType::Search]; - yield 'multisearch' => ['multisearch', PromptType::MultiSearch]; - yield 'pause' => ['pause', PromptType::Pause]; } public function testFromInvalidString(): void { From f9770d196cbcf6bc7c235116540042c846c371a6 Mon Sep 17 00:00:00 2001 From: Alex Skrypnyk Date: Tue, 10 Nov 2026 17:50:38 +1100 Subject: [PATCH 02/14] Updated snapshots. --- .../code_provider_other/.circleci/config.yml | 653 ++++++++++++++++++ .../.circleci/post-coverage-comment.sh | 79 +++ .../code_provider_other/.dockerignore | 10 + .../code_provider_other/README.md | 10 + .../code_provider_other/docs/ci.md | 14 + .../tests/phpunit/CircleCiConfigTest.php | 330 +++++++++ .../Drupal/EnvironmentSettingsTest.php | 12 + .../includes/providers/-settings.gha.php | 0 .../includes/providers/settings.circleci.php | 17 + 9 files changed, 1125 insertions(+) create mode 100644 .vortex/installer/tests/Fixtures/handler_process/code_provider_other/.circleci/config.yml create mode 100755 .vortex/installer/tests/Fixtures/handler_process/code_provider_other/.circleci/post-coverage-comment.sh create mode 100644 .vortex/installer/tests/Fixtures/handler_process/code_provider_other/.dockerignore create mode 100644 .vortex/installer/tests/Fixtures/handler_process/code_provider_other/README.md create mode 100644 .vortex/installer/tests/Fixtures/handler_process/code_provider_other/docs/ci.md create mode 100644 .vortex/installer/tests/Fixtures/handler_process/code_provider_other/tests/phpunit/CircleCiConfigTest.php create mode 100644 .vortex/installer/tests/Fixtures/handler_process/code_provider_other/tests/phpunit/Drupal/EnvironmentSettingsTest.php create mode 100644 .vortex/installer/tests/Fixtures/handler_process/code_provider_other/web/sites/default/includes/providers/-settings.gha.php create mode 100644 .vortex/installer/tests/Fixtures/handler_process/code_provider_other/web/sites/default/includes/providers/settings.circleci.php diff --git a/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/.circleci/config.yml b/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/.circleci/config.yml new file mode 100644 index 0000000000..f56bdf626c --- /dev/null +++ b/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/.circleci/config.yml @@ -0,0 +1,653 @@ +# CircleCI configuration file for building, testing, and deploying. +# +# This configuration file uses the "docker" executor to run the Docker stack. +# +# A "runner" container, created from a specified container image, is used to +# checkout source code and run commands defined in this file. Application Docker +# containers defined in `docker-compose.yml` run on a *remote* Docker server +# controlled by CircleCI. +# The "runner" container uses Docker client to control the remote Docker server. +version: '2.1' + +aliases: + # SSH key fingerprint to fetch the database. + # Replace this key fingerprint with your own and remove this comment. + - &db_ssh_fingerprint "SHA256:6d+U5QubT0eAWz+4N2wt+WM2qx6o4cvyvQ6xILETJ84" + + # SSH key fingerprint to deploy code. + # Replace this key fingerprint with your own and remove this comment. + - &deploy_ssh_fingerprint "SHA256:6d+U5QubT0eAWz+4N2wt+WM2qx6o4cvyvQ6xILETJ84" + + # Schedule to run nightly database build (to cache the database for the next day). + - &nightly_db_schedule "0 18 * * *" + + # Shared runner container configuration applied to each job. + - &runner_config + working_directory: &working_directory ~/project + environment: + VORTEX_FETCH_DB_SSH_FINGERPRINT: *db_ssh_fingerprint + VORTEX_DEPLOY_SSH_FINGERPRINT: *deploy_ssh_fingerprint + docker: + # Using the 'runner' container where each job will be executed. + # This container has all the necessary tools to run a dockerized environment. + # https://github.com/drevops/ci-runner + # https://hub.docker.com/repository/docker/drevops/ci-runner/tags + - image: drevops/ci-runner:__VERSION__ + auth: + username: ${VORTEX_CONTAINER_REGISTRY_USER} + password: ${VORTEX_CONTAINER_REGISTRY_PASS} + environment: + # Set runner timezone via UI to ensure that executed operations use correct timestamps. + # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + TZ: UTC + # Set runner terminal capabilities. + TERM: xterm-256color + # Disable strict host key checking for SSH connections. + VORTEX_SSH_DISABLE_STRICT_HOST_KEY_CHECKING: "1" + # Remove all SSH keys from the runner container. + VORTEX_SSH_REMOVE_ALL_KEYS: "1" + # How often to refresh the cache of the DB dump. Refer to `date` command. + VORTEX_CI_DB_CACHE_TIMESTAMP: +%Y%m%d + # Use previous database caches on this branch as a fallback if the above cache + # does not match (for example, the cache is available only from the previous + # day). If "no" is set, the cache will be rebuilt from scratch. + VORTEX_CI_DB_CACHE_FALLBACK: "yes" + # Which branch to use as a source of DB caches. + VORTEX_CI_DB_CACHE_BRANCH: "develop" + # Directory to store test results. + VORTEX_CI_TEST_RESULTS: &test_results /tmp/tests + # Directory to store test artifacts. + VORTEX_CI_ARTIFACTS: &artifacts /tmp/artifacts + # Directory to use for artifact deployments. + VORTEX_DEPLOY_ARTIFACT_SRC: /tmp/workspace/code + # Source code location for artifact deployments. + VORTEX_DEPLOY_ARTIFACT_ROOT: *working_directory + # Report file location for artifact deployments. + VORTEX_DEPLOY_ARTIFACT_LOG: /tmp/artifacts/deployment_log.txt + # Check only minimal stack requirements. + VORTEX_DOCTOR_CHECK_MINIMAL: 1 + # CI runner resource class. + # https://circleci.com/docs/2.0/configuration-reference/#resource_class + # Change to 'large' for faster builds. + resource_class: medium + + - &step_setup_remote_docker + setup_remote_docker: + # Docker Layer Caching allows to significantly speed up builds by caching + # images built during previous runs. + # https://circleci.com/docs/2.0/docker-layer-caching/ + docker_layer_caching: false + version: default + + - &step_process_codebase_for_ci + run: + name: Process codebase to run in CI + command: | + find . -name "docker-compose.yml" -print0 | xargs -0 -I {} sh -c "sed -i -e '/###/d' {} && sed -i -e 's/##//' {}" + mkdir -p /tmp/workspace/code + + - &load_variables_from_dotenv + run: + name: Load environment variables from .env file + # Load variables from .env file, respecting existing values, and make them available for the next steps. + command: t=$(mktemp) && export -p >"${t}" && set -a && . ./.env && set +a && . "${t}" && export -p >> "$BASH_ENV" + +################################################################################ +# JOBS +################################################################################ + +jobs: + + # Lint job runs in parallel with database and build jobs. + lint: + <<: *runner_config + steps: + - checkout + - *step_process_codebase_for_ci + - *load_variables_from_dotenv + + - run: + name: Validate Composer configuration + command: composer validate --strict || [ "${VORTEX_CI_COMPOSER_VALIDATE_IGNORE_FAILURE:-0}" -eq 1 ] + + - run: + name: Install Vortex tooling + command: ./scripts/vortex-tooling.sh + + - *step_setup_remote_docker + + - run: + name: Login to container registry + command: ./vendor/bin/vortex-login-container-registry + + - run: + name: Lint Dockerfiles with Hadolint + command: | + for file in $(find .docker \( -name 'Dockerfile' -o -name '*.dockerfile' \)); do + echo "Linting ${file}" && cat "${file}" | docker run --rm -i hadolint/hadolint:__VERSION__ || [ "${VORTEX_CI_HADOLINT_IGNORE_FAILURE:-0}" -eq 1 ] + done + + # The remote Docker engine has no access to the checkout, so the files + # are copied into the container. + - run: + name: Lint Docker Compose files with DCLint + command: | + container="$(docker create --rm zavoloklom/dclint:__VERSION__ .)" + docker cp ./. "${container}:/app" + docker start --attach "${container}" || [ "${VORTEX_CI_DCLINT_IGNORE_FAILURE:-0}" -eq 1 ] + + - run: + name: Build stack + command: docker compose up --no-deps --detach cli + + - run: + name: Install development dependencies + command: | + docker compose exec $(env | cut -f1 -d= | sed 's/^/-e /') -T cli bash -c " \ + if [ -n \"\${PACKAGE_TOKEN:-}\" ]; then composer config --global --auth github-oauth.github.com \"\${PACKAGE_TOKEN}\"; fi && \ + COMPOSER_MEMORY_LIMIT=-1 composer --ansi install --prefer-dist" + docker compose exec $(env | cut -f1 -d= | sed 's/^/-e /') -T cli bash -c "npm ci" + + - run: + name: Validate Composer configuration is normalized + command: docker compose exec -T cli composer normalize --dry-run || [ "${VORTEX_CI_COMPOSER_NORMALIZE_IGNORE_FAILURE:-0}" -eq 1 ] + + - run: + name: Lint code with PHPCS + command: docker compose exec -T cli vendor/bin/phpcs || [ "${VORTEX_CI_PHPCS_IGNORE_FAILURE:-0}" -eq 1 ] + + - run: + name: Lint code with PHPStan + command: docker compose exec -T cli vendor/bin/phpstan || [ "${VORTEX_CI_PHPSTAN_IGNORE_FAILURE:-0}" -eq 1 ] + + - run: + name: Lint code with Rector + command: docker compose exec -T cli vendor/bin/rector --dry-run || [ "${VORTEX_CI_RECTOR_IGNORE_FAILURE:-0}" -eq 1 ] + + - run: + name: Lint code with Twig CS Fixer + command: docker compose exec -T cli vendor/bin/twig-cs-fixer || [ "${VORTEX_CI_TWIG_CS_FIXER_IGNORE_FAILURE:-0}" -eq 1 ] + + - run: + name: Lint code with Gherkin Lint + command: docker compose exec -T cli vendor/bin/gherkinlint lint tests/behat/features || [ "${VORTEX_CI_GHERKIN_LINT_IGNORE_FAILURE:-0}" -eq 1 ] + + - run: + name: Lint module code with NodeJS linters + command: docker compose exec -T cli bash -c "npm run lint" || [ "${VORTEX_CI_NODEJS_LINT_IGNORE_FAILURE:-0}" -eq 1 ] + + - run: + name: Lint theme code with NodeJS linters + command: | + [ "${VORTEX_FRONTEND_BUILD_SKIP:-0}" -eq 1 ] && exit 0 + docker compose exec -T cli bash -c "npm --prefix=\${WEBROOT}/themes/custom/\${DRUPAL_THEME} run lint" || [ "${VORTEX_CI_NODEJS_LINT_IGNORE_FAILURE:-0}" -eq 1 ] + + # Audit job runs in its own workflow, independently of the commit workflow. + audit: + <<: *runner_config + steps: + - checkout + - *load_variables_from_dotenv + + - *step_setup_remote_docker + + - run: + name: Audit Composer packages + when: always + command: composer audit --locked || [ "${VORTEX_CI_COMPOSER_AUDIT_IGNORE_FAILURE:-0}" -eq 1 ] + + # The threshold is passed here rather than in 'package-audit.jsonc', because + # audit-ci passes every advisory when no threshold is set. + - run: + name: Audit npm packages + when: always + command: | + config=() + [ -f package-audit.jsonc ] && config=(--config package-audit.jsonc) + npx --yes audit-ci@__VERSION__ --high --extra-args=--package-lock-only "${config[@]}" || [ "${VORTEX_CI_NPM_AUDIT_IGNORE_FAILURE:-0}" -eq 1 ] + + - run: + name: Audit npm packages of the theme + when: always + command: | + dir="${WEBROOT}/themes/custom/${DRUPAL_THEME}" + config=() + [ -f "${dir}/package-audit.jsonc" ] && config=(--config "${dir}/package-audit.jsonc") + npx --yes audit-ci@__VERSION__ --high --extra-args=--package-lock-only --directory "${dir}" "${config[@]}" || [ "${VORTEX_CI_NPM_AUDIT_IGNORE_FAILURE:-0}" -eq 1 ] + + # The remote Docker engine has no access to the checkout, so the files + # are copied into the container. + - run: + name: Scan for committed secrets with Gitleaks + when: always + command: | + container="$(docker create --rm -w /repo ghcr.io/gitleaks/gitleaks:__VERSION__ dir . --no-banner)" + docker cp ./. "${container}:/repo" + docker start --attach "${container}" || [ "${VORTEX_CI_GITLEAKS_IGNORE_FAILURE:-0}" -eq 1 ] + + # Database handling is a first step of the build. + # - $VORTEX_CI_DB_CACHE_TIMESTAMP is used to determine if a fresh DB dump + # should be fetched for the current build. Usually, a daily database dump + # is sufficient for development activities. + # - $VORTEX_CI_DB_CACHE_FALLBACK is used if the cache did not match $VORTEX_CI_DB_CACHE_TIMESTAMP. + # This allows to rely on the cache from the previous days within the same branch. + database: &job-database + <<: *runner_config + steps: + - attach_workspace: + at: /tmp/workspace + + - add_ssh_keys: + fingerprints: + - *db_ssh_fingerprint + + - checkout + - *step_process_codebase_for_ci + - *load_variables_from_dotenv + + - run: + name: Install Vortex tooling + command: ./scripts/vortex-tooling.sh + + - *step_setup_remote_docker + + - run: + name: Create cache keys for database caching as files + command: | + echo "${VORTEX_CI_DB_CACHE_BRANCH}" | tee /tmp/db_cache_branch + echo "${VORTEX_CI_DB_CACHE_FALLBACK/no/${CIRCLE_BUILD_NUM}}" | tee /tmp/db_cache_fallback + date "${VORTEX_CI_DB_CACHE_TIMESTAMP}" | tee /tmp/db_cache_timestamp + echo "yes" | tee /tmp/db_cache_fallback_yes + + - restore_cache: + keys: + # Restore DB cache based on the cache strategy set by the cache keys below. + # https://circleci.com/docs/2.0/caching/#restoring-cache + # Bump the last segment of the version prefix below to force a cache reset. + # Lookup cache based on the default branch and a timestamp. Allows + # to use cache from the very first build on the day (sanitized database dump, for example). + - __VERSION__-{{ checksum "/tmp/db_cache_branch" }}-{{ checksum "/tmp/db_cache_fallback" }}-{{ checksum "/tmp/db_cache_timestamp" }} + # Fallback to caching by default branch name only. Allows to use + # cache from the branch build on the previous day. + - __VERSION__-{{ checksum "/tmp/db_cache_branch" }}-{{ checksum "/tmp/db_cache_fallback" }}- + + - run: + name: Fetch DB + command: VORTEX_FETCH_DB_SEMAPHORE=/tmp/fetch-db-fresh ./vendor/bin/vortex-fetch-db + no_output_timeout: 30m + + # Execute commands after database fetch script finished: if the + # DB dump was fetched - build the site (to ensure that the DB dump + # is valid) and export the DB using selected method (to support + # "file-to-image" or "image-to-file" conversions). + # Note that configuration changes and the DB updates are not applied, so + # the database will be cached in the same state as fetched. + - run: + name: Export DB + command: | + [ ! -f /tmp/fetch-db-fresh ] && echo "==> Database fetch semaphore file is missing. DB export will not proceed." && exit 0 + ./vendor/bin/vortex-refresh-db + no_output_timeout: 30m + + - save_cache: + # Save cache per default branch and the timestamp. + # The cache will not be saved if it already exists. + # Note that the cache fallback flag is enabled for this case in order + # to save cache even if the fallback is not used when restoring it. + key: __VERSION__-{{ checksum "/tmp/db_cache_branch" }}-{{ checksum "/tmp/db_cache_fallback_yes" }}-{{ checksum "/tmp/db_cache_timestamp" }} + paths: + - /root/project/.data + + # Nightly database job. Same as above, but with additional variables set. + # Triggered by the "nightly-db" schedule configured in CircleCI UI. + database-nightly: + <<: *job-database + environment: + VORTEX_FETCH_DB_SSH_FINGERPRINT: *db_ssh_fingerprint + VORTEX_DEPLOY_SSH_FINGERPRINT: *deploy_ssh_fingerprint + # Enforce fresh DB build (do not rely on fallback caches). + VORTEX_CI_DB_CACHE_FALLBACK: 'no' + # Do not build the Drupal front-end. + VORTEX_FRONTEND_BUILD_SKIP: 1 + + # Build and test is a second step of the build. The testing is performed + # within the same job to save time on provisioning during the job. + build: &job_build + <<: *runner_config + parallelism: 2 + steps: + - attach_workspace: + at: /tmp/workspace + + - checkout + - *step_process_codebase_for_ci + - *load_variables_from_dotenv + + - run: + name: Set test runner roles + command: | + # Which tools run on this node. Tools that only need to run once are + # pinned to the first node. Add a line for every additional tool and + # reference it in that tool's step. + # https://www.vortextemplate.com/docs/continuous-integration#test-parallelism + { + echo "export VORTEX_CI_RUNNER_INDEX=${CIRCLE_NODE_INDEX:-0}" + echo "export VORTEX_CI_RUNNER_TOTAL=${CIRCLE_NODE_TOTAL:-1}" + echo "export VORTEX_CI_IS_JEST_RUNNER=$([ "${CIRCLE_NODE_INDEX:-0}" -eq 0 ] && echo 1 || echo 0)" + echo "export VORTEX_CI_IS_PHPUNIT_RUNNER=$([ "${CIRCLE_NODE_INDEX:-0}" -eq 0 ] && echo 1 || echo 0)" + echo "export VORTEX_CI_IS_SDC_DEVEL_RUNNER=$([ "${CIRCLE_NODE_INDEX:-0}" -eq 0 ] && echo 1 || echo 0)" + # Runs on every node, using the `p` profile. + echo "export VORTEX_CI_IS_BEHAT_RUNNER=1" + # Subtracted from the node index to derive the profile number. + # Raise it by one for every leading node that does not run + # Behat, so the first Behat node still selects the `p0` + # catch-all profile. + echo "export VORTEX_CI_BEHAT_PROFILE_OFFSET=0" + } >> "${BASH_ENV}" + + - run: + name: Validate Composer configuration + command: composer validate --strict || [ "${VORTEX_CI_COMPOSER_VALIDATE_IGNORE_FAILURE:-0}" -eq 1 ] + + - run: + name: Install Vortex tooling + command: ./scripts/vortex-tooling.sh + + - run: + name: Set cache keys for database caching + command: | + echo "${VORTEX_CI_DB_CACHE_BRANCH}" | tee /tmp/db_cache_branch + echo "yes" | tee /tmp/db_cache_fallback_yes + echo "$(date ${VORTEX_CI_DB_CACHE_TIMESTAMP})" | tee /tmp/db_cache_timestamp + + - restore_cache: + keys: + # Use cached artifacts from previous builds of this branch. + # https://circleci.com/docs/2.0/caching/#restoring-cache + - __VERSION__-{{ checksum "/tmp/db_cache_branch" }}-{{ checksum "/tmp/db_cache_fallback_yes" }}-{{ checksum "/tmp/db_cache_timestamp" }} + - __VERSION__-{{ checksum "/tmp/db_cache_branch" }}-{{ checksum "/tmp/db_cache_fallback_yes" }}- + + - *step_setup_remote_docker + + - run: + name: Login to container registry + command: ./vendor/bin/vortex-login-container-registry + + - run: + name: Build stack + command: docker compose up --detach && docker builder prune --all --force && docker image prune --force + + - run: + name: Export built codebase + command: | + echo "${VORTEX_DEPLOY_TYPES:-}" | grep -vq "artifact" && exit 0 || true + mkdir -p "/tmp/workspace/code" + docker compose --progress quiet cp -L cli:"/app/." "/tmp/workspace/code" + du -sh "/tmp/workspace/code" + + - run: + name: Install development dependencies + command: | + docker compose exec $(env | cut -f1 -d= | sed 's/^/-e /') -T cli bash -c " \ + if [ -n \"\${PACKAGE_TOKEN:-}\" ]; then composer config --global --auth github-oauth.github.com \"\${PACKAGE_TOKEN}\"; fi && \ + COMPOSER_MEMORY_LIMIT=-1 composer --ansi install --prefer-dist" + docker compose exec $(env | cut -f1 -d= | sed 's/^/-e /') -T cli bash -c "npm ci" + + - run: + name: Provision site + command: | + # Database dumps are removed from the runner once they are inside the + # container to avoid holding two copies for the rest of the job. + if [ -f .data/db.sql ]; then + docker compose exec cli mkdir -p .data + docker compose --progress quiet cp -L .data/db.sql cli:/app/.data/db.sql + rm -f .data/db.sql + fi + docker compose exec $(env | cut -f1 -d= | sed 's/^/-e /') -T cli ./vendor/bin/vortex-provision + no_output_timeout: 30m + + - run: + name: Test with Jest + command: | + [ "${VORTEX_CI_IS_JEST_RUNNER:-1}" = "1" ] || exit 0 + docker compose exec -T cli bash -c "npm test" || [ "${VORTEX_CI_JEST_IGNORE_FAILURE:-0}" -eq 1 ] + + - run: + name: Test with PHPUnit + command: | + [ "${VORTEX_CI_IS_PHPUNIT_RUNNER:-1}" = "1" ] || exit 0 + docker compose exec -T cli vendor/bin/phpunit || [ "${VORTEX_CI_PHPUNIT_IGNORE_FAILURE:-0}" -eq 1 ] + + - run: + name: Process PHPUnit logs and coverage + command: | + [ "${VORTEX_CI_IS_PHPUNIT_RUNNER:-1}" = "1" ] || exit 0 + mkdir -p "${VORTEX_CI_ARTIFACTS}" + if docker compose ps --services --filter "status=running" | grep -q cli && docker compose exec cli test -d /app/.logs; then + docker compose --progress quiet cp cli:/app/.logs/. "${VORTEX_CI_ARTIFACTS}/" + fi + + - run: + name: Extract code coverage + command: | + [ "${VORTEX_CI_IS_PHPUNIT_RUNNER:-1}" = "1" ] || exit 0 + RATE=$(grep -om1 'line-rate="[0-9.]*"' /tmp/artifacts/coverage/phpunit/cobertura.xml | tr -cd '0-9.') + PERCENT=$(awk "BEGIN {printf \"%.2f\", $RATE*100}") + echo "Coverage: $PERCENT% (threshold: ${VORTEX_CI_CODE_COVERAGE_THRESHOLD:-90}%)" + echo "export COVERAGE_PERCENT=${PERCENT}" >> "${BASH_ENV}" + + - run: + name: Post coverage summary as PR comment + command: | + [ "${VORTEX_CI_IS_PHPUNIT_RUNNER:-1}" = "1" ] || exit 0 + [ "${VORTEX_CI_CODE_COVERAGE_PR_COMMENT_SKIP:-0}" = "1" ] && exit 0 + .circleci/post-coverage-comment.sh /tmp/artifacts/coverage/phpunit/coverage.txt + + - run: + name: Check code coverage threshold + command: | + [ "${VORTEX_CI_IS_PHPUNIT_RUNNER:-1}" = "1" ] || exit 0 + if [ "${COVERAGE_PERCENT//.}" -lt "$((${VORTEX_CI_CODE_COVERAGE_THRESHOLD:-90}*100))" ]; then + echo "FAIL: coverage ${COVERAGE_PERCENT}% is below threshold ${VORTEX_CI_CODE_COVERAGE_THRESHOLD:-90}%" + exit 1 + fi + + - run: + name: Validate Single Directory Components + command: | + [ "${VORTEX_CI_IS_SDC_DEVEL_RUNNER:-1}" = "1" ] || exit 0 + [ "${VORTEX_FRONTEND_BUILD_SKIP:-0}" -eq 1 ] && exit 0 + output=$(docker compose exec -T cli vendor/bin/drush sdc-devel:validate "${DRUPAL_THEME}" 2>&1) + echo "${output}" + if echo "${output}" | grep -qE 'Critical|Errors?|Warnings?'; then + echo "SDC validation reported problems." + [ "${VORTEX_CI_SDC_DEVEL_IGNORE_FAILURE:-0}" -eq 1 ] || exit 1 + fi + + - run: + name: Test with Behat + command: | + [ "${VORTEX_CI_IS_BEHAT_RUNNER:-1}" = "1" ] || exit 0 + if [ "${VORTEX_CI_RUNNER_TOTAL:-1}" -gt 1 ]; then export VORTEX_CI_BEHAT_PROFILE="${VORTEX_CI_BEHAT_PROFILE:-p$((VORTEX_CI_RUNNER_INDEX - VORTEX_CI_BEHAT_PROFILE_OFFSET))}"; fi + echo "Running with ${VORTEX_CI_BEHAT_PROFILE:-default} profile" + docker compose exec -T -e BEHAT_SCREENSHOT_ANIMATION_SKIP=1 cli php -d memory_limit=-1 vendor/bin/behat --colors --strict --profile="${VORTEX_CI_BEHAT_PROFILE:-default}" || \ + docker compose exec -T -e BEHAT_SCREENSHOT_ANIMATION_SKIP=1 cli php -d memory_limit=-1 vendor/bin/behat --colors --strict --rerun --profile="${VORTEX_CI_BEHAT_PROFILE:-default}" || \ + [ "${VORTEX_CI_BEHAT_IGNORE_FAILURE:-0}" -eq 1 ] + no_output_timeout: 30m + + - run: + name: Process test logs and artifacts + command: | + mkdir -p "${VORTEX_CI_TEST_RESULTS}" "${VORTEX_CI_ARTIFACTS}" + if docker compose ps --services --filter "status=running" | grep -q cli && docker compose exec cli test -d /app/.logs; then + docker compose --progress quiet cp cli:/app/.logs/. "${VORTEX_CI_ARTIFACTS}/" + if docker compose exec -T cli sh -c '[ -d /app/.logs/test_results/ ]'; then + docker compose --progress quiet cp cli:/app/.logs/test_results/. "${VORTEX_CI_TEST_RESULTS}/" + fi + fi + when: always + + - store_test_results: + path: *test_results + + - store_artifacts: + path: *artifacts + + - persist_to_workspace: + root: /tmp/workspace + paths: + - code + + # Placed after the test steps so a dirty tree never suppresses them. + - run: + name: Check that the build left a clean working tree + command: ./vendor/bin/vortex-check-worktree-changes || [ "${VORTEX_CI_WORKTREE_CHANGES_IGNORE_FAILURE:-0}" -eq 1 ] + + # Deploy primary branches. + deploy: &job_deploy + <<: *runner_config + steps: + - attach_workspace: + at: /tmp/workspace + + - add_ssh_keys: + fingerprints: + - *deploy_ssh_fingerprint + + - checkout + - *step_process_codebase_for_ci + - *load_variables_from_dotenv + + - run: + name: Check if deployment should be skipped + command: | + if [ "${CIRCLE_PULL_REQUEST}" != "" ] && echo "${CIRCLE_BRANCH}" | grep -q "^project/"; then + echo "Skipping deployment - PR from project/* branch" + circleci-agent step halt + fi + + - run: + name: Install Vortex tooling + command: ./scripts/vortex-tooling.sh + + - run: + name: Deploy + command: | + VORTEX_DEPLOY_BRANCH="${CIRCLE_BRANCH}" \ + VORTEX_DEPLOY_PR="$(echo ${CIRCLE_PULL_REQUEST} | cut -d'/' -f 7)" \ + VORTEX_DEPLOY_PR_HEAD=${CIRCLE_SHA1} \ + ./vendor/bin/vortex-deploy + no_output_timeout: 30m + + - store_artifacts: + path: *artifacts + + # Deploy tags. + deploy-tags: &job-deploy-tags + <<: *runner_config + steps: + - attach_workspace: + at: /tmp/workspace + + - add_ssh_keys: + fingerprints: + - *deploy_ssh_fingerprint + + - checkout + - *step_process_codebase_for_ci + - *load_variables_from_dotenv + + - run: + name: Install Vortex tooling + command: ./scripts/vortex-tooling.sh + + - run: + name: Deploy + command: VORTEX_DEPLOY_MODE="tag" ./vendor/bin/vortex-deploy + no_output_timeout: 30m + + - store_artifacts: + path: *artifacts + +################################################################################ +# WORKFLOWS +################################################################################ + +workflows: + # Commit workflow. Runs for every commit push to the remote repository. + commit: + jobs: + - database: + filters: + tags: + only: /.*/ + - lint: + filters: + tags: + only: /.*/ + - build: + requires: + - database + filters: + tags: + only: /.*/ + - deploy: + requires: + - build + - lint + filters: + branches: + # A branch is deployed when it matches any of the patterns below. + only: + # production, main, master, develop + - /^(production|main|master|develop)$/ + # project/description + - /^project\/[a-zA-Z0-9\-\.]+/ + # feature/description, feature/123-description + # bugfix/description, bugfix/123-description + - /^(feature|bugfix)\/[a-zA-Z0-9\-\.\,_]+$/ + # ci, cisomething + - /^ci.*/ + # release/__VERSION__, release/__VERSION__ (per https://semver.org/) + # hotfix/__VERSION__, hotfix/__VERSION__ (per https://semver.org/) + - /^(release|hotfix)\/[0-9]+(\.[0-9]+){2}(-rc\.[0-9]+)?$/ + # release/2023-04-17, release/2023-04-17.123 (date-based) + # hotfix/2023-04-17, hotfix/2023-04-17.123 (date-based) + - /^(release|hotfix)\/[0-9]{4}-[0-9]{2}-[0-9]{2}(\.[0-9]+)?$/ + # Major version branches. + - /^[0-9]+\.x$/ + tags: + ignore: /.*/ + - deploy-tags: + requires: + - build + - lint + filters: + branches: + ignore: /.*/ + tags: + # Allowed tags: + # - __VERSION__, __VERSION__ (per https://semver.org/) + # - 2023-04-17, 2023-04-17.123 (date-based) + only: /^[0-9]+(\.[0-9]+){2}(-rc\.[0-9]+)?$|^[0-9]{4}-[0-9]{2}-[0-9]{2}(\.[0-9]+)?$/ + + # Security audit workflow. Runs for every commit push to the remote repository, + # independently of the commit workflow. + audit: + jobs: + - audit: + filters: + tags: + only: /.*/ + + # Nightly database workflow runs overnight to capture fresh database and cache it. + nightly-db: + triggers: + - schedule: + cron: *nightly_db_schedule + filters: + branches: + only: + - develop + jobs: + - database-nightly diff --git a/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/.circleci/post-coverage-comment.sh b/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/.circleci/post-coverage-comment.sh new file mode 100755 index 0000000000..d9e7374090 --- /dev/null +++ b/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/.circleci/post-coverage-comment.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash +## +## Post code coverage summary as a PR comment on GitHub. +## +## Minimizes previous coverage comments before posting a new one. +## +## Environment variables: +## CIRCLE_PULL_REQUEST - CircleCI PR URL. +## GITHUB_TOKEN - GitHub token for API access. +## CIRCLE_PROJECT_USERNAME - GitHub org/user. +## CIRCLE_PROJECT_REPONAME - GitHub repo name. +## VORTEX_CI_CODE_COVERAGE_THRESHOLD - Coverage threshold percentage (default: 90). +## +## Usage: +## .circleci/post-coverage-comment.sh /path/to/coverage.txt + +set -euo pipefail + +COVERAGE_FILE="${1:-}" + +if [ -z "${COVERAGE_FILE}" ] || [ ! -f "${COVERAGE_FILE}" ]; then + echo "ERROR: Coverage file not found: ${COVERAGE_FILE}" >&2 + exit 1 +fi + +if [ -z "${CIRCLE_PULL_REQUEST:-}" ]; then + echo "Not a pull request. Skipping." + exit 0 +fi + +if [ -z "${GITHUB_TOKEN:-}" ]; then + echo "GITHUB_TOKEN is not set. Skipping." + exit 0 +fi + +COVERAGE_SUMMARY=$(awk '/^ *Summary:/{f=1;next} f && /^$/{exit} f' "${COVERAGE_FILE}") +COVERAGE_DETAILS=$(awk 'BEGIN{s=0} /^ *Summary:/{s=1} s==1 && /^$/{s=2;next} s==2' "${COVERAGE_FILE}") +PR_NUMBER=$(echo "${CIRCLE_PULL_REQUEST}" | cut -d'/' -f 7) +REPO_SLUG="${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}" +THRESHOLD="${VORTEX_CI_CODE_COVERAGE_THRESHOLD:-90}" + +MARKER="" + +BODY=$(jq -n --arg body "**Code coverage** (threshold: ${THRESHOLD}%) +\`\`\` +${COVERAGE_SUMMARY} +\`\`\` +
+Per-class coverage + +\`\`\` +${COVERAGE_DETAILS} +\`\`\` +
+${MARKER}" '{body: $body}') + +# Minimize previous coverage comments. +COMMENTS_JSON=$(curl -s \ + -H "Authorization: token ${GITHUB_TOKEN}" \ + -H "Accept: application/vnd.github.v3+json" \ + "https://api.github.com/repos/${REPO_SLUG}/issues/${PR_NUMBER}/comments?per_page=100") + +EXISTING_IDS=$(echo "${COMMENTS_JSON}" | jq -r '.[] | select(.body | contains("")) | .node_id') + +for NODE_ID in ${EXISTING_IDS}; do + GRAPHQL_BODY=$(jq -n --arg id "${NODE_ID}" '{query: "mutation($id:ID!){minimizeComment(input:{subjectId:$id,classifier:OUTDATED}){minimizedComment{isMinimized}}}", variables: {id: $id}}') + curl -s -X POST \ + -H "Authorization: bearer ${GITHUB_TOKEN}" \ + -H "Content-Type: application/json" \ + "https://api.github.com/graphql" \ + -d "${GRAPHQL_BODY}" +done + +# Post new coverage comment. +curl -s -X POST \ + -H "Authorization: token ${GITHUB_TOKEN}" \ + -H "Accept: application/vnd.github.v3+json" \ + "https://api.github.com/repos/${REPO_SLUG}/issues/${PR_NUMBER}/comments" \ + -d "${BODY}" diff --git a/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/.dockerignore b/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/.dockerignore new file mode 100644 index 0000000000..56497d2e80 --- /dev/null +++ b/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/.dockerignore @@ -0,0 +1,10 @@ +@@ -45,9 +45,6 @@ + **/.phpunit.cache + **/.twig-cs-fixer.cache + +-# Database cache key files written into the workspace by the CI workflow. +-db_cache_* +- + # Local override files. + docker-compose.override.yml + .env.local diff --git a/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/README.md b/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/README.md new file mode 100644 index 0000000000..7dd841ca83 --- /dev/null +++ b/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/README.md @@ -0,0 +1,10 @@ +@@ -11,8 +11,7 @@ + + Drupal 11 implementation of star wars for star wars Org + +-[![Database, Build, Test and +-Deploy](https://github.com/star_wars_org/star_wars/actions/workflows/build-test-deploy.yml/badge.svg)](https://github.com/star_wars_org/star_wars/actions/workflows/build-test-deploy.yml) ++[![CircleCI](https://circleci.com/gh/star_wars_org/star_wars.svg?style=shield)](https://circleci.com/gh/star_wars_org/star_wars) + + ![Drupal + 11](https://img.shields.io/badge/Drupal-11-0678BE?logo=drupal&logoColor=white) diff --git a/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/docs/ci.md b/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/docs/ci.md new file mode 100644 index 0000000000..769dba577b --- /dev/null +++ b/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/docs/ci.md @@ -0,0 +1,14 @@ +@@ -5,10 +5,10 @@ + + ## CI provider + +-This project uses [GitHub Actions](https://github.com/features/actions). ++This project uses [CircleCI](https://circleci.com/). + +-See [GitHub Actions +-documentation](https://www.vortextemplate.com/docs/continuous-integration/github-actions) ++See [CircleCI ++documentation](https://www.vortextemplate.com/docs/continuous-integration/circleci) + for setup and configuration details. + + ## Project-specific configuration diff --git a/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/tests/phpunit/CircleCiConfigTest.php b/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/tests/phpunit/CircleCiConfigTest.php new file mode 100644 index 0000000000..e592478b2e --- /dev/null +++ b/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/tests/phpunit/CircleCiConfigTest.php @@ -0,0 +1,330 @@ +config = static::loadConfig(); + } + + /** + * Loads the CircleCI config. + * + * @return array + * Decoded config. + */ + protected static function loadConfig(): array { + $file = file_get_contents(__DIR__ . '/../../.circleci/config.yml'); + if (!$file) { + throw new \RuntimeException('Unable to read CircleCI config file.'); + } + + return Yaml::decode($file); + } + + /** + * Tests for deploy branch regex. + * + * @see https://semver.org/ + */ + #[DataProvider('dataProviderDeployBranchRegex')] + public function testDeployBranchRegex(string $branch, bool $expected = TRUE): void { + $patterns = $this->config['workflows']['commit']['jobs'][3]['deploy']['filters']['branches']['only']; + + $result = FALSE; + foreach ($patterns as $pattern) { + if (preg_match($pattern, $branch)) { + $result = TRUE; + break; + } + } + + $this->assertSame($expected, $result); + } + + /** + * Data provider for testDeployBranchRegex(). + */ + public static function dataProviderDeployBranchRegex(): \Iterator { + // Positive branches. + yield ['production']; + yield ['main']; + yield ['master']; + yield ['develop']; + + yield ['ci']; + yield ['cisomething']; + + yield ['release/__VERSION__']; + yield ['release/__VERSION__']; + yield ['hotfix/__VERSION__']; + yield ['hotfix/__VERSION__']; + + yield ['release/2023-04-17']; + yield ['release/2023-04-17.1']; + yield ['hotfix/2023-04-17']; + yield ['hotfix/2023-04-17.1']; + + yield ['feature/description']; + yield ['feature/Description']; + yield ['feature/Description-With-Hyphens']; + yield ['feature/Description-With_Underscores']; + yield ['feature/123-description']; + yield ['feature/123-Description']; + yield ['feature/UNDERSCORES_UNDERSCORES']; + yield ['feature/123-Description-With_UNDERSCORES']; + yield ['feature/1.x']; + yield ['feature/0.x']; + yield ['feature/0.1.x']; + yield ['feature/__VERSION__.x']; + yield ['feature/1.x-description']; + yield ['feature/0.x-description']; + yield ['feature/0.1.x-description']; + yield ['feature/__VERSION__.x-description']; + + yield ['bugfix/description']; + yield ['bugfix/Description']; + yield ['bugfix/Description-With-Hyphens']; + yield ['bugfix/Description-With_Underscores']; + yield ['bugfix/123-description']; + yield ['bugfix/123-Description']; + yield ['bugfix/UNDERSCORES_UNDERSCORES']; + yield ['bugfix/123-Description-With_UNDERSCORES']; + yield ['bugfix/1.x']; + yield ['bugfix/0.x']; + yield ['bugfix/0.1.x']; + yield ['bugfix/__VERSION__.x']; + yield ['bugfix/1.x-description']; + yield ['bugfix/0.x-description']; + yield ['bugfix/0.1.x-description']; + yield ['bugfix/__VERSION__.x-description']; + + yield ['project/description']; + yield ['project/Description']; + yield ['project/Description-With-Hyphens']; + yield ['project/123-description']; + yield ['project/123-Description']; + yield ['project/1.x']; + yield ['project/0.x']; + yield ['project/0.1.x']; + yield ['project/__VERSION__.x']; + yield ['project/1.x-description']; + yield ['project/0.x-description']; + yield ['project/0.1.x-description']; + yield ['project/__VERSION__.x-description']; + + // Negative branches. + yield ['something', FALSE]; + yield ['premain', FALSE]; + yield ['premaster', FALSE]; + yield ['predevelop', FALSE]; + yield ['mainpost', FALSE]; + yield ['masterpost', FALSE]; + yield ['developpost', FALSE]; + yield ['premainpost', FALSE]; + yield ['premasterpost', FALSE]; + yield ['predeveloppost', FALSE]; + + yield ['preci', FALSE]; + yield ['precipost', FALSE]; + + yield ['deps/something', FALSE]; + yield ['deps', FALSE]; + yield ['predeps', FALSE]; + yield ['depspost', FALSE]; + yield ['predepspost', FALSE]; + + yield ['feature', FALSE]; + yield ['release', FALSE]; + yield ['hotfix', FALSE]; + yield ['prefeature', FALSE]; + yield ['prerelease', FALSE]; + yield ['prehotfix', FALSE]; + yield ['featurepost', FALSE]; + yield ['releasepost', FALSE]; + yield ['hotfixpost', FALSE]; + yield ['prefeaturepost', FALSE]; + yield ['prereleasepost', FALSE]; + yield ['prehotfixpost', FALSE]; + + yield ['release/123', FALSE]; + yield ['release/123.456', FALSE]; + yield ['hotfix/123', FALSE]; + yield ['hotfix/123.456', FALSE]; + + yield ['release/202-04-17', FALSE]; + yield ['release/2023-4-17', FALSE]; + yield ['release/2023-04-1', FALSE]; + yield ['release/pre2023-04-17', FALSE]; + yield ['release/2023-04-17post', FALSE]; + yield ['release/pre2023-04-17post', FALSE]; + + yield ['hotfix/202-04-17', FALSE]; + yield ['hotfix/2023-4-17', FALSE]; + yield ['hotfix/2023-04-1', FALSE]; + yield ['hotfix/pre2023-04-17', FALSE]; + yield ['hotfix/2023-04-17post', FALSE]; + yield ['hotfix/pre2023-04-17post', FALSE]; + + yield ['release/__VERSION__', FALSE]; + yield ['release/__VERSION__', FALSE]; + yield ['release/__VERSION__', FALSE]; + yield ['release/__VERSION__', FALSE]; + yield ['release/__VERSION__', FALSE]; + yield ['release/__VERSION__', FALSE]; + yield ['release/__VERSION__', FALSE]; + yield ['release/__VERSION__', FALSE]; + yield ['release/__VERSION__', FALSE]; + yield ['release/__VERSION__', FALSE]; + + yield ['hotfix/__VERSION__', FALSE]; + yield ['hotfix/__VERSION__', FALSE]; + yield ['hotfix/__VERSION__', FALSE]; + yield ['hotfix/__VERSION__', FALSE]; + yield ['hotfix/__VERSION__', FALSE]; + yield ['hotfix/__VERSION__', FALSE]; + yield ['hotfix/__VERSION__', FALSE]; + yield ['hotfix/__VERSION__', FALSE]; + yield ['hotfix/__VERSION__', FALSE]; + yield ['hotfix/__VERSION__', FALSE]; + + yield ['prefeature/something', FALSE]; + yield ['prefbugfix/something', FALSE]; + yield ['prerelease/something', FALSE]; + yield ['prehotfix/something', FALSE]; + yield ['featurepost/something', FALSE]; + yield ['bugfixpost/something', FALSE]; + yield ['releasepost/something', FALSE]; + yield ['hotfixpost/something', FALSE]; + yield ['prefeaturepost/something', FALSE]; + yield ['prebugfixpost/something', FALSE]; + yield ['prereleasepost/something', FALSE]; + yield ['prehotfixpost/something', FALSE]; + yield ['preproject/something', FALSE]; + yield ['projectpost/something', FALSE]; + } + + /** + * Tests for deploy tag regex. + * + * @see https://semver.org/ + */ + #[DataProvider('dataProviderDeployTagRegex')] + public function testDeployTagRegex(string $branch, bool $expected = TRUE): void { + $pattern = $this->config['workflows']['commit']['jobs'][4]['deploy-tags']['filters']['tags']['only']; + $result = preg_match($pattern, $branch); + $this->assertEquals($expected, $result); + } + + /** + * Data provider for testDeployTagRegex(). + */ + public static function dataProviderDeployTagRegex(): \Iterator { + // Positive tags. + yield ['__VERSION__']; + yield ['__VERSION__']; + yield ['2023-04-17']; + yield ['2023-04-17.123']; + + // Negative tags. + yield ['123', FALSE]; + yield ['123.456', FALSE]; + yield ['__VERSION__', FALSE]; + yield ['__VERSION__', FALSE]; + yield ['__VERSION__', FALSE]; + yield ['__VERSION__', FALSE]; + yield ['__VERSION__', FALSE]; + + yield ['202-04-17', FALSE]; + yield ['2023-0-17', FALSE]; + yield ['2023-04-1', FALSE]; + yield ['pre2023-04-17', FALSE]; + yield ['2023-04-17post', FALSE]; + yield ['pre2023-04-17post', FALSE]; + yield ['2023-04-17.123.', FALSE]; + yield ['2023-04-17.pre123', FALSE]; + yield ['2023-04-17.pre123post', FALSE]; + yield ['2023-04-17.123post', FALSE]; + } + + /** + * Tests that filter patterns are within the supported length. + */ + #[DataProvider('dataProviderFilterPatternLength')] + public function testFilterPatternLength(string $pattern): void { + $regex = preg_match('#^/(.*)/$#', $pattern, $matches) === 1 ? $matches[1] : $pattern; + + $this->assertLessThanOrEqual(static::FILTER_PATTERN_MAX_LENGTH, strlen($regex)); + } + + /** + * Data provider for testFilterPatternLength(). + */ + public static function dataProviderFilterPatternLength(): \Iterator { + foreach (static::collectFilterPatterns(static::loadConfig()) as $path => $pattern) { + yield $path => [$pattern]; + } + } + + /** + * Collects the patterns of every workflow filter in the config. + * + * @param mixed $config + * Config structure to traverse. + * @param string $path + * Path of the structure within the config, used to label the patterns. + * @param bool $is_filter + * Whether the structure is within a filter. + * + * @return array + * Patterns keyed by their path within the config. + */ + protected static function collectFilterPatterns(mixed $config, string $path = '', bool $is_filter = FALSE): array { + if (!is_array($config)) { + return $is_filter ? [$path . ': ' . $config => (string) $config] : []; + } + + $patterns = []; + + foreach ($config as $key => $value) { + $child = $path === '' ? (string) $key : $path . '.' . $key; + $patterns += static::collectFilterPatterns($value, $child, $is_filter || $key === 'filters'); + } + + return $patterns; + } + +} diff --git a/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/tests/phpunit/Drupal/EnvironmentSettingsTest.php b/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/tests/phpunit/Drupal/EnvironmentSettingsTest.php new file mode 100644 index 0000000000..d65f3bd498 --- /dev/null +++ b/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/tests/phpunit/Drupal/EnvironmentSettingsTest.php @@ -0,0 +1,12 @@ +@@ -407,9 +407,9 @@ + } + + /** +- * Test per-environment settings for GitHub Actions. ++ * Test per-environment settings for CircleCI. + */ +- public function testEnvironmentGha(): void { ++ public function testEnvironmentCircleCi(): void { + $this->setEnvVars([ + 'CI' => TRUE, + ]); diff --git a/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/web/sites/default/includes/providers/-settings.gha.php b/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/web/sites/default/includes/providers/-settings.gha.php new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/web/sites/default/includes/providers/settings.circleci.php b/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/web/sites/default/includes/providers/settings.circleci.php new file mode 100644 index 0000000000..7cad35cf80 --- /dev/null +++ b/.vortex/installer/tests/Fixtures/handler_process/code_provider_other/web/sites/default/includes/providers/settings.circleci.php @@ -0,0 +1,17 @@ + Date: Tue, 10 Nov 2026 17:54:32 +1100 Subject: [PATCH 03/14] Removed the 'Ctrl+U' go-back hint from the installer welcome box and installation docs. --- .vortex/docs/content/installation.mdx | 3 +-- .vortex/installer/src/Prompts/InstallerPresenter.php | 1 - .../installer/tests/Unit/Prompts/InstallerPresenterTest.php | 2 -- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.vortex/docs/content/installation.mdx b/.vortex/docs/content/installation.mdx index aaedc7e28d..4fd527760f 100644 --- a/.vortex/docs/content/installation.mdx +++ b/.vortex/docs/content/installation.mdx @@ -97,8 +97,7 @@ curl -SsL https://www.vortextemplate.com/install > installer.php && php installe Complete the installation in the installer: 1. Press any key to start the prompts. -2. Answer each prompt, using the names from step 1. To go back to the - previous prompt, press Ctrl+U. +2. Answer each prompt, using the names from step 1. 3. Review the **Installation summary** that follows the last prompt. 4. Confirm **Proceed with installing Vortex?**. The installer copies the files into the directory and shows **Finished installing Vortex**. diff --git a/.vortex/installer/src/Prompts/InstallerPresenter.php b/.vortex/installer/src/Prompts/InstallerPresenter.php index 19b5047882..322dca84ce 100644 --- a/.vortex/installer/src/Prompts/InstallerPresenter.php +++ b/.vortex/installer/src/Prompts/InstallerPresenter.php @@ -117,7 +117,6 @@ public function header(Artifact $artifact, string $version): void { } $content .= 'Press ' . Tui::yellow('Ctrl+C') . ' at any time to exit the installer.' . PHP_EOL; - $content .= 'Press ' . Tui::yellow('Ctrl+U') . ' at any time to go back to the previous step.' . PHP_EOL; } Tui::box($content, $title); diff --git a/.vortex/installer/tests/Unit/Prompts/InstallerPresenterTest.php b/.vortex/installer/tests/Unit/Prompts/InstallerPresenterTest.php index 6ca30c4d3a..08e1014bee 100644 --- a/.vortex/installer/tests/Unit/Prompts/InstallerPresenterTest.php +++ b/.vortex/installer/tests/Unit/Prompts/InstallerPresenterTest.php @@ -118,7 +118,6 @@ public function testHeaderInteractiveShowsControls(): void { $output = $this->output->fetch(); $this->assertStringContainsString('Ctrl+C', $output); - $this->assertStringContainsString('Ctrl+U', $output); } public function testHeaderNonInteractiveHidesControls(): void { @@ -131,7 +130,6 @@ public function testHeaderNonInteractiveHidesControls(): void { $output = $this->output->fetch(); $this->assertStringNotContainsString('Ctrl+C', $output); - $this->assertStringNotContainsString('Ctrl+U', $output); $this->assertStringContainsString('non-interactive', $output); } From 6385747d2825fa1d722b3fddf4e98ef90256ae80 Mon Sep 17 00:00:00 2001 From: Alex Skrypnyk Date: Tue, 10 Nov 2026 18:16:37 +1100 Subject: [PATCH 04/14] Updated the installer video script to wait for Prompty's prompt frames instead of Laravel Prompts box borders. --- .vortex/docs/.utils/update-videos.php | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/.vortex/docs/.utils/update-videos.php b/.vortex/docs/.utils/update-videos.php index 323bde87c5..646155b81c 100755 --- a/.vortex/docs/.utils/update-videos.php +++ b/.vortex/docs/.utils/update-videos.php @@ -240,22 +240,19 @@ function build_installer_expect_script(int|float $prompt_delay, string $uri): st } } -# A multiselect that scrolls prints its selection count in the bottom border, -# so the corner follows the count instead of a line. +# A widget hides the cursor before it draws its first frame, and the completed +# frame repeats the label without it, so only a prompt waiting for input +# matches. while {1} { expect { - "Proceed with installing Vortex?" { - after 2000 - safe_send "\r" - } - "Vortex will be installed into your project" { + -re {\x1b\[\?25l[^\r\n]*Proceed with installing Vortex} { after 2000 safe_send "\r" } "Finished installing Vortex" { break } - -re {─┘| selected ┘} { + -re {\x1b\[\?25l[^\r\n]*\([0-9]+/[0-9]+\)} { wait_and_enter } timeout { From 2e7fdc39eda45989e3d7d826d8216d330884b460 Mon Sep 17 00:00:00 2001 From: Alex Skrypnyk Date: Wed, 11 Nov 2026 12:09:59 +1100 Subject: [PATCH 05/14] Ran the installer prompts as 1 Prompty flow and moved the installer's notes, tables, boxes, tasks and pause onto Prompty. --- .vortex/docs/.utils/update-videos.php | 12 +- .../contributing/maintenance/installer.mdx | 14 +- .vortex/docs/content/installation.mdx | 3 +- .vortex/installer/CLAUDE.md | 12 +- .vortex/installer/composer.lock | 8 +- .vortex/installer/phpunit.xml | 2 + .../installer/src/Command/InstallCommand.php | 6 +- .../src/Prompts/InstallerPresenter.php | 1 + .../installer/src/Prompts/PromptManager.php | 181 ++---- .vortex/installer/src/Task/Task.php | 135 ++-- .vortex/installer/src/Task/TaskOutput.php | 128 ---- .vortex/installer/src/Utils/Tui.php | 235 +++---- .vortex/installer/tests/Traits/TuiTrait.php | 17 +- .../Unit/Prompts/InstallerPresenterTest.php | 2 + .../tests/Unit/Task/TaskOutputTest.php | 128 ---- .../installer/tests/Unit/Task/TaskTest.php | 39 +- .../installer/tests/Unit/Utils/TuiTest.php | 593 +++--------------- 17 files changed, 359 insertions(+), 1157 deletions(-) delete mode 100644 .vortex/installer/src/Task/TaskOutput.php delete mode 100644 .vortex/installer/tests/Unit/Task/TaskOutputTest.php diff --git a/.vortex/docs/.utils/update-videos.php b/.vortex/docs/.utils/update-videos.php index 646155b81c..899376a72d 100755 --- a/.vortex/docs/.utils/update-videos.php +++ b/.vortex/docs/.utils/update-videos.php @@ -201,6 +201,9 @@ function build_installer_expect_script(int|float $prompt_delay, string $uri): st } set env(VORTEX_INSTALLER_PROMPT_BUILD_NOW) 0 +# The prompts below match Unicode symbols, so the installer output is decoded +# as UTF-8 whatever the locale. +encoding system utf-8 spawn php installer.php --destination=star_wars --uri=$installer_uri expect { @@ -240,19 +243,18 @@ function build_installer_expect_script(int|float $prompt_delay, string $uri): st } } -# A widget hides the cursor before it draws its first frame, and the completed -# frame repeats the label without it, so only a prompt waiting for input -# matches. +# A prompt waiting for input starts with the active symbol, U+25C7, and an +# answered one with the completed symbol, so only a waiting prompt matches. while {1} { expect { - -re {\x1b\[\?25l[^\r\n]*Proceed with installing Vortex} { + -re {◇[^\r\n]*Proceed with installing Vortex} { after 2000 safe_send "\r" } "Finished installing Vortex" { break } - -re {\x1b\[\?25l[^\r\n]*\([0-9]+/[0-9]+\)} { + -re {◇[^\r\n]*\([0-9]+/[0-9]+\)} { wait_and_enter } timeout { diff --git a/.vortex/docs/content/contributing/maintenance/installer.mdx b/.vortex/docs/content/contributing/maintenance/installer.mdx index 01c0c0a44a..5cef3304ca 100644 --- a/.vortex/docs/content/contributing/maintenance/installer.mdx +++ b/.vortex/docs/content/contributing/maintenance/installer.mdx @@ -52,10 +52,18 @@ value: `composer.json`, `.env`, hosting-specific files like `.lagoon.yml`). 3. **Handler defaults** - fallback values defined by each handler. +An environment variable named `VORTEX_INSTALLER_PROMPT_` followed by the +uppercased prompt ID answers that prompt, so the installer doesn't ask it. +For example, `VORTEX_INSTALLER_PROMPT_HOSTING_PROVIDER=lagoon` answers the +hosting prompt. The variable wins over the 3 preceding sources. A prompt +with several choices reads a comma-separated list. A yes or no prompt reads +`1`, `true` and `yes` as yes, and `0`, `false` and `no` as no. An invalid +value stops the installer at that prompt. + The profile, theme and web root prompts go a step further. When discovery finds a value, or an earlier answer settles it, the installer uses that value without asking. For these 3 prompts, that value wins over -`--prompts`. Choosing Acquia +`--prompts` and the environment variable. Choosing Acquia hosting, for example, settles the web root. `--prompts` with `--no-interaction` runs a whole installation without a @@ -77,8 +85,8 @@ keyed by their `VORTEX_INSTALLER_*` names, such as `VORTEX_INSTALLER_TEMPLATE_REPO`. An environment variable with the same name wins over the value in the JSON. -The final **Run the site build now?** question is the only question with -an environment variable of its own: +The final **Run the site build now?** question comes after the summary, and +its environment variable sets the question's default: - `VORTEX_INSTALLER_PROMPT_BUILD_NOW` sets its default. `0` or an empty value defaults to no. Any other value, or an unset variable, defaults to diff --git a/.vortex/docs/content/installation.mdx b/.vortex/docs/content/installation.mdx index 4fd527760f..aaedc7e28d 100644 --- a/.vortex/docs/content/installation.mdx +++ b/.vortex/docs/content/installation.mdx @@ -97,7 +97,8 @@ curl -SsL https://www.vortextemplate.com/install > installer.php && php installe Complete the installation in the installer: 1. Press any key to start the prompts. -2. Answer each prompt, using the names from step 1. +2. Answer each prompt, using the names from step 1. To go back to the + previous prompt, press Ctrl+U. 3. Review the **Installation summary** that follows the last prompt. 4. Confirm **Proceed with installing Vortex?**. The installer copies the files into the directory and shows **Finished installing Vortex**. diff --git a/.vortex/installer/CLAUDE.md b/.vortex/installer/CLAUDE.md index 87ba8e622a..e5a1fbb6dc 100644 --- a/.vortex/installer/CLAUDE.md +++ b/.vortex/installer/CLAUDE.md @@ -65,8 +65,8 @@ permission before running. Triggers that require re-recording: - New `Handlers/*.php` class or handler removal. - Wording change to `label()` or `hint()` of any existing handler. -- Adding, removing or reordering prompts inside - `PromptManager::runPrompts()`, which also moves the progress denominator. +- Adding, removing or reordering prompts inside `PromptManager::steps()`, + which also changes the step count in each label. ## Conditional Token System @@ -133,9 +133,11 @@ Content removed if feature not selected ### Ordering -`PromptManager::runPrompts()` is the catalogue of prompts: the `form()` -chain lists every prompt, in order, under its section heading. Add a new -prompt there, and the progress denominator follows automatically. +`PromptManager::steps()` is the catalogue of prompts: it lists every prompt, +in order, under its section heading. `runPrompts()` runs them as 1 +`Prompty::flow()`, with each handler's `shouldRun()` as the step's +condition. Add a new prompt to `steps()`, and the step count follows +automatically. Processing runs in a different order, so each handler declares its own `processWeight()` - lowest first, broadly the reverse of the prompt order so diff --git a/.vortex/installer/composer.lock b/.vortex/installer/composer.lock index 926ea22c52..a9c3ec46f8 100644 --- a/.vortex/installer/composer.lock +++ b/.vortex/installer/composer.lock @@ -82,12 +82,12 @@ "source": { "type": "git", "url": "https://github.com/AlexSkrypnyk/prompty.git", - "reference": "da65ae3c3dc1ae7faa1faee42224c06af8ef6c3f" + "reference": "47b3478674a7d13be723d8715e67b2e7cd170340" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/AlexSkrypnyk/prompty/zipball/da65ae3c3dc1ae7faa1faee42224c06af8ef6c3f", - "reference": "da65ae3c3dc1ae7faa1faee42224c06af8ef6c3f", + "url": "https://api.github.com/repos/AlexSkrypnyk/prompty/zipball/47b3478674a7d13be723d8715e67b2e7cd170340", + "reference": "47b3478674a7d13be723d8715e67b2e7cd170340", "shasum": "" }, "require": { @@ -166,7 +166,7 @@ "url": "https://www.patreon.com/alexskrypnyk" } ], - "time": "2026-11-10T06:24:28+00:00" + "time": "2026-11-10T23:19:50+00:00" }, { "name": "alexskrypnyk/str2name", diff --git a/.vortex/installer/phpunit.xml b/.vortex/installer/phpunit.xml index 38c5d687cc..e7d0f02dc7 100644 --- a/.vortex/installer/phpunit.xml +++ b/.vortex/installer/phpunit.xml @@ -44,5 +44,7 @@ + + diff --git a/.vortex/installer/src/Command/InstallCommand.php b/.vortex/installer/src/Command/InstallCommand.php index 101bc8ab8c..02a4890cf2 100644 --- a/.vortex/installer/src/Command/InstallCommand.php +++ b/.vortex/installer/src/Command/InstallCommand.php @@ -193,11 +193,9 @@ protected function execute(InputInterface $input, OutputInterface $output): int hint: fn(): string => sprintf('Checking repository "%s" and reference "%s"', $this->artifact->getRepo(), $this->artifact->getRef()), success: fn(string $return): string => $return ); - Tui::line(''); } - Tui::line(Tui::dim('Press any key to continue...')); - Tui::getChar(); + Tui::pause('Press any key to continue...'); if (!$this->promptManager->runPrompts()) { Tui::info('Aborting project installation. No files were changed.'); @@ -290,7 +288,7 @@ function (string $dir, string $ref): void { if ($should_build) { $build_ok = Task::action( label: 'Building site', - action: fn(): bool => $this->runBuildCommand($output), + action: fn(): bool => $this->runBuildCommand(Tui::output()), streaming: TRUE, ); diff --git a/.vortex/installer/src/Prompts/InstallerPresenter.php b/.vortex/installer/src/Prompts/InstallerPresenter.php index 322dca84ce..19b5047882 100644 --- a/.vortex/installer/src/Prompts/InstallerPresenter.php +++ b/.vortex/installer/src/Prompts/InstallerPresenter.php @@ -117,6 +117,7 @@ public function header(Artifact $artifact, string $version): void { } $content .= 'Press ' . Tui::yellow('Ctrl+C') . ' at any time to exit the installer.' . PHP_EOL; + $content .= 'Press ' . Tui::yellow('Ctrl+U') . ' at any time to go back to the previous step.' . PHP_EOL; } Tui::box($content, $title); diff --git a/.vortex/installer/src/Prompts/PromptManager.php b/.vortex/installer/src/Prompts/PromptManager.php index f519d0a286..bdef3c85eb 100644 --- a/.vortex/installer/src/Prompts/PromptManager.php +++ b/.vortex/installer/src/Prompts/PromptManager.php @@ -4,6 +4,7 @@ namespace DrevOps\VortexInstaller\Prompts; +use AlexSkrypnyk\Prompty\Prompty; use DrevOps\VortexInstaller\Prompts\Handlers\AbstractHandler; use DrevOps\VortexInstaller\Prompts\Handlers\AiCodeInstructions; use DrevOps\VortexInstaller\Prompts\Handlers\AiCodeReview; @@ -60,14 +61,6 @@ */ class PromptManager { - /** - * Total number of top-level responses. - * - * Counted from the steps in runPrompts() and used to display the progress of - * the prompts. - */ - protected int $totalResponses = 0; - /** * Array of responses. */ @@ -81,13 +74,6 @@ class PromptManager { */ protected array $discoveredResponses = []; - /** - * Current response index. - * - * Used to display the progress of the prompts. - */ - protected int $currentResponseIndex = 0; - /** * Array of handlers. * @@ -134,37 +120,17 @@ public function runPrompts(): bool { Tui::output()->setVerbosity(OutputInterface::VERBOSITY_QUIET); } - $sections = $this->steps(); - - $this->totalResponses = array_sum(array_map(count(...), $sections)); - - $responses = []; - - foreach ($sections as $section => $steps) { - Tui::info($section); - - foreach ($steps as $id => $step) { - if (!$this->handler($id)->shouldRun($responses)) { - $responses[$id] = NULL; - continue; - } - - $response = $step($responses); - - // A widget answers NULL only when the user cancels it. - if ($response === NULL) { - Tui::output()->setVerbosity($original_verbosity); + $responses = Prompty::flow($this->flowSteps(...), numbering: 'total', env_prefix: 'VORTEX_INSTALLER_PROMPT_'); - return FALSE; - } + Tui::output()->setVerbosity($original_verbosity); - $responses[$id] = $response; - } + // The flow answers NULL only when the user cancels a step. + if ($responses === NULL) { + return FALSE; } - if ($this->config->getNoInteraction()) { - Tui::output()->setVerbosity($original_verbosity); - } + // A step skipped by its condition is absent from the flow's answers. + $responses += array_fill_keys(array_keys(array_merge(...array_values($this->steps()))), NULL); $this->responses = $this->normalizeResponses($responses); @@ -189,13 +155,39 @@ public function runPrompts(): bool { } /** - * Define the prompts in the order they are asked, grouped by section. + * Build the flow from the prompt catalogue. * - * Every step runs only when its handler's shouldRun() accepts the responses - * collected so far; a skipped step responds with NULL. + * Each step and its condition receive every earlier step's answer, with NULL + * for a step its condition skipped. + * + * @return array + * A section heading for each group, followed by its steps keyed by handler + * ID. A step runs only when its handler's shouldRun() accepts the answers + * collected so far. + */ + protected function flowSteps(): array { + $flow = []; + $earlier = []; + + foreach ($this->steps() as $section => $steps) { + $flow[] = Prompty::section($section); + + foreach ($steps as $id => $step) { + $skipped = $earlier; + $flow[$id] = Prompty::step(fn(array $r): mixed => $step($r + $skipped), condition: fn(array $r): bool => $this->handler($id)->shouldRun($r + $skipped)); + $earlier[$id] = NULL; + } + } + + return $flow; + } + + /** + * Define the prompts in the order they are asked, grouped by section. * * @return array> - * Steps keyed by handler ID, grouped under their section heading. + * Steps keyed by handler ID, grouped under their section heading. Each step + * receives the answers collected so far and returns the widget to ask. */ protected function steps(): array { return [ @@ -208,12 +200,12 @@ protected function steps(): array { ], 'Drupal' => [ Starter::id() => fn(array $r): mixed => $this->prompt(Starter::class, $r), - Profile::id() => fn(array $r): ?string => $this->resolveOrPrompt(Profile::id(), $r, fn(): mixed => $this->prompt(Profile::class)), + Profile::id() => fn(array $r): mixed => $this->resolveOrPrompt(Profile::id(), $r, fn(): mixed => $this->prompt(Profile::class)), ProfileCustom::id() => fn(array $r): mixed => $this->prompt(ProfileCustom::class), Modules::id() => fn(array $r): mixed => $this->prompt(Modules::class, $r), ModulePrefix::id() => fn(array $r): mixed => $this->prompt(ModulePrefix::class, $r), CustomModules::id() => fn(array $r): mixed => $this->prompt(CustomModules::class, $r), - Theme::id() => fn(array $r): ?string => $this->resolveOrPrompt(Theme::id(), $r, fn(): mixed => $this->prompt(Theme::class)), + Theme::id() => fn(array $r): mixed => $this->resolveOrPrompt(Theme::id(), $r, fn(): mixed => $this->prompt(Theme::class)), ThemeCustom::id() => fn(array $r): mixed => $this->prompt(ThemeCustom::class, $r), FrontendBuild::id() => fn(array $r): mixed => $this->prompt(FrontendBuild::class, $r), Storybook::id() => fn(array $r): mixed => $this->prompt(Storybook::class, $r), @@ -230,7 +222,7 @@ protected function steps(): array { 'Hosting' => [ HostingProvider::id() => fn(array $r): mixed => $this->prompt(HostingProvider::class), HostingProjectName::id() => fn(array $r): mixed => $this->prompt(HostingProjectName::class, $r), - Webroot::id() => fn(array $r): ?string => $this->resolveOrPrompt(Webroot::id(), $r, fn(): mixed => $this->prompt(Webroot::class, $r)), + Webroot::id() => fn(array $r): mixed => $this->resolveOrPrompt(Webroot::id(), $r, fn(): mixed => $this->prompt(Webroot::class, $r)), ], 'Deployment' => [ DeployTypes::id() => fn(array $r): mixed => $this->prompt(DeployTypes::class, $r), @@ -523,27 +515,6 @@ public function getProcessHandlers(): array { return $handlers; } - /** - * Generate a label for a prompt. - * - * @param string $text - * The text to display in the label. - * @param string|null $suffix - * An optional suffix to display in the label. - * - * @return string - * The formatted label text. - */ - protected function label(string $text, ?string $suffix = NULL): string { - if ($suffix === NULL) { - $this->currentResponseIndex++; - } - - $suffix = $suffix !== NULL ? $this->currentResponseIndex . '.' . $suffix : $this->currentResponseIndex; - - return $text . ' ' . Tui::dim('(' . $suffix . '/' . $this->totalResponses . ')'); - } - /** * Collect and initialize handlers. */ @@ -624,22 +595,12 @@ protected function resolvePromptOverrides(): void { * Current form responses for context-aware methods. * * @return mixed - * The prompt result. + * The widget call for the flow step. */ protected function prompt(string $handler_class, array $responses = []): mixed { - $type = $this->handler($handler_class::id())->type(); - $args = $this->args($handler_class, NULL, $responses); + $fn = $this->handler($handler_class::id())->type()->promptFunction(); - $response = $type->promptFunction()(...$args); - - // The widget answers in option order. Keeping the selected defaults in - // their own order first leaves a discovered list in the order the project - // already has it. - if ($type === PromptType::MultiSelect && is_array($response) && is_array($args['default'] ?? NULL)) { - $response = array_values(array_unique(array_merge(array_intersect($args['default'], $response), $response))); - } - - return $response; + return $fn(...$this->args($handler_class, NULL, $responses)); } /** @@ -662,12 +623,13 @@ protected function args(string $handler_class, mixed $default_override = NULL, a $handler = $this->handler($id); $args = [ - 'label' => $this->label($handler->label()), + 'label' => $handler->label(), 'help' => $handler->hint($responses), 'placeholder' => $handler->placeholder($responses), 'transform' => $handler->transform(), - 'validate' => $this->validator($handler), + 'validate' => $handler->validate(), 'description' => $handler::description($responses), + 'required' => $handler->isRequired() ?: NULL, ]; $options = $handler->options($responses); @@ -676,6 +638,11 @@ protected function args(string $handler_class, mixed $default_override = NULL, a $args['scroll'] = 10; } + // A discovered list keeps the order the project already has it in. + if ($handler->type() === PromptType::MultiSelect) { + $args['order'] = 'default'; + } + $default_from_handler = $handler->default($responses); $default_from_prompts = $this->promptOverrides[$id] ?? NULL; $default_from_discovery = $handler->discover(); @@ -715,35 +682,6 @@ protected function args(string $handler_class, mixed $default_override = NULL, a return array_filter($args, fn($value): bool => $value !== NULL); } - /** - * Build the validator for a handler's prompt. - * - * A required prompt rejects an empty answer before the handler's own - * validation runs. - * - * @param \DrevOps\VortexInstaller\Prompts\Handlers\HandlerInterface $handler - * The handler. - * - * @return \Closure|null - * The validator, or NULL when the answer is not validated. - */ - protected function validator(HandlerInterface $handler): ?\Closure { - $validate = $handler->validate(); - $is_required = $handler->isRequired(); - - if ($validate === NULL && !$is_required) { - return NULL; - } - - return function (mixed $value) use ($validate, $is_required): ?string { - if ($is_required && ($value === '' || $value === [])) { - return 'Required.'; - } - - return $validate === NULL ? NULL : $validate($value); - }; - } - /** * Resolve a value via handler or prompt the user. * @@ -754,10 +692,11 @@ protected function validator(HandlerInterface $handler): ?\Closure { * @param callable $prompt * The prompt callable to use if the value is not resolved. * - * @return string|null - * The resolved value, or NULL when the prompt was cancelled. + * @return mixed + * The widget call for the flow step. A resolved value answers the step + * without asking. */ - protected function resolveOrPrompt(string $handler_id, array $r, callable $prompt): ?string { + protected function resolveOrPrompt(string $handler_id, array $r, callable $prompt): mixed { $handler = $this->handler($handler_id); $resolved = $handler->resolvedValue($r); @@ -772,12 +711,12 @@ protected function resolveOrPrompt(string $handler_id, array $r, callable $promp // discovery for handlers that never reach a prompt. $this->discoveredResponses[$handler_id] = $resolved; - return $resolved; + // A text widget accepts any value, including a name outside the + // handler's options. + return Prompty::text($handler->label(), discovered: $resolved); } - $value = $prompt(); - - return $value === NULL ? NULL : (string) $value; + return $prompt(); } /** diff --git a/.vortex/installer/src/Task/Task.php b/.vortex/installer/src/Task/Task.php index 0d5ba62cff..09a5902ba8 100644 --- a/.vortex/installer/src/Task/Task.php +++ b/.vortex/installer/src/Task/Task.php @@ -4,15 +4,12 @@ namespace DrevOps\VortexInstaller\Task; -use DrevOps\VortexInstaller\Utils\Strings; +use AlexSkrypnyk\Prompty\Prompty; use DrevOps\VortexInstaller\Utils\Tui; +use Symfony\Component\Console\Output\StreamOutput; class Task { - protected static string $message; - - protected static ?string $hint; - public static function action( \Closure|string $label, ?\Closure $action = NULL, @@ -27,102 +24,92 @@ public static function action( throw new \InvalidArgumentException('Action must be callable.'); } - $label = Tui::normalizeText($label); - - if ($streaming) { - $original_output = Tui::output(); + // Prompty draws 1 task at a time, so a task inside a streamed task is + // part of that task's output. + if (Tui::isCaptured()) { + return self::plain($label, $action, $hint, $success, $failure); + } - $task_output = new TaskOutput($original_output); + $output = Tui::output(); + $is_interactive = Tui::isInteractive(); - self::start($label); + $run = function () use ($action, $output, $is_interactive, $streaming): mixed { + if ($streaming) { + Tui::capture(TRUE); + } - Tui::setOutput($task_output); + try { + return $action(); + } + finally { + if ($streaming) { + Tui::capture(FALSE); + } + + // A command run by the action initializes the TUI with its own output, + // so the result line needs this command's output back. + Tui::init($output, $is_interactive); + } + }; - ob_start(function (string|iterable $buffer) use ($task_output): string { - $task_output->write($buffer); - return ''; - }, 1); + // Lines written to php://output go through the output buffer that a + // streamed task captures. + if ($streaming) { + $stream = fopen('php://output', 'w'); - $return = $action(); + if ($stream === FALSE) { + throw new \RuntimeException('Could not open php://output for a streamed task.'); + } - ob_end_clean(); - Tui::setOutput($original_output); - } - else { - $return = self::spin($action, Tui::yellow($label)); - self::label($label, $hint && is_callable($hint) ? $hint() : $hint, is_array($return) ? $return : NULL, Strings::isAsciiStart($label) ? 2 : 3); + Tui::setOutput(new StreamOutput($stream, $output->getVerbosity(), $output->isDecorated())); } - if ($return === FALSE) { - $failure = $failure && is_callable($failure) ? $failure() : $failure; - Tui::error($failure ? Tui::normalizeText($failure) : 'FAILED'); + try { + return Prompty::task($label, action: $run, hint: $hint ?? '', success: $success ?? '', failure: $failure ?? '', stream: $streaming); } - else { - $success = $success && is_callable($success) ? $success($return) : $success; - self::ok($success ? Tui::normalizeText($success) : 'OK'); + finally { + Tui::setOutput($output); } - - return $return; } /** - * Show the label while the action runs, then erase it. + * Run an action and report it as plain lines. * + * @param string $label + * The task label. * @param \Closure $action * The action to run. - * @param string $label - * The label to show while the action runs. + * @param \Closure|string|null $hint + * The hint, or a callable that receives the action's return value. + * @param \Closure|string|null $success + * The success message, or a callable that receives the return value. + * @param \Closure|string|null $failure + * The failure message, or a callable that receives the return value. * * @return mixed * The value the action returns. */ - protected static function spin(\Closure $action, string $label): mixed { - Tui::output()->write(PHP_EOL . ' ' . Tui::cyan('⠂') . ' ' . $label . PHP_EOL); - - try { - return $action(); - } - finally { - // Move to the start of the blank line above the label and clear down. - Tui::output()->write("\033[999D\033[2A\033[J"); - } - } - - protected static function label(string $message, ?string $hint = NULL, ?array $sublist = NULL, int $sublist_indent = 3): void { - $width = Tui::terminalWidth(); - $right_offset = 10; + protected static function plain(string $label, \Closure $action, \Closure|string|null $hint, \Closure|string|null $success, \Closure|string|null $failure): mixed { + Tui::line($label, 0); - $message = '✦ ' . $message; - $message = Tui::normalizeText($message); + $return = $action(); - self::$message = Tui::blue(wordwrap($message, $width - $right_offset, PHP_EOL)); - self::$hint = $hint ? wordwrap(Tui::normalizeText($hint), $width - $right_offset, PHP_EOL) : NULL; - - Tui::note(self::$message); - Tui::note(str_repeat(Tui::caretUp(), 5)); - - if (self::$hint) { - Tui::note(str_repeat(' ', $sublist_indent) . Tui::dim(self::$hint)); - Tui::note(str_repeat(Tui::caretUp(), 5)); + $hint = is_callable($hint) ? $hint($return) : $hint; + if ($hint) { + Tui::line($hint, 2); } - if (is_array($sublist)) { - foreach ($sublist as $value) { - Tui::note(str_repeat(' ', $sublist_indent) . Tui::dim($value)); - Tui::note(str_repeat(Tui::caretUp(), 5)); - } + foreach (is_array($return) ? $return : [] as $detail) { + Tui::line((string) $detail, 2); } - } - protected static function ok(string $text = 'OK'): void { - $ok = Tui::green(Tui::normalizeText('✓ ' . $text)); - Tui::note($ok); - Tui::note(str_repeat(Tui::caretUp(), 4)); - } + $is_ok = $return !== FALSE; + $message = $is_ok ? $success : $failure; + $message = is_callable($message) ? $message($return) : $message; + + Tui::line(($is_ok ? '✓ ' : '✕ ') . ($message ?: ($is_ok ? 'OK' : 'FAILED')), 0); - protected static function start(string $label): void { - $message = '✦ ' . $label; - Tui::line(Tui::blue(Tui::normalizeText($message))); + return $return; } } diff --git a/.vortex/installer/src/Task/TaskOutput.php b/.vortex/installer/src/Task/TaskOutput.php deleted file mode 100644 index 932cc671ba..0000000000 --- a/.vortex/installer/src/Task/TaskOutput.php +++ /dev/null @@ -1,128 +0,0 @@ - $messages - * The message or messages to write. - * @param bool $newline - * Whether to add a newline after the message. - * @param int $options - * Write options. - */ - public function write(string|iterable $messages, bool $newline = FALSE, int $options = 0): void { - $this->wrapped->write($this->dim($messages), $newline, $options); - } - - /** - * Writes a message to the output and adds a newline at the end. - * - * @param string|iterable $messages - * The message or messages to write. - * @param int $options - * Write options. - */ - public function writeln(string|iterable $messages, int $options = 0): void { - $this->wrapped->writeln($this->dim($messages), $options); - } - - /** - * Dim a message or every message in a list. - * - * @param string|iterable $messages - * The message or messages to dim. - * - * @return string|array - * The dimmed message or messages. - */ - protected function dim(string|iterable $messages): string|array { - return is_iterable($messages) ? array_map(Tui::dim(...), (array) $messages) : Tui::dim($messages); - } - - /** - * {@inheritdoc} - */ - public function setVerbosity(int $level): void { - $this->wrapped->setVerbosity($level); - } - - /** - * {@inheritdoc} - */ - public function getVerbosity(): int { - return $this->wrapped->getVerbosity(); - } - - /** - * {@inheritdoc} - */ - public function isQuiet(): bool { - return $this->wrapped->isQuiet(); - } - - /** - * {@inheritdoc} - */ - public function isVerbose(): bool { - return $this->wrapped->isVerbose(); - } - - /** - * {@inheritdoc} - */ - public function isVeryVerbose(): bool { - return $this->wrapped->isVeryVerbose(); - } - - /** - * {@inheritdoc} - */ - public function isDebug(): bool { - return $this->wrapped->isDebug(); - } - - /** - * {@inheritdoc} - */ - public function setDecorated(bool $decorated): void { - $this->wrapped->setDecorated($decorated); - } - - /** - * {@inheritdoc} - */ - public function isDecorated(): bool { - return $this->wrapped->isDecorated(); - } - - /** - * {@inheritdoc} - */ - public function setFormatter(OutputFormatterInterface $formatter): void { - $this->wrapped->setFormatter($formatter); - } - - /** - * {@inheritdoc} - */ - public function getFormatter(): OutputFormatterInterface { - return $this->wrapped->getFormatter(); - } - -} diff --git a/.vortex/installer/src/Utils/Tui.php b/.vortex/installer/src/Utils/Tui.php index f62c6702ee..e3fa6caf57 100644 --- a/.vortex/installer/src/Utils/Tui.php +++ b/.vortex/installer/src/Utils/Tui.php @@ -5,11 +5,7 @@ namespace DrevOps\VortexInstaller\Utils; use AlexSkrypnyk\Prompty\Prompty; -use Symfony\Component\Console\Helper\Table; -use Symfony\Component\Console\Helper\TableStyle; -use Symfony\Component\Console\Output\BufferedOutput; use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Terminal; class Tui { @@ -17,19 +13,41 @@ class Tui { protected static OutputInterface $output; + /** + * The output Prompty draws to. + * + * Only init() sets it, so setOutput() redirects lines but not Prompty's + * frames. + */ + protected static OutputInterface $promptyOutput; + protected static bool $isInteractive = TRUE; + /** + * The number of streamed tasks whose action is running. + * + * While it is above 0, output is the content of the outer task, so it is + * written as plain lines to $output instead of being drawn by Prompty. + */ + protected static int $captureDepth = 0; + public static function init(OutputInterface $output, bool $is_interactive = TRUE): void { self::$output = $output; self::$isInteractive = $is_interactive; - // The writer reads the output on each call, so a replacement set with - // setOutput() receives the prompts too. Raw output keeps the prompt frames - // away from the console formatter. + // A command run inside a streamed task keeps Prompty drawing the task. + if (self::isCaptured()) { + return; + } + + self::$promptyOutput = $output; + + // Raw output keeps the prompt frames away from the console formatter. Prompty::configure( + labels: ['done' => 'OK', 'failed' => 'FAILED'], unicode: TRUE, ansi: $output->isDecorated(), - output: fn(string $chunk) => self::$output->write($chunk, FALSE, OutputInterface::OUTPUT_RAW), + output: fn(string $chunk) => self::$promptyOutput->write($chunk, FALSE, OutputInterface::OUTPUT_RAW), interactive: $is_interactive, placeholder_fallback: FALSE, ); @@ -46,23 +64,38 @@ public static function setOutput(OutputInterface $output): void { self::$output = $output; } - public static function info(string $message): void { - $lines = array_map(fn(string $line): string => ' ' . $line . ' ', explode(PHP_EOL, $message)); - $longest = max(array_map(mb_strlen(...), $lines)); + public static function isInteractive(): bool { + return self::$isInteractive; + } - self::block(array_map(fn(string $line): string => " \033[46m\033[30m" . mb_str_pad($line, $longest) . "\033[39m\033[49m", $lines)); + /** + * Start or end capturing output as the content of a streamed task. + * + * @param bool $is_captured + * TRUE when a streamed task's action starts, FALSE when it ends. + */ + public static function capture(bool $is_captured): void { + self::$captureDepth = max(0, self::$captureDepth + ($is_captured ? 1 : -1)); + } + + public static function isCaptured(): bool { + return self::$captureDepth > 0; + } + + public static function info(string $message): void { + self::isCaptured() ? self::line($message, 0) : Prompty::note($message); } public static function note(string $message): void { - self::block(array_map(fn(string $line): string => ' ' . $line, explode(PHP_EOL, $message))); + self::isCaptured() ? self::line($message, 0) : Prompty::output(explode(PHP_EOL, $message)); } public static function success(string $message): void { - self::block(array_map(fn(string $line): string => "\033[32m " . $line . "\033[39m", explode(PHP_EOL, $message))); + self::isCaptured() ? self::line('✓ ' . $message, 0) : Prompty::note($message, type: 'success'); } public static function error(string $message): void { - self::block(array_map(fn(string $line): string => "\033[31m " . $line . "\033[39m", explode(PHP_EOL, '✕ ' . $message))); + self::isCaptured() ? self::line('✕ ' . $message, 0) : Prompty::note($message, type: 'error'); } public static function confirm(string $label, bool $default = TRUE, ?string $hint = NULL): bool { @@ -74,6 +107,10 @@ public static function confirm(string $label, bool $default = TRUE, ?string $hin return (bool) Prompty::confirm($label, default: $default, help: $hint ?? ''); } + public static function pause(string $message): void { + Prompty::pause($message, erase: TRUE); + } + public static function line(string $message, int $padding = 1): void { self::$output->writeln(str_repeat(' ', max(0, $padding)) . $message); } @@ -116,139 +153,68 @@ public static function undim(string $text): string { return self::escapeMultiline($text, 22, 22); } - public static function getChar(): string { - if (!self::$isInteractive) { - return ''; - } - - // Disable input buffering. - system('stty cbreak -echo'); - - $res = fopen('php://stdin', 'r'); - if ($res === FALSE) { - return ''; - } - - $char = (string) fgetc($res); - - // Restore terminal settings. - system('stty -cbreak echo'); - - return $char; - } - protected static function escapeMultiline(string $text, int $color_code, int $end_code = 39): string { $lines = explode("\n", $text); $colored_lines = array_map(fn(string $line): string => sprintf("\033[%sm%s\033[%sm", $color_code, $line, $end_code), $lines); return implode("\n", $colored_lines); } - public static function caretDown(): string { - return "\033[B"; - } - - public static function caretUp(): string { - return "\033[A"; - } - - public static function caretEol(string $text): string { - $lines = explode(PHP_EOL, $text); - $longest = max(array_map(Strings::strlenPlain(...), $lines)); - - return "\033[" . $longest . "C"; - } - + /** + * Print a titled key-value list. + * + * @param array> $values + * Values keyed by their label. A value of LIST_SECTION_TITLE makes its key + * a section row, and a list value is joined with commas. + * @param string|null $title + * The title printed above the list. + */ public static function list(array $values, ?string $title): void { - foreach ($values as $key => $value) { - if (is_array($value)) { - $values[$key] = implode(', ', $value); - } - } - - $terminal_width = self::terminalWidth(); - - // (margin + 2 x border + 2 x padding) x 2 - 1 collapse divider width. - $column_width = max(1, (int) floor(($terminal_width - (1 + (1 + 1) * 2) * 2 - 1) / 2)); - - $header = []; $rows = []; + foreach ($values as $key => $value) { if ($value === self::LIST_SECTION_TITLE) { - $rows[] = [Tui::cyan(Tui::bold(self::normalizeText($key)))]; + $rows[] = (string) $key; continue; } - $key = self::normalizeText($key); - $value = self::normalizeText($value); - - $key = ' ' . wordwrap(self::normalizeText($key), $column_width + 2, PHP_EOL . ' ', TRUE); - $value = wordwrap(self::normalizeText($value), $column_width, PHP_EOL, TRUE); + $rows[] = [(string) $key, is_array($value) ? implode(', ', $value) : $value]; + } - $rows[] = [$key, $value]; + if ($title) { + self::info($title); } - self::info(PHP_EOL . self::normalizeText($title) . PHP_EOL); - self::table($header, $rows); + self::table([], $rows); } - public static function box(string $content, ?string $title = NULL, ?int $width = NULL): void { - $rows = []; - - $width ??= self::terminalWidth(); - - // 1 margin + 1 border + 1 padding + 1 padding + 1 border + 1 margin. - $offset = 6; + public static function box(string $content, ?string $title = NULL): void { + if (self::isCaptured()) { + self::line(trim(($title ? $title . PHP_EOL : '') . $content), 0); - $content = wordwrap($content, $width - $offset, PHP_EOL, TRUE); - - if ($title) { - $title = wordwrap($title, $width - $offset, PHP_EOL, FALSE); - $rows[] = [self::green($title)]; - $rows[] = [self::green(str_repeat('─', Strings::strlenPlain(explode(PHP_EOL, self::normalizeText($title))[0]))) . PHP_EOL]; + return; } - $rows[] = [$content]; - - self::table([], $rows); + Prompty::box($content, title: $title ?? ''); } /** - * Render rows as a bordered table with a 1-column margin. + * Print rows as a table. * * @param array $header * Header cells. An empty header draws no header row. - * @param array> $rows - * Table rows. + * @param array> $rows + * Table rows. A string row spans every column. */ public static function table(array $header, array $rows): void { - $style = (new TableStyle()) - ->setHorizontalBorderChars('─') - ->setVerticalBorderChars('│', '│') - ->setCellHeaderFormat("\033[2m%s\033[22m") - ->setCellRowFormat('%s'); - - if (empty($header)) { - $style->setCrossingChars('┼', '┌', '┬', '┐', '┤', '┘', '┴', '└', '├', '┌', '┬', '┐'); - } - else { - $style->setCrossingChars('┼', '┌', '┬', '┐', '┤', '┘', '┴', '└', '├'); - } - - $buffered = new BufferedOutput(OutputInterface::VERBOSITY_NORMAL, self::output()->isDecorated()); - - (new Table($buffered))->setHeaders($header)->setRows($rows)->setStyle($style)->render(); + if (self::isCaptured()) { + foreach (array_merge($header === [] ? [] : [$header], $rows) as $row) { + self::line(is_array($row) ? implode(': ', $row) : $row, 0); + } - self::block(array_map(fn(string $line): string => ' ' . $line, explode(PHP_EOL, trim($buffered->fetch(), PHP_EOL)))); - } + return; + } - /** - * Write lines as a block separated from the output around it. - * - * @param array $lines - * Lines to write. - */ - protected static function block(array $lines): void { - self::output()->write(PHP_EOL . implode('', array_map(fn(string $line): string => $line . PHP_EOL, $lines)) . PHP_EOL); + Prompty::table($rows, headers: $header); } public static function center(string $text, int $width = 80, ?string $border = NULL): string { @@ -280,40 +246,7 @@ public static function center(string $text, int $width = 80, ?string $border = N } public static function terminalWidth(int $max = 100): int { - return min($max, max(20, (new Terminal())->getWidth())); - } - - public static function normalizeText(string $text): string { - if (!Strings::isAsciiStart($text)) { - return $text; - } - - $text = preg_replace('/\s{2,}/', ' ', $text); - - preg_match_all('/\X/u', (string) $text, $matches); - - $utf8_chars = $matches[0]; - $utf8_chars = array_map(fn(string $char): string => Strings::isAsciiStart($char) ? $char : $char . self::utfPadding($char), $utf8_chars); - - return implode('', $utf8_chars); - } - - protected static function utfPadding(string $char): string { - $padding = ''; - - $len = strlen($char); - $mblen = mb_strlen($char); - - // @see https://youtrack.jetbrains.com/issue/IJPL-101568/Terminal-display-Python-icon-in-wrong-width - if (str_contains((string) getenv('TERMINAL_EMULATOR'), 'JetBrains') && ($mblen === 1 && $len < 4)) { - $padding = ' '; - } - - if (str_contains((string) getenv('TERM_PROGRAM'), 'Apple_Terminal') && ($mblen > 1 && $len < 8)) { - return ' '; - } - - return $padding; + return min($max, max(20, Prompty::terminalWidth())); } } diff --git a/.vortex/installer/tests/Traits/TuiTrait.php b/.vortex/installer/tests/Traits/TuiTrait.php index 3335c3c3cc..87fe98e9dd 100644 --- a/.vortex/installer/tests/Traits/TuiTrait.php +++ b/.vortex/installer/tests/Traits/TuiTrait.php @@ -32,22 +32,7 @@ protected function tuiTeardown(): void { * Keystrokes in the order the prompts read them. */ protected function tuiInput(array $keystrokes): void { - $stream = fopen('php://memory', 'r+'); - - if ($stream === FALSE) { - throw new \RuntimeException('Could not open a memory stream for the keystrokes.'); - } - - fwrite($stream, implode('', $keystrokes)); - rewind($stream); - - $instance = $this->promptyGetStatic('instance'); - - if (!is_object($instance)) { - throw new \RuntimeException('Prompty is not initialized. Call tuiSetUp() first.'); - } - - $this->promptySetProperty($instance, 'input', $stream); + $this->promptyInput(implode('', $keystrokes)); $this->promptyThrowOnInvalid(); } diff --git a/.vortex/installer/tests/Unit/Prompts/InstallerPresenterTest.php b/.vortex/installer/tests/Unit/Prompts/InstallerPresenterTest.php index 08e1014bee..6ca30c4d3a 100644 --- a/.vortex/installer/tests/Unit/Prompts/InstallerPresenterTest.php +++ b/.vortex/installer/tests/Unit/Prompts/InstallerPresenterTest.php @@ -118,6 +118,7 @@ public function testHeaderInteractiveShowsControls(): void { $output = $this->output->fetch(); $this->assertStringContainsString('Ctrl+C', $output); + $this->assertStringContainsString('Ctrl+U', $output); } public function testHeaderNonInteractiveHidesControls(): void { @@ -130,6 +131,7 @@ public function testHeaderNonInteractiveHidesControls(): void { $output = $this->output->fetch(); $this->assertStringNotContainsString('Ctrl+C', $output); + $this->assertStringNotContainsString('Ctrl+U', $output); $this->assertStringContainsString('non-interactive', $output); } diff --git a/.vortex/installer/tests/Unit/Task/TaskOutputTest.php b/.vortex/installer/tests/Unit/Task/TaskOutputTest.php deleted file mode 100644 index 04b70386dd..0000000000 --- a/.vortex/installer/tests/Unit/Task/TaskOutputTest.php +++ /dev/null @@ -1,128 +0,0 @@ -assertInstanceOf(TaskOutput::class, $output); - } - - /** - * Test write method dims single message. - */ - public function testWriteSingleMessage(): void { - $wrapped = new BufferedOutput(); - $output = new TaskOutput($wrapped); - - $output->write('Test message'); - - $content = $wrapped->fetch(); - // The message should be dimmed (wrapped with ANSI codes). - $this->assertStringContainsString('Test message', $content); - } - - /** - * Test write method dims iterable messages. - */ - public function testWriteIterableMessages(): void { - $wrapped = new BufferedOutput(); - $output = new TaskOutput($wrapped); - - $output->write(['Line 1', 'Line 2']); - - $content = $wrapped->fetch(); - $this->assertStringContainsString('Line 1', $content); - $this->assertStringContainsString('Line 2', $content); - } - - /** - * Test writeln method dims single message. - */ - public function testWritelnSingleMessage(): void { - $wrapped = new BufferedOutput(); - $output = new TaskOutput($wrapped); - - $output->writeln('Test message'); - - $content = $wrapped->fetch(); - $this->assertStringContainsString('Test message', $content); - } - - /** - * Test writeln method dims iterable messages. - */ - public function testWritelnIterableMessages(): void { - $wrapped = new BufferedOutput(); - $output = new TaskOutput($wrapped); - - $output->writeln(['Line 1', 'Line 2']); - - $content = $wrapped->fetch(); - $this->assertStringContainsString('Line 1', $content); - $this->assertStringContainsString('Line 2', $content); - } - - /** - * Test verbosity delegation. - */ - public function testVerbosityDelegation(): void { - $wrapped = new BufferedOutput(); - $output = new TaskOutput($wrapped); - - $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG); - $this->assertEquals(OutputInterface::VERBOSITY_DEBUG, $output->getVerbosity()); - - $this->assertFalse($output->isQuiet()); - $this->assertTrue($output->isVerbose()); - $this->assertTrue($output->isVeryVerbose()); - $this->assertTrue($output->isDebug()); - } - - /** - * Test decoration delegation. - */ - public function testDecorationDelegation(): void { - $wrapped = new BufferedOutput(); - $output = new TaskOutput($wrapped); - - $output->setDecorated(TRUE); - $this->assertTrue($output->isDecorated()); - - $output->setDecorated(FALSE); - $this->assertFalse($output->isDecorated()); - } - - /** - * Test formatter delegation. - */ - public function testFormatterDelegation(): void { - $wrapped = new BufferedOutput(); - $output = new TaskOutput($wrapped); - - $formatter = new OutputFormatter(); - $output->setFormatter($formatter); - - $this->assertSame($formatter, $output->getFormatter()); - } - -} diff --git a/.vortex/installer/tests/Unit/Task/TaskTest.php b/.vortex/installer/tests/Unit/Task/TaskTest.php index 93eb490bdd..06c12ca732 100644 --- a/.vortex/installer/tests/Unit/Task/TaskTest.php +++ b/.vortex/installer/tests/Unit/Task/TaskTest.php @@ -35,7 +35,7 @@ public function testAction( $expected_output = is_array($expected_output) ? $expected_output : [$expected_output]; foreach ($expected_output as $expected) { - $this->assertStringContainsString(Tui::normalizeText($expected), $actual); + $this->assertStringContainsString($expected, $actual); } } @@ -111,6 +111,43 @@ public static function dataProviderAction(): \Iterator { ]; } + public function testActionNestedInStreamingTask(): void { + $output = new BufferedOutput(); + Tui::init($output); + + $result = Task::action( + label: 'Outer task', + action: function (): bool { + Task::action( + label: 'Inner task', + action: fn(): array => ['detail 1'], + hint: 'Inner hint', + success: 'Inner done', + ); + Task::action( + label: 'Inner failing task', + action: fn(): bool => FALSE, + ); + + return TRUE; + }, + success: 'Outer done', + streaming: TRUE, + ); + + $actual = $output->fetch(); + + $this->assertTrue($result); + $this->assertFalse(Tui::isCaptured()); + $this->assertStringContainsString('Outer task', $actual); + $this->assertStringContainsString('Inner task', $actual); + $this->assertStringContainsString('Inner hint', $actual); + $this->assertStringContainsString('detail 1', $actual); + $this->assertStringContainsString('✓ Inner done', $actual); + $this->assertStringContainsString('✕ FAILED', $actual); + $this->assertStringContainsString('✓ Outer done', $actual); + } + public function testActionInvalidArgument(): void { $output = new BufferedOutput(); Tui::init($output); diff --git a/.vortex/installer/tests/Unit/Utils/TuiTest.php b/.vortex/installer/tests/Unit/Utils/TuiTest.php index ca9981a59b..ba487dacdf 100644 --- a/.vortex/installer/tests/Unit/Utils/TuiTest.php +++ b/.vortex/installer/tests/Unit/Utils/TuiTest.php @@ -19,9 +19,11 @@ public function testInit(): void { Tui::init($output); $this->assertSame($output, Tui::output()); + $this->assertTrue(Tui::isInteractive()); Tui::init($output, FALSE); $this->assertSame($output, Tui::output()); + $this->assertFalse(Tui::isInteractive()); } public function testOutputNotInitialized(): void { @@ -32,34 +34,24 @@ public function testOutputNotInitialized(): void { $this->assertSame($output, Tui::output()); } - public function testInfo(): void { + #[DataProvider('dataProviderMessages')] + public function testMessages(string $method, string $message, array $expected): void { $output = new BufferedOutput(); Tui::init($output); - Tui::info('Test info message'); + Tui::$method($message); $actual = $output->fetch(); - $this->assertStringContainsString('Test info message', $actual); + foreach ($expected as $expected_string) { + $this->assertStringContainsString($expected_string, $actual); + } } - public function testNote(): void { - $output = new BufferedOutput(); - Tui::init($output); - - Tui::note('Test note message'); - - $actual = $output->fetch(); - $this->assertStringContainsString('Test note message', $actual); - } - - public function testError(): void { - $output = new BufferedOutput(); - Tui::init($output); - - Tui::error('Test error message'); - - $actual = $output->fetch(); - $this->assertStringContainsString('✕ Test error message', $actual); + public static function dataProviderMessages(): \Iterator { + yield 'info' => ['info', 'Test info message', ['Test info message']]; + yield 'note' => ['note', "Line 1\nLine 2", ['Line 1', 'Line 2']]; + yield 'success' => ['success', 'Operation succeeded', ['✓', 'Operation succeeded']]; + yield 'error' => ['error', 'Test error message', ['✕', 'Test error message']]; } #[DataProvider('dataProviderColorMethods')] @@ -106,355 +98,31 @@ public static function dataProviderColorMethodsMultiline(): \Iterator { ]; } - public function testEscapeMultilineViaPublicMethod(): void { - // escapeMultiline() is protected, so green() exercises it. - $text = <<<'TEXT' -Line 1 -Line 2 -TEXT; - - $result = Tui::green($text); - // The escape sequence appears without the leading backslash in the - // actual output. - $this->assertStringContainsString('[32m', $result); - $this->assertStringContainsString('Line 1', $result); - $this->assertStringContainsString('Line 2', $result); - } - - public function testCaretMethods(): void { - $this->assertSame("\033[B", Tui::caretDown()); - $this->assertSame("\033[A", Tui::caretUp()); - } - - public function testCaretEol(): void { - $result = Tui::caretEol('Short'); - $this->assertSame("\033[5C", $result); - - $multiline = <<<'TEXT' -Short -Longer line -TEXT; - $result = Tui::caretEol($multiline); - $this->assertSame("\033[11C", $result); - } - public function testTerminalWidth(): void { - $width = Tui::terminalWidth(); - $this->assertGreaterThanOrEqual(20, $width); + static::envSet('COLUMNS', '60'); + Tui::init(new BufferedOutput()); + + $this->assertSame(60, Tui::terminalWidth()); + $this->assertSame(50, Tui::terminalWidth(50)); } #[DataProvider('dataProviderBox')] - public function testBox( - string $content, - ?string $title, - ?int $width, - ?int $terminal_width, - string $expected_output, - ): void { + public function testBox(string $content, ?string $title, array $expected): void { $output = new BufferedOutput(); Tui::init($output); - if ($terminal_width !== NULL) { - static::envSet('COLUMNS', (string) $terminal_width); - } + Tui::box($content, $title); - if ($width !== NULL) { - Tui::box($content, $title, $width); - } - else { - Tui::box($content, $title); + $actual = Strings::stripAnsiColors($output->fetch()); + foreach ($expected as $expected_string) { + $this->assertStringContainsString($expected_string, $actual); } - - $actual = $output->fetch(); - - $actual_clean = Strings::stripAnsiColors($actual); - $expected_clean = Strings::stripAnsiColors($expected_output); - - $this->assertSame($expected_clean, $actual_clean); } public static function dataProviderBox(): \Iterator { - yield 'simple content without title' => [ - 'content' => 'Simple content', - 'title' => NULL, - 'width' => 50, - 'terminal_width' => 100, - 'expected_output' => << [ - 'content' => 'Content with title', - 'title' => 'Box Title', - 'width' => 50, - 'terminal_width' => 100, - 'expected_output' => << [ - 'content' => '', - 'title' => 'Empty Content', - 'width' => 40, - 'terminal_width' => 100, - 'expected_output' => << [ - 'content' => 'Content with empty title', - 'title' => '', - 'width' => 40, - 'terminal_width' => 100, - 'expected_output' => << [ - 'content' => 'X', - 'title' => 'A', - 'width' => 25, - 'terminal_width' => 100, - 'expected_output' => << [ - 'content' => ' ', - 'title' => NULL, - 'width' => 30, - 'terminal_width' => 100, - 'expected_output' => << [ - 'content' => 'Terminal width test', - 'title' => 'Narrow Terminal', - 'width' => 100, - 'terminal_width' => 30, - 'expected_output' => << [ - 'content' => 'Default width content', - 'title' => 'Default Width', - 'width' => NULL, - 'terminal_width' => 50, - 'expected_output' => << [ - 'content' => 'This is a very long line of content that should definitely be wrapped when the box width is narrow', - 'title' => 'Long Content Test', - 'width' => 40, - 'terminal_width' => 100, - 'expected_output' => << [ - 'content' => 'Short line', - 'title' => 'This is a very long title that should be wrapped across multiple lines when the box width is constrained', - 'width' => 35, - 'terminal_width' => 100, - 'expected_output' => << [ - 'content' => "Multi\nLine\nContent\nHere", - 'title' => 'Multi-Line Test', - 'width' => 30, - 'terminal_width' => 100, - 'expected_output' => << [ - 'content' => 'This line has some words and should wrap nicely', - 'title' => NULL, - 'width' => 25, - 'terminal_width' => 100, - 'expected_output' => << [ - 'content' => 'OneVeryLongWordThatCannotBeWrappedNormally', - 'title' => 'Unbreakable', - 'width' => 20, - 'terminal_width' => 100, - 'expected_output' => << [ - 'content' => "Paragraph one with some text.\n\nParagraph two with more text after empty line.", - 'title' => 'Multi-Paragraph', - 'width' => 45, - 'terminal_width' => 100, - 'expected_output' => << [ - 'content' => 'Content with émojis 🌟 and special chars ñáéíóú that affect wrapping calculations', - 'title' => 'Special Chars', - 'width' => 35, - 'terminal_width' => 100, - 'expected_output' => << [ - 'content' => 'Short', - 'title' => 'Normal Title', - 'width' => 10, - 'terminal_width' => 100, - 'expected_output' => << ['Simple content', NULL, ['┌', '│ Simple content │', '┘']]; + yield 'content with title' => ['Content with title', 'Box Title', ['Box Title', 'Content with title']]; + yield 'multiline content' => ["Multi\nLine", 'Multi-Line Test', ['Multi-Line Test', '│ Multi ', '│ Line ']]; } #[DataProvider('dataProviderList')] @@ -491,108 +159,16 @@ public static function dataProviderList(): \Iterator { ]; } - #[DataProvider('dataProviderUtfPadding')] - public function testUtfPadding( - string $char, - ?string $terminal_emulator, - ?string $term_program, - string $expected_padding, - ): void { - if ($terminal_emulator !== NULL) { - static::envSet('TERMINAL_EMULATOR', $terminal_emulator); - } - else { - static::envUnset('TERMINAL_EMULATOR'); - } - - if ($term_program !== NULL) { - static::envSet('TERM_PROGRAM', $term_program); - } - else { - static::envUnset('TERM_PROGRAM'); - } - - $reflection = new \ReflectionClass(Tui::class); - $method = $reflection->getMethod('utfPadding'); + public function testTable(): void { + $output = new BufferedOutput(); + Tui::init($output); - $result = $method->invoke(NULL, $char); - $this->assertSame($expected_padding, $result); - } + Tui::table(['Name', 'Value'], [['key1', 'value1'], 'Section']); - public static function dataProviderUtfPadding(): \Iterator { - yield 'JetBrains with 1-byte UTF-8 char' => [ - // 2 bytes, 1 mb_strlen - 'char' => 'é', - 'terminal_emulator' => 'JetBrains-something', - 'term_program' => NULL, - 'expected_padding' => ' ', - ]; - yield 'JetBrains with 3-byte UTF-8 char' => [ - // 3 bytes, 1 mb_strlen - 'char' => 'あ', - 'terminal_emulator' => 'JetBrains-IDE', - 'term_program' => NULL, - 'expected_padding' => ' ', - ]; - yield 'JetBrains with 4-byte UTF-8 char' => [ - // 4 bytes, 1 mb_strlen - should NOT get padding (len >= 4) - 'char' => '🌟', - 'terminal_emulator' => 'JetBrains-IDE', - 'term_program' => NULL, - 'expected_padding' => '', - ]; - yield 'Non-JetBrains terminal' => [ - 'char' => 'é', - 'terminal_emulator' => 'other-terminal', - 'term_program' => NULL, - 'expected_padding' => '', - ]; - yield 'Apple Terminal with multi-byte char under 8 bytes' => [ - // 2 chars × 3 bytes = 6 bytes total, mblen=2, len=6 < 8 - 'char' => 'あい', - 'terminal_emulator' => NULL, - 'term_program' => 'Apple_Terminal', - 'expected_padding' => ' ', - ]; - yield 'Apple Terminal with long multi-byte string' => [ - // 5 chars × 3 bytes = 15 bytes, mblen=5, len=15 >= 8 - 'char' => 'あいうえお', - 'terminal_emulator' => NULL, - 'term_program' => 'Apple_Terminal', - 'expected_padding' => '', - ]; - yield 'Apple Terminal with single-byte char' => [ - // Single byte, single mb_strlen. - 'char' => 'A', - 'terminal_emulator' => NULL, - 'term_program' => 'Apple_Terminal', - 'expected_padding' => '', - ]; - yield 'No special terminal with UTF-8' => [ - 'char' => '🌟', - 'terminal_emulator' => NULL, - 'term_program' => NULL, - 'expected_padding' => '', - ]; - yield 'Regular ASCII character' => [ - 'char' => 'A', - 'terminal_emulator' => NULL, - 'term_program' => NULL, - 'expected_padding' => '', - ]; - yield 'Both JetBrains and Apple set' => [ - 'char' => 'é', - 'terminal_emulator' => 'JetBrains-IDE', - 'term_program' => 'Apple_Terminal', - // JetBrains condition should trigger first. - 'expected_padding' => ' ', - ]; - yield 'Empty environment values' => [ - 'char' => 'é', - 'terminal_emulator' => '', - 'term_program' => '', - 'expected_padding' => '', - ]; + $actual = $output->fetch(); + $this->assertStringContainsString('Name', $actual); + $this->assertStringContainsString('key1', $actual); + $this->assertStringContainsString('Section', $actual); } #[DataProvider('dataProviderCenter')] @@ -743,52 +319,6 @@ public static function dataProviderCenter(): \Iterator { ]; } - #[DataProvider('dataProviderNormalizeText')] - public function testNormalizeText(string $input, string $expected): void { - $result = Tui::normalizeText($input); - $this->assertEquals($expected, $result); - } - - public static function dataProviderNormalizeText(): \Iterator { - yield 'multiple spaces' => [ - 'input' => 'Hello world', - 'expected' => 'Hello world', - ]; - yield 'multiple types of whitespace' => [ - 'input' => "Hello\t\t \n world", - 'expected' => 'Hello world', - ]; - yield 'leading and trailing spaces with multiple interior spaces' => [ - 'input' => ' Hello world ', - 'expected' => ' Hello world ', - ]; - // Test non-ASCII text gets whitespace normalized + UTF padding. - yield 'text starting with non-ASCII character' => [ - 'input' => 'éHello world', - 'expected' => 'éHello world', - ]; - yield 'simple ASCII text' => [ - 'input' => 'Hello world', - 'expected' => 'Hello world', - ]; - yield 'ASCII text with UTF-8 characters' => [ - 'input' => 'Hello 🌟 world', - 'expected' => 'Hello 🌟 world', - ]; - yield 'empty string' => [ - 'input' => '', - 'expected' => '', - ]; - yield 'single space' => [ - 'input' => ' ', - 'expected' => ' ', - ]; - yield 'only multiple spaces' => [ - 'input' => ' ', - 'expected' => ' ', - ]; - } - public function testSetOutput(): void { $output1 = new BufferedOutput(); $output2 = new BufferedOutput(); @@ -798,16 +328,11 @@ public function testSetOutput(): void { Tui::setOutput($output2); $this->assertSame($output2, Tui::output()); - } - - public function testSuccess(): void { - $output = new BufferedOutput(); - Tui::init($output); - - Tui::success('Operation succeeded'); - $actual = $output->fetch(); - $this->assertStringContainsString('Operation succeeded', $actual); + // Prompty keeps drawing to the output passed to init(). + Tui::info('Drawn by Prompty'); + $this->assertStringContainsString('Drawn by Prompty', $output1->fetch()); + $this->assertSame('', $output2->fetch()); } public function testLine(): void { @@ -841,12 +366,48 @@ public function testConfirmNonInteractive(): void { $this->assertFalse($result); } - public function testGetCharNonInteractive(): void { + public function testCapturedWritesPlainLines(): void { + $output = new BufferedOutput(); + Tui::init($output); + + Tui::capture(TRUE); + $this->assertTrue(Tui::isCaptured()); + + // A command run while captured keeps Prompty drawing to the first output. + $nested = new BufferedOutput(); + Tui::init($nested); + + Tui::info('Info line'); + Tui::success('Success line'); + Tui::error('Error line'); + Tui::note('Note line'); + Tui::box('Box content', 'Box title'); + Tui::table(['Name', 'Value'], [['key1', 'value1'], 'Section']); + + Tui::capture(FALSE); + $this->assertFalse(Tui::isCaptured()); + + $this->assertSame(implode(PHP_EOL, [ + 'Info line', + '✓ Success line', + '✕ Error line', + 'Note line', + 'Box title', + 'Box content', + 'Name: Value', + 'key1: value1', + 'Section', + ]) . PHP_EOL, $nested->fetch()); + $this->assertSame('', $output->fetch()); + } + + public function testPauseNonInteractive(): void { $output = new BufferedOutput(); Tui::init($output, FALSE); - $result = Tui::getChar(); - $this->assertEquals('', $result); + Tui::pause('Press any key to continue...'); + + $this->assertStringNotContainsString('Press any key to continue...', $output->fetch()); } } From 89980a268ca09d27f9f054328b2a9f2f3e7a9ca8 Mon Sep 17 00:00:00 2001 From: Alex Skrypnyk Date: Wed, 11 Nov 2026 12:10:01 +1100 Subject: [PATCH 06/14] Re-recorded the installer video with the Prompty flow. --- .vortex/docs/static/img/installer.json | 413 ++++++++++++------------- .vortex/docs/static/img/installer.png | Bin 99414 -> 101771 bytes .vortex/docs/static/img/installer.svg | 2 +- 3 files changed, 195 insertions(+), 220 deletions(-) diff --git a/.vortex/docs/static/img/installer.json b/.vortex/docs/static/img/installer.json index 6228397fea..4ccd8ca235 100644 --- a/.vortex/docs/static/img/installer.json +++ b/.vortex/docs/static/img/installer.json @@ -1,219 +1,194 @@ -{"version":2,"width":80,"height":27,"timestamp":1792537540,"command":"/home/user/demo/installer.exp","title":"Vortex Installer Demo","env":{"SHELL":"/opt/homebrew/opt/bash/bin/bash"}} -[0.510641, "o", "\r\r\n \u001b[36m──────────────────────────────────────────────────────────────────────────────\u001b[39m\r\r\n \u001b[36m\u001b[39m\r\r\n \u001b[36m\u001b[39m\r\r\n \u001b[36m ██╗ ██╗ ██████╗ ██████╗ ████████╗ ███████╗ ██╗ ██╗\u001b[39m\r\r\n \u001b[36m ██║ ██║ ██╔═══██╗ ██╔══██╗ ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝\u001b[39m\r\r\n \u001b[36m ██║ ██║ ██║ ██║ ██████╔╝ ██║ █████╗ ╚███╔╝\u001b[39m\r\r\n \u001b[36m ╚██╗ ██╔╝ ██║ ██║ ██╔══██╗ ██║ ██╔══╝ ██╔██╗\u001b[39m\r\r\n \u001b[36m ╚████╔╝ ╚██████╔╝ ██║ ██║ "] -[0.510655, "o", " ██"] -[0.51074, "o", "║ ███████╗ ██╔╝ ██╗\u001b[39m\r\r\n \u001b[36m ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝ ╚═╝ ╚═╝\u001b[39m\r\r\n \u001b[36m\u001b[39m\r\r\n \u001b[36m Drupal project template\u001b[39m\r\r\n \u001b[36m\u001b[39m\r\r\n \u001b[36m by DrevOps\u001b[39m\r\r\n \u001b[36m\u001b[39m\r\r\n \u001b[36m──────────────────────────────────────────────────────────────────────────────\u001b[39m\r\r\n \u001b[2m Installer version: development\u001b[22m\r\r\n\r\r\n"] -[0.514866, "o", "\r\r\n \u001b[90m┌───────────────────────────────────────────────────────────────────────┐\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[32mWelcome to the Vortex interactive installer\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[32m───────────────────────────────────────────\u001b[39m\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m This tool will guide you through installing the latest \u001b[4mdevelopment\u001b[0m\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m version of Vortex into your project.\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[39m "] -[0.514876, "o", " "] -[0.514951, "o", " \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m You will be asked a few questions to tailor the configuration to your\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m site.\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m No changes will be made until you confirm everything at the end.\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Press \u001b[33mCtrl+C\u001b[39m at any time to exit the installer.\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Press \u001b[33mCtrl+U\u001b[39m at any time to go back to the previous step.\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m└────────────────────────────────────────────"] -[0.514963, "o", "───"] -[0.515028, "o", "────────────────────────┘\u001b[39m\r\r\n\r\r\n"] -[0.515267, "o", "\u001b[?25l"] -[0.518093, "o", "\r\r\n \u001b[36m⠂\u001b[39m \u001b[33mValidating repository and reference\u001b[39m\r\r\n"] -[0.524412, "o", "\u001b[999D\u001b[2A\u001b[J\u001b[?25h"] -[0.524471, "o", "\r\r\n \u001b[34m✦ Validating repository and reference\u001b[39m\r\r\n\r\r\n\r\r\n \u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\r\r\n\r\r\n\r\r\n \u001b[2mChecking repository \"/home/user/vortex\" and reference\u001b[22m\r\r\n \u001b[2m\"HEAD\"\u001b[22m\r\r\n\r\r\n\r\r\n \u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\r\r\n\r\r\n\r\r\n \u001b[32m✓ Repository and reference validated successfully\u001b[39m\r\r\n\r\r\n\r\r\n \u001b[A\u001b[A\u001b[A\u001b[A\r\r\n\r\r\n \r\r\n"] -[0.524573, "o", " \u001b[2mPress any key to continue...\u001b[22m\r\r\n"] -[3.533773, "o", "\r\r\n \u001b[46m\u001b[30m General information \u001b[39m\u001b[49m\r\r\n\r\r\n"] -[3.548138, "o", "\u001b[?25l"] -[3.551838, "o", "\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mSite name \u001b[2m(1/41)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m star wars\u001b[7m \u001b[27m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m We will use this name in the project and documentation.\u001b[39m\r\r\n"] -[3.705249, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mSite name \u001b[2m(1/41)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m star \u001b[7m \u001b[27m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m We will use this name in the project and documentation.\u001b[39m\r\r\n\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mSite name \u001b[2m(1/41)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m\u001b[7mE\u001b[27m.g. My Site\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────"] -[3.705417, "o", "──"] -[4.296743, "o", "──────────────────────────┘\u001b[39m\r\r\n\u001b[90m We will use this name in the project and documentation.\u001b[39m\r\r\n\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mSite name \u001b[2m(1/41)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m S\u001b[7m \u001b[27m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m We will use this name in the project and documentation.\u001b[39m\r\r\n\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mSite name \u001b[2m(1/41)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m St\u001b[7m \u001b[27m "] -[4.296757, "o", " "] -[4.296825, "o", " \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m We will use this name in the project and documentation.\u001b[39m\r\r\n"] -[5.300314, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mSite name \u001b[2m(1/41)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Star Wars\u001b[7m \u001b[27m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m We will use this name in the project and documentation.\u001b[39m\r\r\n"] -[5.304032, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mSite name \u001b[2m(1/41)\u001b[22m\u001b[22m \u001b[90m────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Star Wars \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n"] -[5.304168, "o", "\u001b[?25h"] -[5.323358, "o", "\u001b[?25l"] -[5.327832, "o", "\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mSite machine name \u001b[2m(2/41)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m star_wars\u001b[7m \u001b[27m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m We will use this name for the project directory and in the code.\u001b[39m\r\r\n"] -[6.35401, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mSite machine name \u001b[2m(2/41)\u001b[22m\u001b[22m \u001b[90m────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m star_wars \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"] -[6.387119, "o", "\u001b[?25l"] -[6.39355, "o", "\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mOrganization name \u001b[2m(3/41)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Star Wars Org\u001b[7m \u001b[27m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m We will use this name in the project and documentation.\u001b[39m\r\r\n"] -[6.54757, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mOrganization name \u001b[2m(3/41)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Star Wa\u001b[7m \u001b[27m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m We will use this name in the project and documentation.\u001b[39m\r\r\n\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mOrganization name \u001b[2m(3/41)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m\u001b[7mE\u001b[27m.g. My Org\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └────────────────────────────────────────────"] -[6.547584, "o", "───"] -[7.393206, "o", "───────────────┘\u001b[39m\r\r\n\u001b[90m We will use this name in the project and documentation.\u001b[39m\r\r\n\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mOrganization name \u001b[2m(3/41)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m R\u001b[7m \u001b[27m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m We will use this name in the project and documentation.\u001b[39m\r\r\n\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mOrganization name \u001b[2m(3/41)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Re\u001b[7m \u001b[27m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └─────"] -[7.393223, "o", "────"] -[7.39332, "o", "─────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m We will use this name in the project and documentation.\u001b[39m\r\r\n"] -[8.39752, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mOrganization name \u001b[2m(3/41)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Rebellion\u001b[7m \u001b[27m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m We will use this name in the project and documentation.\u001b[39m\r\r\n"] -[9.400838, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mOrganization name \u001b[2m(3/41)\u001b[22m\u001b[22m \u001b[90m────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Rebellion \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mOrganization machine name \u001b[2m(4/41)\u001b[22m\u001b[39m \u001b[90m────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m rebellion\u001b[7m \u001b[27m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m We will use this name in the co"] -[9.40107, "o", "de.\u001b[39m\r"] -[9.401418, "o", "\r\r\n"] -[10.405608, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mOrganization machine name \u001b[2m(4/41)\u001b[22m\u001b[22m \u001b[90m────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m rebellion \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mPublic domain \u001b[2m(5/41)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m star-wars.com\u001b[7m \u001b[27m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Domain name without pro"] -[10.405614, "o", "tocol and"] -[10.40572, "o", " trailing slash.\u001b[39m\r\r\n"] -[11.407281, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mPublic domain \u001b[2m(5/41)\u001b[22m\u001b[22m \u001b[90m────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m star-wars.com \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\r\r\n \u001b[46m\u001b[30m Drupal \u001b[39m\u001b[49m\r\r\n\r\r\n\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mHow would you like your site to be created on the first run? \u001b[2m(6/41)\u001b[…\u001b[39m \u001b[90m┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Choose how your site will be created the first time after this \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m installer finishes: \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m "] -[11.407736, "o", " "] -[11.407907, "o", " \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m ○ \u001b[1mDrupal, installed from profile\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Creates a new site by \u001b[4mpopulating a fresh database\u001b[0m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m from one of the standard Drupal installation profiles. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m ○ \u001b[1mDrupal CMS, installed from profile\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Creates a new site by \u001b[4mpopulating a fresh database\u001b[0m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m from the Drupal CMS recipe. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m ○ \u001b[1mDrupal, loaded from the demo database\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Creates a site by \u001b[4mloadin"] -[11.40821, "o", "g an exist"] -[12.412947, "o", "ing demo database\u001b[0m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m provided with the installer. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m ├─────────────────────────────────────────────────────────────────────┤\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mDrupal, installed from profile\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mDrupal CMS, installed from profile\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m›\u001b[39m \u001b[36m●\u001b[39m Drupal, loaded from the demo database \u001b[90m│\u001b[39m\r\r\n\u001b[90m └────────────────────────────────────────────────────────────"] -[12.413221, "o", "──"] -[12.413546, "o", "───────┘\u001b[39m\r\r\n\u001b[90m Use ⬆ and ⬇. Applies only on the first run of the installer.\u001b[39m\r\r\n"] -[13.422656, "o", "\u001b[1G\u001b[24A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mHow would you like your site to be created on the first run? \u001b[2m(6/41)\u001b[…\u001b[22m \u001b[90m┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Choose how your site will be created the first time after this \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m installer finishes: \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m ○ \u001b[1mDrupal, installed from profile\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Creates a new site by \u001b[4mpopulating a fresh database\u001b[0m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m from one of the standard Drupal installation profiles. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m ○ \u001b[1mDrupal CMS, installed from profile\u001b[22m "] -[13.422668, "o", " "] -[13.422753, "o", " \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Creates a new site by \u001b[4mpopulating a fresh database\u001b[0m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m from the Drupal CMS recipe. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m ○ \u001b[1mDrupal, loaded from the demo database\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Creates a site by \u001b[4mloading an existing demo database\u001b[0m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m provided with the installer. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m ├─────────────────────────────────────────────────────────────────────┤\u001b[39m\r\r\n\u001b[90m │\u001b[39m Drupal, loaded from the demo database "] -[13.422766, "o", " "] -[13.422894, "o", " \u001b[90m│\u001b[39m\r\r\n\u001b[90m └─────────────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"] -[14.424576, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mProfile \u001b[2m(7/41)\u001b[22m\u001b[39m \u001b[90m──────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m›\u001b[39m \u001b[36m●\u001b[39m Standard \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mMinimal\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mDemo Umami\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mCustom (next prompt)\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆ and ⬇ to select which Drupal profile to use.\u001b[39m\r\r\n"] -[15.425169, "o", "\u001b[1G\u001b[8A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mProfile \u001b[2m(7/41)\u001b[22m\u001b[22m \u001b[90m──────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Standard \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mModules \u001b[2m(8/41)\u001b[22m\u001b[39m \u001b[90m──────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m› ◼\u001b[39m Coffee \u001b[36m┃\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mConfig split\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mConfig upda"] -[15.42525, "o", "te\u001b[22m "] -[15.425306, "o", " \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mDevel\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mDrupal helpers\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mEnvironment indicator\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mFast 404\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mGenerated content\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mNavigation extra tools\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mPathauto\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └───────────────────────"] -[15.42536, "o", "───"] -[16.429262, "o", "─────────────────────── 19 selected ┘\u001b[39m\r\r\n\u001b[90m Use ⬆, ⬇ and Space bar to select one or more modules.\u001b[39m\r\r\n\u001b[1G\u001b[14A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mModules \u001b[2m(8/41)\u001b[22m\u001b[22m \u001b[90m──────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Coffee \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Config split \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Config update \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Devel \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Drupal helpers \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Environment indicator \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Fast 404 \u001b[90m│\u001b[39m\r"] -[16.429269, "o", "\r\n\u001b[90m │"] -[16.429402, "o", "\u001b[39m Generated content \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Navigation extra tools \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Pathauto \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Redirect \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Reroute email \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Robots.txt \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m SDC Devel \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Seckit \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Shield \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Stage file proxy \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Testmode \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m XML Si"] -[16.429411, "o", "temap "] -[17.430871, "o", " \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mCustom modules prefix \u001b[2m(9/41)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m sw\u001b[7m \u001b[27m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m We will use this name in custom modules\u001b[39m\r\r\n\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mCustom modules prefix \u001b[2m(9/41)\u001b[22m\u001b[22m \u001b[90m────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m s"] -[17.430882, "o", "w "] -[17.431024, "o", " \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"] -[18.435647, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mCustom modules \u001b[2m(10/41)\u001b[22m\u001b[39m \u001b[90m─────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Select which custom modules to include in your project: \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m ○ \u001b[1mBase\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Starter module with common site utilities (mail handling, \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m deploy hooks) and test scaffolding for Unit, Kernel, \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Functional, and FunctionalJavascript tests. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90"] -[18.435672, "o", "m │\u001b[39m"] -[18.435925, "o", " ○ \u001b[1mSearch\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Custom Solr search integration module. Requires the Solr \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m service to be selected. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m ○ \u001b[1mDemo\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Demonstrates how Vortex tooling works: includes a counter \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m block with CSS/JS, PHPUnit example tests across all test \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m types, and a Behat feature. Safe to remove on real projects. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m ├──────────────────────────────────────"] -[18.43613, "o", "───"] -[18.436245, "o", "────────────────────────────┤\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m› ◼\u001b[39m Base - starter module with utilities and test scaffolding \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mSearch - custom Solr search integration\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mDemo - counter block and example tests to demonstrate tooling\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └─────────────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆, ⬇ and Space bar to select one or more modules.\u001b[39m\r\r\n"] -[19.448017, "o", "\u001b[1G\u001b[25A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mCustom modules \u001b[2m(10/41)\u001b[22m\u001b[22m \u001b[90m────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Select which custom modules to include in your project: \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m ○ \u001b[1mBase\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Starter module with common site utilities (mail handling, \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m deploy hooks) and test scaffolding for Unit, Kernel, \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Functional, and FunctionalJavascript tests. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b"] -[19.448026, "o", "[39m "] -[19.448113, "o", "○ \u001b[1mSearch\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Custom Solr search integration module. Requires the Solr \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m service to be selected. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m ○ \u001b[1mDemo\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Demonstrates how Vortex tooling works: includes a counter \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m block with CSS/JS, PHPUnit example tests across all test \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m types, and a Behat feature. Safe to remove on real projects. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m ├───────────────────────────────────────────"] -[19.448122, "o", "───"] -[19.448228, "o", "──────────────────────┤\u001b[39m\r\r\n\u001b[90m │\u001b[39m Base - starter module with utilities and test scaffolding \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Search - custom Solr search integration \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Demo - counter block and example tests to demonstrate tooling \u001b[90m│\u001b[39m\r\r\n\u001b[90m └────────────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"] -[20.451353, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mTheme \u001b[2m(11/41)\u001b[22m\u001b[39m \u001b[90m───────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mOlivero\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mClaro\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mStark\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m›\u001b[39m \u001b[36m●\u001b[39m Custom (next prompt) \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆ and ⬇ to select which Drupal theme to use.\u001b[39m\r\r\n"] -[21.452224, "o", "\u001b[1G\u001b[8A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mTheme \u001b[2m(11/41)\u001b[22m\u001b[22m \u001b[90m───────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Custom (next prompt) \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mCustom theme machine name \u001b[2m(12/41)\u001b[22m\u001b[39m \u001b[90m───────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m star_wars\u001b[7m \u001b[27m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m We will use"] -[21.452613, "o", " this nam"] -[21.452876, "o", "e as a custom theme name\u001b[39m\r\r\n"] -[22.455729, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mCustom theme machine name \u001b[2m(12/41)\u001b[22m\u001b[22m \u001b[90m───────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m star_wars \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mBuild front-end assets in the container? \u001b[2m(13/41)\u001b[22m\u001b[39m \u001b[90m────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[32m●\u001b[39m Yes \u001b[2m/ ○ No\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Disable to build theme assets on the host or as part of deployment."] -[22.455741, "o", "\u001b[39m\r\r\n"] -[23.457703, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mBuild front-end assets in the container? \u001b[2m(13/41)\u001b[22m\u001b[22m \u001b[90m────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Yes \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mStorybook component library? \u001b[2m(14/41)\u001b[22m\u001b[39m \u001b[90m────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Component library for the custom theme, rendered by Drupal \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m itself. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Stories are author"] -[23.458075, "o", "ed in Twig "] -[23.458245, "o", "next to each component, so the \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m library shows the same markup the site renders. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m A development server runs on demand with `ahoy storybook`. A \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m static build is produced during provisioning and served at \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m `/storybook` in local, CI and development environments. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m ├──────────────────────────────────────────────────────────────┤\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○ Yes /\u001b[22m \u001b[32m●\u001b[39m No \u001b[90m│\u001b[39m\r\r\n\u001b[90m └───────────────────────────────"] -[23.458439, "o", "───"] -[24.463215, "o", "────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Adds Storybook packages to the theme and a step to provisioning.\u001b[39m\r\r\n\u001b[1G\u001b[17A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mStorybook component library? \u001b[2m(14/41)\u001b[22m\u001b[22m \u001b[90m────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Component library for the custom theme, rendered by Drupal \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m itself. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Stories are authored in Twig next to each component, so the \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m library shows the same markup the site renders. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m A development serv"] -[24.463594, "o", "er runs on d"] -[24.463888, "o", "emand with `ahoy storybook`. A \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m static build is produced during provisioning and served at \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m `/storybook` in local, CI and development environments. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m ├──────────────────────────────────────────────────────────────┤\u001b[39m\r\r\n\u001b[90m │\u001b[39m No \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"] -[25.466692, "o", "\r\r\n \u001b[46m\u001b[30m Code repository \u001b[39m\u001b[49m\r\r\n\r\r\n\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mRepository provider \u001b[2m(15/41)\u001b[22m\u001b[39m \u001b[90m─────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Vortex offers full automation with GitHub, while support for \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m other providers is limited. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m ├──────────────────────────────────────────────────────────────┤\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m›\u001b[39m \u001b[36m●\u001b[39m GitHub \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mOther\u001b[22m \u001b[90m"] -[25.466866, "o", "│\u001b[39m\r\r\n\u001b"] -[25.467018, "o", "[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆ and ⬇ to select your code repository provider.\u001b[39m\r\r\n"] -[26.479044, "o", "\u001b[1G\u001b[11A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mRepository provider \u001b[2m(15/41)\u001b[22m\u001b[22m \u001b[90m─────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Vortex offers full automation with GitHub, while support for \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m other providers is limited. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m ├──────────────────────────────────────────────────────────────┤\u001b[39m\r\r\n\u001b[90m │\u001b[39m GitHub \u001b[90m│\u001b[39m\r\r\n\u001b[90m └────────────────────────────────────────────────────"] -[26.479058, "o", "───"] -[26.479164, "o", "───────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"] -[27.483075, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mRelease versioning scheme \u001b[2m(16/41)\u001b[22m\u001b[39m \u001b[90m───────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Choose your versioning scheme: \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m ○ \u001b[1mCalendar Versioning (CalVer)\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[4myear.month.patch\u001b[0m (E.g., \u001b[4m24.1.0\u001b[0m) \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m https://calver.org \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m ○ \u001b[1mSemantic Versioning (SemVer)\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[4mmajor.minor.patch\u001b[0m (E.g., \u001b[4m1.0.0\u001b[0m) "] -[27.483098, "o", " "] -[27.483359, "o", " \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m https://semver.org \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m ○ \u001b[1mOther\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Custom versioning scheme of your choice. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m ├──────────────────────────────────────────────────────────────┤\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m›\u001b[39m \u001b[36m●\u001b[39m Calendar Versioning (CalVer) \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mSemantic Versioning (SemVer)\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mOther\u001b[22m \u001b"] -[27.483542, "o", "[90m│\u001b["] -[27.483648, "o", "39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆ and ⬇ to select your version scheme.\u001b[39m\r\r\n"] -[28.487696, "o", "\u001b[1G\u001b[22A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mRelease versioning scheme \u001b[2m(16/41)\u001b[22m\u001b[22m \u001b[90m───────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Choose your versioning scheme: \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m ○ \u001b[1mCalendar Versioning (CalVer)\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[4myear.month.patch\u001b[0m (E.g., \u001b[4m24.1.0\u001b[0m) \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m https://calver.org \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m ○ \u001b[1mSemantic Versioning (SemVer)\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[4mmajor.minor.patch\u001b[0m (E.g., \u001b[4m1.0.0\u001b[0m) "] -[28.487707, "o", " "] -[28.487869, "o", " \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m https://semver.org \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m ○ \u001b[1mOther\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Custom versioning scheme of your choice. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m ├──────────────────────────────────────────────────────────────┤\u001b[39m\r\r\n\u001b[90m │\u001b[39m Calendar Versioning (CalVer) \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"] -[29.492595, "o", "\r\r\n \u001b[46m\u001b[30m Environment \u001b[39m\u001b[49m\r\r\n\r\r\n\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mTimezone \u001b[2m(17/41)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m UTC\u001b[7m \u001b[27m \u001b[90m│\u001b[39m\r\r\n\u001b[90m ├──────────────────────────────────────────────────────────────┤\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2mUTC\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆ and ⬇, or start typing to select the timezone for your project.\u001b[39m\r\r\n\u001b[1G\u001b[7A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mTimezone \u001b[2m(17/41)\u001b[22m\u001b[22m \u001b[90m"] -[29.492815, "o", "────"] -[29.492945, "o", "────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m UTC \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"] -[30.493198, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mServices \u001b[2m(18/41)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m› ◼\u001b[39m ClamAV \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mSolr\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mRedis\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆, ⬇ and Space bar to select one or more services.\u001b[39m\r\r\n\u001b[1G\u001b[7A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mServices \u001b[2m(18/41)\u001b[22m\u001b[22m \u001b[90m────────────────────────────────────────────┐\u001b"] -[30.493258, "o", "[39m\r\r\n\u001b["] -[30.493326, "o", "90m │\u001b[39m ClamAV \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Solr \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Redis \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"] -[31.498728, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mDevelopment tools \u001b[2m(19/41)\u001b[22m\u001b[39m \u001b[90m───────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m› ◼\u001b[39m PHP CodeSniffer \u001b[36m┃\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mPHPStan\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mRector\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mESLint\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mStylelint\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mJest\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mPHPUnit\u001b[22m "] -[31.499037, "o", " \u001b[90"] -[31.49935, "o", "m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mBehat\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mTwig CS Fixer\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mDCLint\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └───────────────────────────────────────────────── 11 selected ┘\u001b[39m\r\r\n\u001b[90m Use ⬆, ⬇ and Space bar to select one or more tools.\u001b[39m\r\r\n"] -[32.504923, "o", "\u001b[1G\u001b[14A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mDevelopment tools \u001b[2m(19/41)\u001b[22m\u001b[22m \u001b[90m───────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m PHP CodeSniffer \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m PHPStan \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Rector \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m ESLint \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Stylelint \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Jest \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m PHPUnit \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Behat \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Twig CS Fixer \u001b[90m│\u001b[39m\r\r\n\u001b"] -[32.504931, "o", "[90m │\u001b[3"] -[32.505037, "o", "9m DCLint \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Hadolint \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"] -[33.507601, "o", "\r\r\n \u001b[46m\u001b[30m Hosting \u001b[39m\u001b[49m\r\r\n\r\r\n\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mHosting provider \u001b[2m(20/41)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mAcquia Cloud\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mLagoon\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mOther\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m›\u001b[39m \u001b[36m●\u001b[39m None \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆, ⬇ and Space bar to select your hosting provider.\u001b[39m\r\r\n"] -[34.5123, "o", "\u001b[1G\u001b[8A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mHosting provider \u001b[2m(20/41)\u001b[22m\u001b[22m \u001b[90m────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m None \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mCustom web root directory \u001b[2m(21/41)\u001b[22m\u001b[39m \u001b[90m───────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m web\u001b[7m \u001b[27m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Custom directory where the web se"] -[34.512624, "o", "rver serv"] -[34.512708, "o", "es the site.\u001b[39m\r\r\n"] -[35.517247, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mCustom web root directory \u001b[2m(21/41)\u001b[22m\u001b[22m \u001b[90m───────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m web \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\r\r\n \u001b[46m\u001b[30m Deployment \u001b[39m\u001b[49m\r\r\n\r\r\n\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mDeployment types \u001b[2m(22/41)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m›\u001b[39m ◻ Code artifact \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m◻\u001b[22m \u001b[2mLagoon webhook\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mCustom webhook\u001b[22m "] -[35.517446, "o", " \u001b["] -[35.518003, "o", "90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆, ⬇ and Space bar to select one or more deployment types.\u001b[39m\r\r\n"] -[36.522716, "o", "\u001b[1G\u001b[7A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mDeployment types \u001b[2m(22/41)\u001b[22m\u001b[22m \u001b[90m────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Custom webhook \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\r\r\n \u001b[46m\u001b[30m Workflow \u001b[39m\u001b[49m\r\r\n\r\r\n\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mProvision type \u001b[2m(23/41)\u001b[22m\u001b[39m \u001b[90m──────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Provisioning sets up the site in an environment using an \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m already assembled codebase. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │"] -[36.522736, "o", "\u001b[39m "] -[36.522958, "o", " \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m ○ \u001b[1mImport from database dump\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Provisions the site by importing a database dump \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m typically copied from production into lower \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m environments. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m ○ \u001b[1mInstall from profile\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Provisions the site by installing a fresh Drupal \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m site from a profile every time an environment is \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m created. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m ├─"] -[36.523089, "o", "───"] -[37.5286, "o", "──────────────────────────────────────────────────────────┤\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m›\u001b[39m \u001b[36m●\u001b[39m Import from database dump \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mInstall from profile\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆ and ⬇ to select the provision type.\u001b[39m\r\r\n\u001b[1G\u001b[21A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mProvision type \u001b[2m(23/41)\u001b[22m\u001b[22m \u001b[90m──────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Provisioning sets up the site in an e"] -[37.528625, "o", "nvironment"] -[37.528954, "o", " using an \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m already assembled codebase. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m ○ \u001b[1mImport from database dump\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Provisions the site by importing a database dump \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m typically copied from production into lower \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m environments. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m ○ \u001b[1mInstall from profile\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Provisions the site by installing a fresh Drupal \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m site from a profile every time an environment is \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m created. "] -[37.529273, "o", " "] -[38.530575, "o", " \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m ├──────────────────────────────────────────────────────────────┤\u001b[39m\r\r\n\u001b[90m │\u001b[39m Import from database dump \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mDatabase source \u001b[2m(24/41)\u001b[22m\u001b[39m \u001b[90m─────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m›\u001b[39m \u001b[36m●\u001b[39m URL download \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mFTP download\u001b[22m "] -[38.530889, "o", " "] -[38.530984, "o", " \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mAcquia backup\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mLagoon environment\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mContainer registry\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mS3 bucket\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mNone\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆ and ⬇ to select the database fetch source.\u001b[39m\r\r\n"] -[39.553542, "o", "\u001b[1G\u001b[11A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mDatabase source \u001b[2m(24/41)\u001b[22m\u001b[22m \u001b[90m─────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m URL download \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"] -[40.557815, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mUse a second database for migrations? \u001b[2m(25/41)\u001b[22m\u001b[39m \u001b[90m───────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○ Yes /\u001b[22m \u001b[32m●\u001b[39m No \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Adds a second database service for Drupal migrations.\u001b[39m\r\r\n"] -[41.562975, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mUse a second database for migrations? \u001b[2m(25/41)\u001b[22m\u001b[22m \u001b[90m───────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m No \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\r\r\n \u001b[46m\u001b[30m Notifications \u001b[39m\u001b[49m\r\r\n\r\r\n\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mNotification channels \u001b[2m(26/41)\u001b[22m\u001b[39m \u001b[90m───────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m› ◼\u001b[39m Email \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m◻\u001b[22m \u001b[2mGitHub\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m◻\u001b[22m \u001b[2mJIRA\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m "] -[41.563276, "o", "│\u001b[39m \u001b["] -[41.563674, "o", "2m◻\u001b[22m \u001b[2mNew Relic\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m◻\u001b[22m \u001b[2mSlack\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m◻\u001b[22m \u001b[2mWebhook\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆, ⬇ and Space bar to select one or more notification channels.\u001b[39m\r\r\n"] -[42.567115, "o", "\u001b[1G\u001b[10A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mNotification channels \u001b[2m(26/41)\u001b[22m\u001b[22m \u001b[90m───────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Email \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\r\r\n \u001b[46m\u001b[30m Continuous Integration \u001b[39m\u001b[49m\r\r\n\r\r\n\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mContinuous Integration provider \u001b[2m(27/41)\u001b[22m\u001b[39m \u001b[90m─────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m›\u001b[39m \u001b[36m●\u001b[39m GitHub Actions \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mCircleCI\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mNone\u001b[22m "] -[42.567339, "o", " \u001b["] -[42.567501, "o", "90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆ and ⬇ to select the CI provider.\u001b[39m\r\r\n"] -[43.571947, "o", "\u001b[1G\u001b[7A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mContinuous Integration provider \u001b[2m(27/41)\u001b[22m\u001b[22m \u001b[90m─────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m GitHub Actions \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mVisual regression testing with Diffy? \u001b[2m(28/41)\u001b[22m\u001b[39m \u001b[90m───────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Diffy-powered visual regression workflow to compare deployed \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m environments. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Automatically trig"] -[43.571961, "o", "gers compar"] -[43.572067, "o", "isons for dependency-update \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m pull requests matching the configured branch pattern \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m (`deps/*` by default). \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Runs comparisons for pull requests tagged with the `VR` \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m label and posts a sticky comment. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Also supports manual runs against any URL. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m ├──────────────────────────────────────────────────────────────┤\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○ Yes /\u001b[22m "] -[43.57208, "o", "\u001b[32m●\u001b["] -[44.578802, "o", "39m No \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Requires a Diffy account.\u001b[39m\r\r\n\u001b[1G\u001b[19A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mVisual regression testing with Diffy? \u001b[2m(28/41)\u001b[22m\u001b[22m \u001b[90m───────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Diffy-powered visual regression workflow to compare deployed \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m environments. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Automatically triggers comparisons for dependency-update \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m pull requests matching the configured branch pattern \u001b[90m│\u001b[39m\r\r\n"] -[44.578813, "o", "\u001b[90m │\u001b["] -[44.579093, "o", "39m (`deps/*` by default). \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Runs comparisons for pull requests tagged with the `VR` \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m label and posts a sticky comment. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Also supports manual runs against any URL. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m ├──────────────────────────────────────────────────────────────┤\u001b[39m\r\r\n\u001b[90m │\u001b[39m No \u001b[90m│\u001b[39m\r\r\n\u001b[90m └────────────────────────────"] -[44.579283, "o", "───"] -[45.583027, "o", "───────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mScan for committed secrets with Gitleaks? \u001b[2m(29/41)\u001b[22m\u001b[39m \u001b[90m───────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[32m●\u001b[39m Yes \u001b[2m/ ○ No\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Runs in CI to detect hardcoded passwords, API keys and tokens.\u001b[39m\r\r\n\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mScan for committed secrets with Gitleaks? \u001b[2m(29/41)\u001b[22m\u001b[22m \u001b[90m───────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Yes \u001b[90m│\u001b[39m\r\r\n\u001b[90m └─────────────────────────────────────────"] -[45.583329, "o", "───"] -[45.583565, "o", "──────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"] -[46.587489, "o", "\r\r\n \u001b[46m\u001b[30m Automations \u001b[39m\u001b[49m\r\r\n\r\r\n\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mDependency updates provider \u001b[2m(30/41)\u001b[22m\u001b[39m \u001b[90m─────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m›\u001b[39m \u001b[36m●\u001b[39m Renovate GitHub app \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mRenovate self-hosted in CI\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mNone\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆ and ⬇ to select the dependency updates provider.\u001b[39m\r\r\n\u001b[1G\u001b[7A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mDependency updates provider \u001b[2m(30/41)\u001b[22m\u001b[22m \u001b[90m─────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Ren"] -[46.587812, "o", "ovate GitHub"] -[46.58808, "o", " app \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"] -[47.592483, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mAuto-merge dependency updates \u001b[2m(31/41)\u001b[22m\u001b[39m \u001b[90m───────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Pull requests in the selected groups are merged as soon as \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m they meet the branch protection rules. Pull requests in \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m other groups need a manual merge. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Requires \"Allow auto-merge\" in the repository settings and \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m at least one required status check on the base branch. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m ├─────────────────────────────────────"] -[47.592496, "o", "────"] -[47.592601, "o", "─────────────────────┤\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m› ◼\u001b[39m PHP packages, except Drupal core (minor and patch) \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mDrupal core (minor and patch)\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mJavaScript packages (minor and patch)\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mContainer images (major, minor and patch)\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mCI tools (major, minor and patch)\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mGitHub Actions (major, minor and patch)\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆, ⬇ and Space bar to select one or more groups.\u001b[39m\r\r\n"] -[48.603783, "o", "\u001b[1G\u001b[19A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mAuto-merge dependency updates \u001b[2m(31/41)\u001b[22m\u001b[22m \u001b[90m───────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Pull requests in the selected groups are merged as soon as \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m they meet the branch protection rules. Pull requests in \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m other groups need a manual merge. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Requires \"Allow auto-merge\" in the repository settings and \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m at least one required status check on the base branch. \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m ├────────────────────────────────────"] -[48.603799, "o", "───"] -[48.604011, "o", "───────────────────────┤\u001b[39m\r\r\n\u001b[90m │\u001b[39m PHP packages, except Drupal core (minor and patch) \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Drupal core (minor and patch) \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m JavaScript packages (minor and patch) \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Container images (major, minor and patch) \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m CI tools (major, minor and patch) \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m GitHub Actions (major, minor and patch) \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"] -[49.608335, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mCode coverage provider \u001b[2m(32/41)\u001b[22m\u001b[39m \u001b[90m──────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○\u001b[22m \u001b[2mCodecov\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m›\u001b[39m \u001b[36m●\u001b[39m None \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆ and ⬇ to select the code coverage provider.\u001b[39m\r\r\n"] -[50.613136, "o", "\u001b[1G\u001b[6A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mCode coverage provider \u001b[2m(32/41)\u001b[22m\u001b[22m \u001b[90m──────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m None \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mAuto-assign the author to their PR? \u001b[2m(33/41)\u001b[22m\u001b[39m \u001b[90m─────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[32m●\u001b[39m Yes \u001b[2m/ ○ No\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Helps to keep the PRs organized.\u001b[39m\r\r\n"] -[51.613864, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mAuto-assign the author to their PR? \u001b[2m(33/41)\u001b[22m\u001b[22m \u001b[90m─────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Yes \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mAuto-add a CONFLICT label to a PR when conflicts occur? \u001b[2m(34/41)\u001b[22m\u001b[39m \u001b[90m┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[32m●\u001b[39m Yes \u001b[2m/ ○ No\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └─────────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Helps to keep quickly identify PRs that need attention.\u001b[39m\r\r\n"] -[52.617614, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mAuto-add a CONFLICT label to a PR when conflicts occur? \u001b[2m(34/41)\u001b[22m\u001b[22m \u001b[90m┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Yes \u001b[90m│\u001b[39m\r\r\n\u001b[90m └─────────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\r\r\n \u001b[46m\u001b[30m Documentation \u001b[39m\u001b[49m\r\r\n\r\r\n\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mPreserve project documentation? \u001b[2m(35/41)\u001b[22m\u001b[39m \u001b[90m─────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[32m●\u001b[39m Yes \u001b[2m/ ○ No\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Helps to maintain the project documentation"] -[52.618108, "o", " within the "] -[52.618304, "o", "repository.\u001b[39m\r\r\n"] -[53.621005, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mPreserve project documentation? \u001b[2m(35/41)\u001b[22m\u001b[22m \u001b[90m─────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Yes \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\r\r\n \u001b[46m\u001b[30m AI \u001b[39m\u001b[49m\r\r\n\r\r\n\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mProvide AI agent instructions? \u001b[2m(36/41)\u001b[22m\u001b[39m \u001b[90m──────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[32m●\u001b[39m Yes \u001b[2m/ ○ No\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Provides AI coding agents"] -[53.621012, "o", " with better"] -[53.621171, "o", " context about the project.\u001b[39m\r\r\n"] -[54.625137, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mProvide AI agent instructions? \u001b[2m(36/41)\u001b[22m\u001b[22m \u001b[90m──────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Yes \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\r\r\n \u001b[46m\u001b[30m \u001b[39m\u001b[49m\r\r\n \u001b[46m\u001b[30m Installation summary \u001b[39m\u001b[49m\r\r\n \u001b[46m\u001b[30m \u001b[39m\u001b[49m\r\r\n\r\r\n\r\r\n \u001b[90m┌────────────────────────────────────┬────────────────────────────────────┐\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[36m\u001b[1mGeneral information\u001b[22m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│"] -[54.625169, "o", "\u001b[39m\u001b[39m "] -[54.625423, "o", "Site name \u001b[39m\u001b[90m│\u001b[39m\u001b[39m Star Wars \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Site machine name \u001b[39m\u001b[90m│\u001b[39m\u001b[39m star_wars \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Organization name \u001b[39m\u001b[90m│\u001b[39m\u001b[39m Rebellion \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Organization machine name \u001b[39m\u001b[90m│\u001b[39m\u001b[39m rebellion \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Public domain \u001b[39m\u001b[90m│\u001b[39m\u001b[39m star-wars.com \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[36m\u001b[1mDrupal\u001b[22m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Starter \u001b[39m\u001b[90m│\u001b[39m\u001b[39m load_demodb \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Modules \u001b[39m\u001b[90m│\u001b[39m\u001b[39m cof"] -[54.625548, "o", "fee, co"] -[55.629481, "o", "nfig_split,\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m config_update, devel,\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m drupal_helpers,\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m environment_indicator, fast_404,\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m generated_content,\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m navigation_extra_tools, pathauto,\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m redirect, reroute_email,\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m robotstxt, sdc_deve"] -[55.629855, "o", "l, seck"] -[55.630124, "o", "it,\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m shield, stage_file_proxy,\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m testmode, xmlsitemap \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Webroot \u001b[39m\u001b[90m│\u001b[39m\u001b[39m web \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Profile \u001b[39m\u001b[90m│\u001b[39m\u001b[39m standard \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Module prefix \u001b[39m\u001b[90m│\u001b[39m\u001b[39m sw \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Custom modules \u001b[39m\u001b[90m│\u001b[39m\u001b[39m base, search, demo \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Theme machine name \u001b[39m\u001b[90m│\u001b[39m\u001b[39m star_wars \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Build f"] -[55.630487, "o", "ront-end"] -[55.630756, "o", " in container \u001b[39m\u001b[90m│\u001b[39m\u001b[39m Yes \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Storybook component library \u001b[39m\u001b[90m│\u001b[39m\u001b[39m No \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[36m\u001b[1mCode repository\u001b[22m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Code provider \u001b[39m\u001b[90m│\u001b[39m\u001b[39m github \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Version scheme \u001b[39m\u001b[90m│\u001b[39m\u001b[39m calver \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[36m\u001b[1mEnvironment\u001b[22m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Timezone \u001b[39m\u001b[90m│\u001b[39m\u001b[39m UTC \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Services \u001b[39m\u001b[90m│\u001b[39m\u001b[39m"] -[55.631039, "o", " clamav"] -[55.631159, "o", ", redis, solr \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Tools \u001b[39m\u001b[90m│\u001b[39m\u001b[39m behat, dclint, eslint, hadolint,\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m jest, phpcs, phpstan, phpunit,\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m rector, stylelint, twig_cs_fixer \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[36m\u001b[1mHosting\u001b[22m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Hosting provider \u001b[39m\u001b[90m│\u001b[39m\u001b[39m none \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[36m\u001b[1mDeployment\u001b[22m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Deployment types \u001b[39m\u001b[90m│\u001b[39m\u001b[39m webhook "] -[55.631436, "o", " "] -[55.631602, "o", " \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[36m\u001b[1mWorkflow\u001b[22m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Provision type \u001b[39m\u001b[90m│\u001b[39m\u001b[39m database \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Database source \u001b[39m\u001b[90m│\u001b[39m\u001b[39m url \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Migration database \u001b[39m\u001b[90m│\u001b[39m\u001b[39m No \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[36m\u001b[1mNotifications\u001b[22m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Channels \u001b[39m\u001b[90m│\u001b[39m\u001b[39m email \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[36m\u001b[1mContinuous Integration\u001b[22m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n"] -[55.631614, "o", " \u001b[90m"] -[55.631915, "o", "│\u001b[39m\u001b[39m CI provider \u001b[39m\u001b[90m│\u001b[39m\u001b[39m gha \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Visual regression testing \u001b[39m\u001b[90m│\u001b[39m\u001b[39m No \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Secret scanning with Gitleaks \u001b[39m\u001b[90m│\u001b[39m\u001b[39m Yes \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[36m\u001b[1mAutomations\u001b[22m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Dependency updates provider \u001b[39m\u001b[90m│\u001b[39m\u001b[39m renovatebot_app \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Auto-merge dependency updates \u001b[39m\u001b[90m│\u001b[39m\u001b[39m php, drupal_core, js,\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m container_images, ci_tools,\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m "] -[55.631926, "o", " "] -[55.63218, "o", "\u001b[39m\u001b[90m│\u001b[39m\u001b[39m github_actions \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Code coverage provider \u001b[39m\u001b[90m│\u001b[39m\u001b[39m none \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Auto-assign PR author \u001b[39m\u001b[90m│\u001b[39m\u001b[39m Yes \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Auto-add a CONFLICT label to PRs \u001b[39m\u001b[90m│\u001b[39m\u001b[39m Yes \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[36m\u001b[1mDocumentation\u001b[22m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Preserve project documentation \u001b[39m\u001b[90m│\u001b[39m\u001b[39m Yes \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[36m\u001b[1mAI\u001b[22m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m AI agent instructions \u001b[39m\u001b[90m│\u001b[39m\u001b[39m Yes "] -[55.632191, "o", " "] -[55.632436, "o", " \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[36m\u001b[1mLocations\u001b[22m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Current directory \u001b[39m\u001b[90m│\u001b[39m\u001b[39m /home/user/vortex/.ar\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m tifacts/tmp/videos-workspace \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Destination directory \u001b[39m\u001b[90m│\u001b[39m\u001b[39m /home/user/vortex/.ar\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m tifacts/tmp/videos-workspace/star_\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\u001b[39m wars \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Vortex repository \u001b[39m\u001b[90m│\u001b[39m\u001b[39m /home/user/vortex \u001b[39m\u001b[90m│\u001b[39m\r"] -[55.632733, "o", "\r\n \u001b[90m"] -[55.632889, "o", "│\u001b[39m\u001b[39m Vortex reference \u001b[39m\u001b[90m│\u001b[39m\u001b[39m HEAD \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m└────────────────────────────────────┴────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n Vortex will be installed into your project's directory \"/home/user/demo/star_wars\"\r\r\n"] -[57.63594, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mProceed with installing Vortex?\u001b[39m \u001b[90m─────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[32m●\u001b[39m Yes \u001b[2m/ ○ No\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n"] -[59.641371, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mProceed with installing Vortex?\u001b[22m \u001b[90m─────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Yes \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h\r\r\n \u001b[46m\u001b[30m Starting project installation \u001b[39m\u001b[49m\r\r\n\r\r\n\u001b[?25l\r\r\n \u001b[36m⠂\u001b[39m \u001b[33mDownloading Vortex\u001b[39m\r\r\n\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠒\u001b[39m \u001b[33mDownloading Vortex\u001b[39m\r\r\n\u001b[999D\u001b[2A\u001b[J\u001b[?25h\r\r\n \u001b[34m✦ Downloading Vortex\u001b[39m\r\r\n\r\r\n\r\r\n \u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\r\r\n\r\r\n\r\r\n \u001b[2mDownloading from \"/home/user/vortex\" repository at ref\u001b[22m\r\r\n \u001b[2m\"HEAD\"\u001b[22m\r\r\n\r\r\n\r\r\n \u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\r\r\n\r\r\n\r\r\n \u001b[32m✓ Vortex downloaded (develop)\u001b[39m\r\r\n\r\r\n\r\r\n \u001b[A\u001b[A\u001b[A\u001b[A\r\r\n\r\r\n\u001b[?25l\r\r\n \u001b[36m⠂\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n\u001b[1G\u001b"] -[59.642154, "o", "[2A\u001b[J\r\r\n \u001b[36m⠒\u001b[39m \u001b[33mCusto"] -[60.646035, "o", "mizing Vortex for your project\u001b[39m\r\r\n\u001b[999D\u001b[2A\u001b[J\u001b[?25h\r\r\n \u001b[34m✦ Customizing Vortex for your project\u001b[39m\r\r\n\r\r\n\r\r\n \u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\r\r\n\r\r\n\r\r\n \u001b[32m✓ Vortex was customized for your project\u001b[39m\r\r\n\r\r\n\r\r\n \u001b[A\u001b[A\u001b[A\u001b[A\r\r\n\r\r\n\u001b[?25l\r\r\n \u001b[36m⠂\u001b[39m \u001b[33mPreparing destination directory\u001b[39m\r\r\n\u001b[999D\u001b[2A\u001b[J\u001b[?25h\r\r\n \u001b[34m✦ Preparing destination directory\u001b[39m\r\r\n\r\r\n\r\r\n \u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\r\r\n\r\r\n\r\r\n \u001b[2mCreated directory \"/home/user/demo/star_wars\".\u001b[22m\r\r\n\r\r\n\r\r\n \u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\r\r\n\r\r\n\r\r\n \u001b[2mInitializing a new Git repository in directory \"/home/user/demo/star_wars\".\u001b[22m\r\r\n\r\r\n\r\r\n \u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\r\r\n\r\r\n\r\r\n \u001b[32m✓ Destination directory is ready\u001b[39m\r\r\n\r\r\n\r\r\n \u001b[A\u001b[A\u001b[A\u001b[A\r\r\n\r\r\n\u001b[?25l\r\r\n \u001b[36m⠂\u001b[39m \u001b[33mCopying files to the destination directory\u001b[39m\r\r\n\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠒\u001b[39m \u001b[33mCopying files to the destination directory\u001b[39m\r\r\n\u001b[999D\u001b[2A\u001b[J\u001b[?25h\r\r\n \u001b[34m✦ Copying files to the destination directory\u001b[39m\r\r\n\r\r\n\r"] -[60.64605, "o", "\r\n \u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\r\r\n\r\r\n\r\r\n \u001b[32m✓ Files copied "] -[60.646147, "o", "to destination directory\u001b[39m\r\r\n\r\r\n"] -[60.646196, "o", "\r\r\n \u001b[A\u001b[A\u001b[A\u001b[A\r\r\n\r\r\n"] -[60.646372, "o", "\u001b[?25l"] -[60.650228, "o", "\r\r\n \u001b[36m⠂\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"] -[60.733243, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠒\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"] -[60.818869, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠐\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"] -[60.900329, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠰\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"] -[60.984926, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠠\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"] -[61.065473, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠤\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"] -[61.147791, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠄\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"] -[61.230432, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠆\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"] -[61.30935, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠂\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"] -[61.388788, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠒\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"] -[61.400264, "o", "\u001b[999D\u001b[2A\u001b[J\u001b[?25h"] -[61.400443, "o", "\r\r\n \u001b[34m✦ Preparing demo content\u001b[39m\r\r\n\r\r\n\r\r\n \u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\r\r\n\r\r\n\r\r\n \u001b[2mCreated data directory \"/home/user/demo/star_wars/.data\".\u001b[22m\r\r\n\r\r\n\r\r\n \u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\r\r\n\r\r\n\r\r\n \u001b[2mNo database dump file was found in \"/home/user/demo/star_wars/.data\" directory.\u001b[22m\r\r\n\r\r\n\r\r\n \u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\r\r\n\r\r\n\r\r\n \u001b[2mFetched demo database from https://github.com/drevops/vortex/releases/download/1.40.0/db.demo.sql.\u001b[22m\r\r\n\r\r\n\r\r\n \u001b[A\u001b[A\u001b[A\u001b[A\u001b[A\r\r\n\r\r\n\r\r\n \u001b[32m✓ Demo content prepared\u001b[39m\r\r\n\r\r\n\r\r\n \u001b[A\u001b[A\u001b[A\u001b[A\r\r\n\r\r\n"] -[61.402975, "o", "\r\r\n \u001b[90m┌───────────────────────────────────┐\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[32mFinished installing Vortex\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[32m──────────────────────────\u001b[39m\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Add and commit all files:\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m git add -A\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m git commit -m \"Initial commit.\"\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m└───────────────────────────────────┘\u001b[39m\r\r\n\r\r\n"] -[61.419715, "o", "\u001b[?25l"] -[61.422415, "o", "\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mRun the site build now?\u001b[39m \u001b[90m─────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[2m○ Yes /\u001b[22m \u001b[32m●\u001b[39m No \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Takes ~5-10 min; output will be streamed. You can skip and run later with…\u001b[39m\r\r\n"] -[63.435549, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mRun the site build now?\u001b[22m \u001b[90m─────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m No \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"] -[63.444408, "o", "\r\r\n \u001b[90m┌────────────────────────────────────────────────────────────────────────────┐\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[32mReady to build\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[32m──────────────\u001b[39m\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Build the site:\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m ahoy build\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[39m \u001b[39m\u001b[90m"] -[63.444424, "o", "│\u001b[39"] -[63.444533, "o", "m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Setup GitHub Actions:\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m https://www.vortextemplate.com/docs/continuous-integration/github-actions#\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m onboarding\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m└────────────────────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n"] -[63.455073, "x", "0"] +{"version":2,"width":80,"height":27,"timestamp":1794359042,"command":"/home/user/demo/installer.exp","title":"Vortex Installer Demo","env":{"SHELL":"/opt/homebrew/opt/bash/bin/bash"}} +[0.525279, "o", "\u001b[36m──────────────────────────────────────────────────────────────────────────────\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m ██╗ ██╗ ██████╗ ██████╗ ████████╗ ███████╗ ██╗ ██╗\u001b[39m\r\r\n\u001b[36m ██║ ██║ ██╔═══██╗ ██╔══██╗ ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝\u001b[39m\r\r\n\u001b[36m ██║ ██║ ██║ ██║ ██████╔╝ ██║ █████╗ ╚███╔╝\u001b[39m\r\r\n\u001b[36m ╚██╗ ██╔╝ ██║ ██║ ██╔══██╗ ██║ ██╔══╝ ██╔██╗\u001b[39m\r\r\n\u001b[36m ╚████╔╝ ╚██████╔╝ ██║ ██║ ██║ "] +[0.525396, "o", " █"] +[0.525495, "o", "██████╗ ██╔╝ ██╗\u001b[39m\r\r\n\u001b[36m ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝ ╚═╝ ╚═╝\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m Drupal project template\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m by DrevOps\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m──────────────────────────────────────────────────────────────────────────────\u001b[39m\r\r\n\u001b[2m Installer version: development\u001b[22m\r\r\n"] +[0.526733, "o", "\u001b[90m│\u001b[0m \u001b[90m┌───────────────────────────────────────────────────────────────────────────┐\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mWelcome to the Vortex interactive installer\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m───────────────────────────────────────────\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m This tool will guide you through installing the latest \u001b[4mdevelopment\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m version of Vortex into your project. \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m You will be asked a few questions to tailor the c"] +[0.526737, "o", "onfigu"] +[0.52684, "o", "ration to your \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m site. \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m No changes will be made until you confirm everything at the end. \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Press \u001b[33mCtrl+C\u001b[39m at any time to exit the installer.\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Press \u001b[33mCtrl+U\u001b[39m at any time to go back to the previous step.\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m└───────────────────────────────────────────────────────────────────────────┘\u001b[0m\r\r\n\u001b[90m│\u001b"] +[0.526876, "o", "[0m\r\r\n"] +[0.527437, "o", "\u001b[36m◇\u001b[0m Validating repository and reference\r\r\n"] +[0.533838, "o", "\u001b[90m│\u001b[0m \u001b[2mChecking repository \"/home/user/vortex\" and reference \"HEAD\"\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Repository and reference validated successfully\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[0.550515, "o", "\u001b[?25l"] +[0.550572, "o", "\u001b[36m◇\u001b[0m Press any key to continue...\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[3.554701, "o", "\u001b[2A\r\u001b[J"] +[3.561934, "o", "\u001b[?25h"] +[3.576967, "o", "\u001b[?25l"] +[3.577043, "o", "\r\r\n\u001b[90m┌\u001b[0m \u001b[1mGeneral information\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[3.577678, "o", "\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[3.732154, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar war\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar wa\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar w\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar \u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use"] +[3.732161, "o", " this name in the project an"] +[4.491371, "o", "d documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37msta\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mst\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37ms\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] +[4.491491, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe "] +[4.491627, "o", "will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.496006, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r"] +[5.496075, "o", "\r\n\u001b[90m│\u001b[0m \u001b[2mWe will u"] +[5.496085, "o", "se this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.496216, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.496369, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.496487, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.496578, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.496677, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.496775, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.49688, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.496984, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.497086, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.497188, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.49728, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.49737, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.497477, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.497567, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.497665, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.497771, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.497885, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.497948, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.498062, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.49815, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.498268, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.4984, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.498502, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.498625, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.498669, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.498756, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.498852, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.49896, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.49905, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.499141, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.499257, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.499357, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.499455, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.499591, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mS\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.499656, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mSt\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.499711, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mSta\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.499882, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.499965, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar \u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.500077, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar W\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.50013, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wa\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.500253, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar War\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.500351, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.500417, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Site name (1/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mStar Wars\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.500959, "o", "\u001b[36m◇\u001b[0m Site machine name \u001b[2m(2/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar_wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name for the project directory and in the code.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.505088, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Site machine name (2/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mstar_wars\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.505541, "o", "\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.658605, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars Or\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars O\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars \u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar War\u001b[0"] +[6.658662, "o", "m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0"] +[7.87982, "o", "m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wa\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar W\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar \u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m O"] +[7.88, "o", "rganization name \u001b[2m(3/32)"] +[7.880301, "o", "\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mSta\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mSt\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mS\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[8.883668, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] +[8.883755, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] +[8.883763, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[9.887598, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] +[9.887763, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] +[9.887848, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[10.890701, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] +[10.890709, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] +[10.890799, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[11.89437, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] +[11.894377, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] +[11.894477, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[12.896034, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] +[12.896044, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] +[12.896194, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[13.900065, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] +[13.90007, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] +[13.900175, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[14.904974, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] +[14.904981, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] +[14.905083, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[15.905631, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mR\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRe\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mReb\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebe\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r"] +[15.905646, "o", "\r\n\u001b[90m│\u001b[0m \u001b[2mWe will "] +[15.905759, "o", "use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[16.906282, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebel\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebell\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebelli\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebellio\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebellion\u001b[0m\u001b[36m█\u001b[0m\r\r"] +[16.906288, "o", "\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m"] +[16.906366, "o", " \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[17.910635, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Organization name (3/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mRebellion\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Organization machine name \u001b[2m(4/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mrebellion\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the code.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Organization machine name (4/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mrebellion\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Public domain \u001b[2m(5/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar-wars.com\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mDomain name without protocol and trailing slash.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Public domain (5/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mstar-wars.com\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mDrupal\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m How would you like your site to be created on the first run? \u001b[2m(6/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mChoose how your site will be created the first time after this installer\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mfinishes:\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n"] +[17.910668, "o", "\u001b[90m│\u001b[0m \u001b[2;3m ○"] +[17.910787, "o", " \u001b[1mDrupal, installed from profile\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Creates a new site by \u001b[4mpopulating a fresh database\u001b[0m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m from one of the standard Drupal installation profiles.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mDrupal CMS, installed from profile\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Creates a new site by \u001b[4mpopulating a fresh database\u001b[0m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m from the Drupal CMS recipe.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mDrupal, loaded from the demo database\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Creates a site by \u001b[4mloading an existing demo database\u001b[0m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m provided with the installer.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mDrupal, installed from profile\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mDrupal CMS, installed from profile\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Drupal, loaded from the demo database\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b["] +[17.910791, "o", "90m│\u001b[0m \u001b[2m"] +[18.913738, "o", "Use ⬆ and ⬇. Applies only on the first run of the installer.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[22A\r\u001b[J\u001b[36m◆\u001b[0m How would you like your site to be created on the first run? (6/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mDrupal, loaded from the demo database\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Profile \u001b[2m(7/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Standard\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mMinimal\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mDemo Umami\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mCustom (next prompt)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select which Drupal profile to use.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[9A\r\u001b[J\u001b[36m◆\u001b[0m Profile (7/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mStandard\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Modules \u001b[2m(8/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m Coffee\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Config split\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Config update\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Devel\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Drupal helpers\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Environment in"] +[18.913753, "o", "dicator\r\r\n\u001b[90m│\u001b[0m \u001b["] +[18.913984, "o", "32m◼\u001b[0m Fast 404\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Generated content\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Navigation extra tools\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Pathauto\r\r\n\u001b[90m│\u001b[0m \u001b[2m↓ 9 more\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more modules.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[19.916725, "o", "\u001b[17A\r\u001b[J\u001b[36m◆\u001b[0m Modules (8/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mCoffee, Config split, Config update, Devel, Drupal helpers, Environment\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mindicator, Fast 404, Generated content, Navigation extra tools, Pathauto,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRedirect, Reroute email, Robots.txt, SDC Devel, Seckit, Shield, Stage file\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mproxy, Testmode, XML Sitemap\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Custom modules prefix \u001b[2m(9/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37msw\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in custom modules\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Custom modules prefix (9/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2msw\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Custom modules \u001b[2m(10/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mSelect which custom modules to include in your project:\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mBase\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Starter module with common site utilities (mail handling,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m "] +[19.916733, "o", "deploy hooks) and te"] +[19.916841, "o", "st scaffolding for Unit, Kernel,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Functional, and FunctionalJavascript tests.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mSearch\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Custom Solr search integration module. Requires the Solr\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m service to be selected.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mDemo\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Demonstrates how Vortex tooling works: includes a counter\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m block with CSS/JS, PHPUnit example tests across all test\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m types, and a Behat feature. Safe to remove on real projects.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m Base - starter module with utilities and test scaffolding\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Search - custom Solr search integration\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Demo - counter block and example tests to demonstrate tooling\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space"] +[19.916847, "o", " bar to select o"] +[20.921686, "o", "ne or more modules.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[23A\r\u001b[J\u001b[36m◆\u001b[0m Custom modules (10/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mBase - starter module with utilities and test scaffolding, Search - custom\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mSolr search integration, Demo - counter block and example tests to\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mdemonstrate tooling\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Theme \u001b[2m(11/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mOlivero\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mClaro\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mStark\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Custom (next prompt)\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select which Drupal theme to use.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[9A\r\u001b[J\u001b[36m◆\u001b[0m Theme (11/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mCustom (next prompt)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Custom theme machine name \u001b[2m(12/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar_wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name as a custom theme name\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m"] +[20.921692, "o", " Custom theme machine na"] +[20.921778, "o", "me (12/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mstar_wars\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[21.924945, "o", "\u001b[36m◇\u001b[0m Build front-end assets in the container? \u001b[2m(13/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mDisable to build theme assets on the host or as part of deployment.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Build front-end assets in the container? (13/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Storybook component library? \u001b[2m(14/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mComponent library for the custom theme, rendered by Drupal itself.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mStories are authored in Twig next to each component, so the library shows the\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3msame markup the site renders.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mA development server runs on demand with `ahoy storybook`. A static build is\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mproduced during provisioning and served at `/storybook` in local, CI and\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mdevelopment environments.\u001b[0m\r\r\n\u001b[90m│\u001b["] +[21.924952, "o", "0m\r\r\n\u001b[90m│\u001b[0m "] +[21.925082, "o", "\u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mAdds Storybook packages to the theme and a step to provisioning.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[22.927396, "o", "\u001b[14A\r\u001b[J\u001b[36m◆\u001b[0m Storybook component library? (14/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mCode repository\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Repository provider \u001b[2m(15/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mVortex offers full automation with GitHub, while support for other providers\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mis limited.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m GitHub\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mOther\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select your code repository provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[9A\r\u001b[J\u001b[36m◆\u001b[0m Repository provider (15/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mGitHub\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Release versioning scheme \u001b[2m(16/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mChoose your versioning scheme:\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mCalendar Versioning (CalVer)\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m \u001b[4myear.month.patch\u001b[0m\u001b[2;3m (E.g., \u001b[4m24.1.0\u001b[0m\u001b[2;3m)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m https://calver.org\u001b[0"] +[22.927402, "o", "m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3"] +[22.927517, "o", "m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mSemantic Versioning (SemVer)\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m \u001b[4mmajor.minor.patch\u001b[0m\u001b[2;3m (E.g., \u001b[4m1.0.0\u001b[0m\u001b[2;3m)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m https://semver.org\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mOther\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Custom versioning scheme of your choice.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Calendar Versioning (CalVer)\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mSemantic Versioning (SemVer)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mOther\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select your version scheme.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[23.932223, "o", "\u001b[20A\r\u001b[J\u001b[36m◆\u001b[0m Release versioning scheme (16/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mCalendar Versioning (CalVer)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mEnvironment\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Timezone \u001b[2m(17/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mUTC\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mEtc/UTC\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUTC\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇, or start typing to select the timezone for your project.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Timezone (17/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mUTC\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Services \u001b[2m(18/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m ClamAV\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Solr\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Redis\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more services.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[23.932276, "o", "\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Services (18/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mClamAV, Redis, Solr\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[24.933795, "o", "\u001b[36m◇\u001b[0m Development tools \u001b[2m(19/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m PHP CodeSniffer\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m PHPStan\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Rector\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m ESLint\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Stylelint\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Jest\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m PHPUnit\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Behat\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Twig CS Fixer\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m DCLint\r\r\n\u001b[90m│\u001b[0m \u001b[2m↓ 1 more\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more tools.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[25.938558, "o", "\u001b[17A\r\u001b[J\u001b[36m◆\u001b[0m Development tools (19/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mBehat, DCLint, ESLint, Hadolint, Jest, PHP CodeSniffer, PHPStan, PHPUnit,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRector, Stylelint, Twig CS Fixer\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mHosting\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Hosting provider \u001b[2m(20/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mAcquia Cloud\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mLagoon\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mOther\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m None\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select your hosting provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[26.941497, "o", "\u001b[9A\r\u001b[J\u001b[36m◆\u001b[0m Hosting provider (20/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Custom web root directory \u001b[2m(21/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mweb\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mCustom directory where the web server serves the site.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[27.9463, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Custom web root directory (21/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mweb\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mDeployment\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Deployment types \u001b[2m(22/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◻\u001b[0m Code artifact\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mLagoon webhook\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Custom webhook\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more deployment types.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[28.947875, "o", "\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Deployment types (22/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mCustom webhook\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mWorkflow\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Provision type \u001b[2m(23/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mProvisioning sets up the site in an environment using an already assembled\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mcodebase.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mImport from database dump\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Provisions the site by importing a database dump\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m typically copied from production into lower\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m environments.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mInstall from profile\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Provisions the site by installing a fresh Drupal\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m site from a profile every time an environment is\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m created.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Import from database dump\r\r\n\u001b[9"] +[28.947881, "o", "0m│\u001b[0m \u001b[2m○\u001b["] +[28.947978, "o", "0m \u001b[2mInstall from profile\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the provision type.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[29.948185, "o", "\u001b[19A\r\u001b[J\u001b[36m◆\u001b[0m Provision type (23/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mImport from database dump\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Database source \u001b[2m(24/36)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m URL download\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mFTP download\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mAcquia backup\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mLagoon environment\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mContainer registry\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mS3 bucket\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the database fetch source.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[30.948908, "o", "\u001b[12A\r\u001b[J\u001b[36m◆\u001b[0m Database source (24/36)\r\r\n\u001b[90m│\u001b[0m \u001b[2mURL download\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Use a second database for migrations? \u001b[2m(25/36)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mAdds a second database service for Drupal migrations.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[31.949607, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Use a second database for migrations? (25/36)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mNotifications\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Notification channels \u001b[2m(26/36)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m Email\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mGitHub\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mJIRA\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mNew Relic\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mSlack\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mWebhook\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more notification channels.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[31.949672, "o", "\u001b[11A\r\u001b[J\u001b[36m◆\u001b[0m Notification channels (26/36)\r\r\n\u001b[90m│\u001b[0m \u001b[2mEmail\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[32.950917, "o", "\u001b[90m├\u001b[0m \u001b[1mContinuous Integration\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Continuous Integration provider \u001b[2m(27/36)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m GitHub Actions\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mCircleCI\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the CI provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[33.95586, "o", "\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Continuous Integration provider (27/36)\r\r\n\u001b[90m│\u001b[0m \u001b[2mGitHub Actions\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Visual regression testing with Diffy? \u001b[2m(28/36)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mDiffy-powered visual regression workflow to compare deployed environments.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mAutomatically triggers comparisons for dependency-update pull requests\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mmatching the configured branch pattern (`deps/*` by default).\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mRuns comparisons for pull requests tagged with the `VR` label and posts a\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3msticky comment.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mAlso supports manual runs against any URL.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRequires a Diffy account.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[33.955902, "o", "\u001b[15A\r\u001b[J\u001b[36m◆\u001b[0m Visual regression testing with Diffy? (28/36)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[34.960716, "o", "\u001b[36m◇\u001b[0m Scan for committed secrets with Gitleaks? \u001b[2m(29/36)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRuns in CI to detect hardcoded passwords, API keys and tokens.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[35.966718, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Scan for committed secrets with Gitleaks? (29/36)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mAutomations\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Dependency updates provider \u001b[2m(30/36)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Renovate GitHub app\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mRenovate self-hosted in CI\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the dependency updates provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[35.966981, "o", "\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Dependency updates provider (30/36)\r\r\n\u001b[90m│\u001b[0m \u001b[2mRenovate GitHub app\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[36.972045, "o", "\u001b[36m◇\u001b[0m Auto-merge dependency updates \u001b[2m(31/37)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mPull requests in the selected groups are merged as soon as they meet the\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mbranch protection rules. Pull requests in other groups need a manual merge.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mRequires \"Allow auto-merge\" in the repository settings and at least one\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mrequired status check on the base branch.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m PHP packages, except Drupal core (minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Drupal core (minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m JavaScript packages (minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Container images (major, minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m CI tools (major, minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m GitHub Actions (major, minor and patch)\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more groups.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[37.976479, "o", "\u001b[16A\r\u001b[J\u001b[36m◆\u001b[0m Auto-merge dependency updates (31/37)\r\r\n\u001b[90m│\u001b[0m \u001b[2mPHP packages, except Drupal core (minor and patch), Drupal core (minor and\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mpatch), JavaScript packages (minor and patch), Container images (major, minor\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mand patch), CI tools (major, minor and patch), GitHub Actions (major, minor\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mand patch)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Code coverage provider \u001b[2m(32/37)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mCodecov\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m None\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the code coverage provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[37.976585, "o", "\u001b[7A\r\u001b[J\u001b[36m◆\u001b[0m Code coverage provider (32/37)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[38.979269, "o", "\u001b[36m◇\u001b[0m Auto-assign the author to their PR? \u001b[2m(33/37)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mHelps to keep the PRs organized.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[39.98135, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Auto-assign the author to their PR? (33/37)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Auto-add a CONFLICT label to a PR when conflicts occur? \u001b[2m(34/37)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mHelps to keep quickly identify PRs that need attention.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[40.981735, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Auto-add a CONFLICT label to a PR when conflicts occur? (34/37)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mDocumentation\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Preserve project documentation? \u001b[2m(35/37)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mHelps to maintain the project documentation within the repository.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[41.982046, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Preserve project documentation? (35/37)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mAI\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Provide AI agent instructions? \u001b[2m(36/37)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mProvides AI coding agents with better context about the project.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[42.98486, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Provide AI agent instructions? (36/37)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Configure AI code review with CodeRabbit? \u001b[2m(37/37)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRequires the CodeRabbit app on the repository.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Configure AI code review with CodeRabbit? (37/37)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[43.9897, "o", "\u001b[?25h\u001b[34m●\u001b[0m \u001b[34mInstallation summary\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m┌───────────────────────────────────────────────────────────────────────────┐\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mGeneral information\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Site name \u001b[90m│\u001b[0m Star Wars \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Site machine name \u001b[90m│\u001b[0m star_wars \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Organization name \u001b[90m"] +[43.98973, "o", "│\u001b[0m"] +[43.989802, "o", " Rebellion \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Organization machine name \u001b[90m│\u001b[0m rebellion \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Public domain \u001b[90m│\u001b[0m star-wars.com \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mDrupal\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Starter \u001b[90m│\u001b[0m load"] +[43.989807, "o", "_demod"] +[43.989891, "o", "b \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Modules \u001b[90m│\u001b[0m coffee, config_split, config_update, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m devel, drupal_helpers, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m environment_indicator, fast_404, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m generated_content, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m navigation_extra_tools, pathauto, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m redirect, reroute_email, robotstxt, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m sdc_devel, seckit, shield, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m stage_file_proxy, "] +[43.989898, "o", "testmode"] +[43.990015, "o", ", xmlsitemap \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Webroot \u001b[90m│\u001b[0m web \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Profile \u001b[90m│\u001b[0m standard \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Module prefix \u001b[90m│\u001b[0m sw \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Custom modules \u001b[90m│\u001b[0m base, search, demo \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Theme machine name \u001b[90m│\u001b[0m star_wars \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Build front-end in container \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Storybook component library \u001b[90m│\u001b[0m No \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├────────────────────────────"] +[43.990022, "o", "───"] +[43.990105, "o", "───┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mCode repository\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Code provider \u001b[90m│\u001b[0m github \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Version scheme \u001b[90m│\u001b[0m calver \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────"] +[43.990111, "o", "┤\u001b["] +[43.990213, "o", "0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mEnvironment\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Timezone \u001b[90m│\u001b[0m UTC \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Services \u001b[90m│\u001b[0m clamav, redis, solr \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Tools \u001b[90m│\u001b[0m behat, dclint, eslint, hadolint, jest, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m phpcs, phpstan, phpunit, rector, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m stylelint, twig_cs_fixer \u001b[90m│\u001b[0m\r\r\n\u001b[9"] +[43.990218, "o", "0m│\u001b[0"] +[43.990326, "o", "m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mHosting\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Hosting provider \u001b[90m│\u001b[0m none \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m "] +[43.990331, "o", " \u001b[90"] +[43.990404, "o", "m│\u001b[0m \u001b[1mDeployment\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Deployment types \u001b[90m│\u001b[0m webhook \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mWorkflow\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────"] +[43.990408, "o", "──"] +[43.99049, "o", "──────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Provision type \u001b[90m│\u001b[0m database \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Database source \u001b[90m│\u001b[0m url \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Migration database \u001b[90m│\u001b[0m No \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mNotifications\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬───────────"] +[43.990493, "o", "───"] +[43.990562, "o", "──────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Channels \u001b[90m│\u001b[0m email \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mContinuous Integration\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m CI provider \u001b[90m│\u001b[0m gha \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Visual regression"] +[43.990565, "o", " testi"] +[43.990653, "o", "ng \u001b[90m│\u001b[0m No \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Secret scanning with Gitleaks \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mAutomations\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Dependency updates provider \u001b[90m│\u001b[0m renovatebot_app \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Auto-merge dependency update"] +[43.990655, "o", "s \u001b"] +[43.99072, "o", "[90m│\u001b[0m php, drupal_core, js, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m container_images, ci_tools, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m github_actions \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Code coverage provider \u001b[90m│\u001b[0m none \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Auto-assign PR author \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Auto-add a CONFLICT label to PRs \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mDocumentation\u001b[0m "] +[43.990728, "o", " "] +[43.990826, "o", " \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Preserve project documentation \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mAI\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬───────────────────────────"] +[43.990829, "o", "─"] +[43.990915, "o", "────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m AI agent instructions \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m AI code review \u001b[90m│\u001b[0m No \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mLocations\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Current directory \u001b[90m│\u001b[0m /home/user/ww"] +[43.990919, "o", "w/drevop"] +[43.991029, "o", "s/vortex2/.artifa \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m cts/tmp/videos-workspace \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Destination directory \u001b[90m│\u001b[0m /home/user/vortex/.artifa \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m cts/tmp/videos-workspace/star_wars \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Vortex repository \u001b[90m│\u001b[0m /home/user/vortex \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Vortex reference \u001b[90m│\u001b[0m HEAD \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m└──────────────────────────────────┴────────────────────────────────────────┘\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[43.994161, "o", " Vortex will be installed into your project's directory \"/home/user/demo/star_wars\"\r\r\n"] +[44.008936, "o", "\u001b[?25l"] +[44.009141, "o", "\u001b[36m◇\u001b[0m Proceed with installing Vortex?\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[4A\r\u001b[J\u001b[36m◆\u001b[0m Proceed with installing Vortex?\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[46.013888, "o", "\u001b[?25h\u001b[34m●\u001b[0m \u001b[34mStarting project installation\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Downloading Vortex\r\r\n\u001b[90m│\u001b[0m \u001b[2mDownloading from \"/home/user/vortex\" repository at ref \"HEAD\"\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Vortex downloaded (develop)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Customizing Vortex for your project\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Vortex was customized for your project\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Preparing destination directory\r\r\n\u001b[90m│\u001b[0m \u001b[2mCreated directory\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m\"/home/user/demo/star_wars\".\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mInitializing a new Git repository in directory\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m\"/home/user/demo/star_wars\".\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Destination directory is ready\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Copying files to the destination directory\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Files copied to destination directory\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Preparin"] +[46.013897, "o", "g demo content\r\r\n\r\r\n"] +[46.210479, "o", "\u001b[90m│\u001b[0m \u001b[2mCreated data directory\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m\"/home/user/demo/star_wars/.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mdata\".\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo database dump file was found in\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m\"/home/user/demo/star_wars/.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mdata\" directory.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mFetched demo database from\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mhttps://github.com/drevops/vortex/releases/download/1.40.0/db.demo.sql.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Demo content prepared\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[46.211123, "o", "\u001b[90m│\u001b[0m \u001b[90m┌────────────────────────────────────────────────┐\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mFinished installing Vortex\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m──────────────────────────\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Add and commit all files: \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m git add -A \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m git commit -m \"Initial commit.\" \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Files: 401 added \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Status and diff of every file are recorded in: \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m .logs/vortex-install-2026-11-11-010448"] +[46.211131, "o", ".md \u001b["] +[46.211254, "o", "90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m└────────────────────────────────────────────────┘\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[46.226108, "o", "\u001b[?25l"] +[46.226294, "o", "\u001b[36m◇\u001b[0m Run the site build now?\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mTakes ~5-10 min; output will be streamed. You can skip and run later with:\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mahoy build\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[48.229317, "o", "\u001b[7A\r\u001b[J\u001b[36m◆\u001b[0m Run the site build now?\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[?25h\u001b[90m│\u001b[0m \u001b[90m┌───────────────────────────────────────────────────────────────────────────┐\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mReady to build\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m──────────────\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Build the site: \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m ahoy build \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Setup GitHub Action"] +[48.229326, "o", "s: "] +[48.229416, "o", " \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m https://www.vortextemplate.com/docs/continuous-integration/github-actio \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m ns#onboarding \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m└───────────────────────────────────────────────────────────────────────────┘\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[48.238141, "x", "0"] diff --git a/.vortex/docs/static/img/installer.png b/.vortex/docs/static/img/installer.png index 4655073e4cff66b45a445096f215a1d3e3273b70..5941af63c515b3c471913a0dfb4aa58f8e11bce9 100644 GIT binary patch literal 101771 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 literal 99414 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 w0j`#?WuLHN>Nx7D0<)V4jyf#f|0RH4PxXS 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 Yy8K$L$A`N5XB}L+V12&I%p>8y0R|K^jsO4v diff --git a/.vortex/docs/static/img/installer.svg b/.vortex/docs/static/img/installer.svg index d3b74eada5..4440da59ec 100644 --- a/.vortex/docs/static/img/installer.svg +++ b/.vortex/docs/static/img/installer.svg @@ -1 +1 @@ -──────────────────────────────────────────────────────────────────────────────██╗██╗██████╗██████╗████████╗███████╗██╗██╗██║██║██╔═══██╗██╔══██╗╚══██╔══╝██╔════╝╚██╗██╔╝██║██║██║██║██████╔╝██║█████╗╚███╔╝╚██╗██╔╝██║██║██╔══██╗██║██╔══╝██╔██╗╚████╔╝╚██████╔╝██║██║██║███████╗██╔╝██╗╚═══╝╚═════╝╚═╝╚═╝╚═╝╚══════╝╚═╝╚═╝DrupalprojecttemplatebyDrevOpsInstallerversion:development┌───────────────────────────────────────────────────────────────────────┐│WelcometotheVortexinteractiveinstaller││───────────────────────────────────────────││││Thistoolwillguideyouthroughinstallingthelatestdevelopment││versionofVortexintoyourproject.│││Youwillbeaskedafewquestionstotailortheconfigurationtoyour││site.││Nochangeswillbemadeuntilyouconfirmeverythingattheend.││PressCtrl+Catanytimetoexittheinstaller.││PressCtrl+Uatanytimetogobacktothepreviousstep.│└────────────────────────────────────────────└───────────────────────────────────────────────└───────────────────────────────────────────────────────────────────────┘✦ValidatingrepositoryandreferenceCheckingrepository"/home/user/vortex"andreference"HEAD"✓RepositoryandreferencevalidatedsuccessfullyPressanykeytocontinue... General information ┌Sitename(1/41)────────────────────────────────────────────┐└──────────────────────────────────────────────────────────────┘Wewillusethisnameintheprojectanddocumentation.│E.g.MySite│└──────────────────────────────────│St ┌Sitename(1/41)────────────────────────────────────────────┐│StarWars││star_wars │┌Sitemachinename(2/41)────────────────────────────────────┐│star_wars│┌Organizationname(3/41)────────────────────────────────────┐│E.g.MyOrg││Re │┌Organizationname(3/41)────────────────────────────────────┐│Rebellion│┌Organizationmachinename(4/41)────────────────────────────┐│rebellion │Wewillusethisnameinthecode.┌Organizationmachinename(4/41)────────────────────────────┐│rebellion│┌Publicdomain(5/41)────────────────────────────────────────┐│star-wars.com │┌Publicdomain(5/41)────────────────────────────────────────┐│star-wars.com│ Drupal ┌Howwouldyoulikeyoursitetobecreatedonthefirstrun?(6/41)┐│││Choosehowyoursitewillbecreatedthefirsttimeafterthis││installerfinishes:││○Drupal,installedfromprofile││Createsanewsitebypopulatingafreshdatabase││fromoneofthestandardDrupalinstallationprofiles.││○DrupalCMS,installedfromprofile││fromtheDrupalCMSrecipe.││○Drupal,loadedfromthedemodatabase││Createsasitebyloadinganexistingdemodatabase││providedwiththeinstaller.│├─────────────────────────────────────────────────────────────────────┤│○Drupal,installedfromprofile││○DrupalCMS,installedfromprofile││›●Drupal,loadedfromthedemodatabase│└─────────────────────────────────────────────────────────────────────┘┌Howwouldyoulikeyoursitetobecreatedonthefirstrun?(6/41)┐│○DrupalCMS,installedfromprofile│Drupal,loadedfromthedemodatabase│Drupal,loadedfromthedemodatabase│┌Profile(7/41)──────────────────────────────────────────────┐│Standard│┌Modules(8/41)──────────────────────────────────────────────┐│›◼Coffee┃││◼Configsplit│││◼Configupdate│││◼Devel│││◼Drupalhelpers│││◼Environmentindicator│││◼Fast404│││◼Generatedcontent│││◼Navigationextratools│││◼Pathauto││┌Modules(8/41)──────────────────────────────────────────────┐│Coffee││Configsplit││Configupdate││Devel││Drupalhelpers││Environmentindicator││Fast404││Generatedcontent││Navigationextratools││Pathauto││Redirect││Rerouteemail││Robots.txt││SDCDevel││Seckit││Shield││Stagefileproxy││Testmode││XMLSitemap│┌Custommodulesprefix(9/41)────────────────────────────────┐│sw│┌Custommodules(10/41)─────────────────────────────────────────────┐│Selectwhichcustommodulestoincludeinyourproject:││○Base││Startermodulewithcommonsiteutilities(mailhandling,││deployhooks)andtestscaffoldingforUnit,Kernel,││Functional,andFunctionalJavascripttests.││○Search││CustomSolrsearchintegrationmodule.RequirestheSolr││servicetobeselected.││○Demo││DemonstrateshowVortextoolingworks:includesacounter││blockwithCSS/JS,PHPUnitexampletestsacrossalltest││types,andaBehatfeature.Safetoremoveonrealprojects.│├─────────────────────────────────────────┌Custommodules(10/41)────────────────────────────────────────────┐│││Selectwhichcustommodulestoincludeinyourproject:││○Base││Startermodulewithcommonsiteutilities(mailhandling,││deployhooks)andtestscaffoldingforUnit,Kernel,││Functional,andFunctionalJavascripttests.││○Search││CustomSolrsearchintegrationmodule.RequirestheSolr││servicetobeselected.││○Demo││DemonstrateshowVortextoolingworks:includesacounter││blockwithCSS/JS,PHPUnitexampletestsacrossalltest││types,andaBehatfeature.Safetoremoveonrealprojects.│├────────────────────────────────────────────────────────────────────┤│Base-startermodulewithutilitiesandtestscaffolding││Search-customSolrsearchintegration││Demo-counterblockandexampleteststodemonstratetooling│└────────────────────────────────────────────────────────────────────┘┌Theme(11/41)───────────────────────────────────────────────┐│Custom(nextprompt)│┌Customthememachinename(12/41)───────────────────────────┐┌Customthememachinename(12/41)───────────────────────────┐┌Buildfront-endassetsinthecontainer?(13/41)────────────┐│●Yes/○No│Disabletobuildthemeassetsonthehostoraspartofdeployment.┌Buildfront-endassetsinthecontainer?(13/41)────────────┐│Yes│┌Storybookcomponentlibrary?(14/41)────────────────────────┐│││Componentlibraryforthecustomtheme,renderedbyDrupal││itself.││StoriesareauthoredinTwignexttoeachcomponent,sothe││libraryshowsthesamemarkupthesiterenders.││Adevelopmentserverrunsondemandwith`ahoystorybook`.A││staticbuildisproducedduringprovisioningandservedat││`/storybook`inlocal,CIanddevelopmentenvironments.│├──────────────────────────────────────────────────────────────┤│○Yes/●No│└───────────────────────────────┌Storybookcomponentlibrary?(14/41)────────────────────────┐│No│ Code repository ┌Repositoryprovider(15/41)─────────────────────────────────┐│VortexoffersfullautomationwithGitHub,whilesupportfor││otherprovidersislimited.││›●GitHub││○Other│○Other│┌Repositoryprovider(15/41)─────────────────────────────────┐│GitHub│┌Releaseversioningscheme(16/41)───────────────────────────┐│Chooseyourversioningscheme:││○CalendarVersioning(CalVer)││year.month.patch(E.g.,24.1.0)││https://calver.org││○SemanticVersioning(SemVer)││major.minor.patch(E.g.,1.0.0)│major.minor.patch(E.g.,1.0.0)││https://semver.org││○Other││Customversioningschemeofyourchoice.││›●CalendarVersioning(CalVer)││○SemanticVersioning(SemVer)│┌Releaseversioningscheme(16/41)───────────────────────────┐│CalendarVersioning(CalVer)│ Environment ┌Timezone(17/41)────────────────────────────────────────────┐│UTC│┌Services(18/41)────────────────────────────────────────────┐│ClamAV││Solr││Redis│┌Developmenttools(19/41)───────────────────────────────────┐│›◼PHPCodeSniffer┃││◼PHPStan│││◼Rector│││◼ESLint│││◼Stylelint│││◼Jest│││◼PHPUnit┌Developmenttools(19/41)───────────────────────────────────┐│PHPCodeSniffer││PHPStan││Rector││ESLint││Stylelint││Jest││PHPUnit││Behat││TwigCSFixer││DCLint││Hadolint│ Hosting │›●None│┌Hostingprovider(20/41)────────────────────────────────────┐│None│┌Customwebrootdirectory(21/41)───────────────────────────┐│web │┌Customwebrootdirectory(21/41)───────────────────────────┐│web│ Deployment ┌Deploymenttypes(22/41)────────────────────────────────────┐│›◻Codeartifact││◻Lagoonwebhook││◼Customwebhook┌Deploymenttypes(22/41)────────────────────────────────────┐│Customwebhook│ Workflow ┌Provisiontype(23/41)──────────────────────────────────────┐│Provisioningsetsupthesiteinanenvironmentusingan││alreadyassembledcodebase.││○Importfromdatabasedump││Provisionsthesitebyimportingadatabasedump││typicallycopiedfromproductionintolower││environments.││○Installfromprofile││ProvisionsthesitebyinstallingafreshDrupal││sitefromaprofileeverytimeanenvironmentis││created.│┌Provisiontype(23/41)──────────────────────────────────────┐│created.│Importfromdatabasedump│┌Databasesource(24/41)─────────────────────────────────────┐│›●URLdownload││○FTPdownload│○None│┌Databasesource(24/41)─────────────────────────────────────┐│URLdownload│┌Useaseconddatabaseformigrations?(25/41)───────────────┐ Notifications ┌Notificationchannels(26/41)───────────────────────────────┐│›◼Email││◻GitHub││◻JIRA│┌Notificationchannels(26/41)───────────────────────────────┐│Email│ Continuous Integration ┌ContinuousIntegrationprovider(27/41)─────────────────────┐│›●GitHubActions││○CircleCI││○None┌ContinuousIntegrationprovider(27/41)─────────────────────┐│GitHubActions│┌VisualregressiontestingwithDiffy?(28/41)───────────────┐│Diffy-poweredvisualregressionworkflowtocomparedeployed││environments.││Automaticallytriggerscomparisonsfordependency-update││pullrequestsmatchingtheconfiguredbranchpattern││(`deps/*`bydefault).││Runscomparisonsforpullrequeststaggedwiththe`VR`││labelandpostsastickycomment.││AlsosupportsmanualrunsagainstanyURL.│┌VisualregressiontestingwithDiffy?(28/41)───────────────┐┌ScanforcommittedsecretswithGitleaks?(29/41)───────────┐ Automations ┌Dependencyupdatesprovider(30/41)─────────────────────────┐│RenovateGitHubapp│┌Auto-mergedependencyupdates(31/41)───────────────────────┐│Pullrequestsintheselectedgroupsaremergedassoonas││theymeetthebranchprotectionrules.Pullrequestsin││othergroupsneedamanualmerge.││Requires"Allowauto-merge"intherepositorysettingsand││atleastonerequiredstatuscheckonthebasebranch.│┌Auto-mergedependencyupdates(31/41)───────────────────────┐│PHPpackages,exceptDrupalcore(minorandpatch)││Drupalcore(minorandpatch)││JavaScriptpackages(minorandpatch)││Containerimages(major,minorandpatch)││CItools(major,minorandpatch)││GitHubActions(major,minorandpatch)│┌Codecoverageprovider(32/41)──────────────────────────────┐┌Auto-assigntheauthortotheirPR?(33/41)─────────────────┐└─────────────────────────────────────────────────────────────────┘┌Auto-addaCONFLICTlabeltoaPRwhenconflictsoccur?(34/41)┐│Yes│ Documentation ┌Preserveprojectdocumentation?(35/41)─────────────────────┐┌Preserveprojectdocumentation?(35/41)─────────────────────┐ AI ┌ProvideAIagentinstructions?(36/41)──────────────────────┐┌ProvideAIagentinstructions?(36/41)──────────────────────┐ Installation summary ┌────────────────────────────────────┬────────────────────────────────────┐│Generalinformation│││Sitename│StarWars││Sitemachinename│star_wars││Organizationname│Rebellion││Organizationmachinename│rebellion││Publicdomain│star-wars.com││Drupal│││Starter│load_demodb││Modules│coffee,config_split,│││config_update,devel,│││drupal_helpers,│││environment_indicator,fast_404,│││generated_content,│││navigation_extra_tools,pathauto,│││redirect,reroute_email,│││robotstxt,sdc_devel,seckit,│││shield,stage_file_proxy,│││testmode,xmlsitemap││Webroot│web││Profile│standard││Moduleprefix│sw││Custommodules│base,search,demo││Thememachinename│star_wars││Buildfront-endincontainer│Yes││Storybookcomponentlibrary│No││Coderepository│││Codeprovider│github││Versionscheme│calver││Environment│││Timezone│UTC││Services│clamav,redis,solr││Tools│behat,dclint,eslint,hadolint,│││jest,phpcs,phpstan,phpunit,│││rector,stylelint,twig_cs_fixer││Hosting│││Hostingprovider│none││Deployment│││Deploymenttypes│webhook│Deploymenttypes│webhook││Workflow│││Provisiontype│database││Databasesource│url││Migrationdatabase│No││Notifications│││Channels│email││ContinuousIntegration│││CIprovider│gha││Visualregressiontesting│No││SecretscanningwithGitleaks│Yes││Automations│││Dependencyupdatesprovider│renovatebot_app││Auto-mergedependencyupdates│php,drupal_core,js,│││container_images,ci_tools,│││github_actions││Codecoverageprovider│none││Auto-assignPRauthor│Yes││Auto-addaCONFLICTlabeltoPRs│Yes││Documentation│││Preserveprojectdocumentation│Yes││AI│││AIagentinstructions│Yes│AIagentinstructions│Yes││Locations│││Currentdirectory│/home/user/vortex/.ar│││tifacts/tmp/videos-workspace││Destinationdirectory│/home/user/vortex/.ar│││tifacts/tmp/videos-workspace/star_│││wars││Vortexrepository│/home/user/vortex││Vortexreference│HEAD│└────────────────────────────────────┴────────────────────────────────────┘Vortexwillbeinstalledintoyourproject'sdirectory"/home/user/demo/star_wars"┌ProceedwithinstallingVortex?─────────────────────────────┐ Starting project installation ✦DownloadingVortexDownloadingfrom"/home/user/vortex"repositoryatref✓Vortexdownloaded(develop)✦CustomizingVortexforyourproject✓Vortexwascustomizedforyourproject✦PreparingdestinationdirectoryCreateddirectory"/home/user/demo/star_wars".InitializinganewGitrepositoryindirectory"/home/user/demo/star_wars".✓Destinationdirectoryisready✦Copyingfilestothedestinationdirectory✓Filescopiedtodestinationdirectory⠂Preparingdemocontent⠒Preparingdemocontent✦PreparingdemocontentCreateddatadirectory"/home/user/demo/star_wars/.data".Nodatabasedumpfilewasfoundin"/home/user/demo/star_wars/.data"directory.Fetcheddemodatabasefromhttps://github.com/drevops/vortex/releases/download/1.40.0/db.demo.sql.✓Democontentprepared┌───────────────────────────────────┐│FinishedinstallingVortex││──────────────────────────││││Addandcommitallfiles:││gitadd-A││gitcommit-m"Initialcommit."│└───────────────────────────────────┘┌Runthesitebuildnow?─────────────────────────────────────┐┌────────────────────────────────────────────────────────────────────────────┐│Readytobuild││──────────────││││Buildthesite:││ahoybuild│╚████╔╝╚██████╔╝██║██║╚████╔╝╚██████╔╝██║██║██⠂Validatingrepositoryandreference│starwars │└────────────────────────────────────│St ││StarWars │┌Sitemachinename(2/41)────────────────────────────────────┐Wewillusethisnamefortheprojectdirectoryandinthecode.│StarWarsOrg │└─────└─────────│Rebellion │WewillusethisnameinthecoDomainnamewithoutproDomainnamewithoutprotocolandDomainnamewithoutprotocolandtrailingslash.│Createsasitebyloadin│Createsasitebyloadinganexist└────────────────────────────────────────────────────────────└──────────────────────────────────────────────────────────────Use⬆and⬇.Appliesonlyonthefirstrunoftheinstaller.┌Profile(7/41)──────────────────────────────────────────────┐│›●Standard││○Minimal││○DemoUmami││○Custom(nextprompt)│Use⬆and⬇toselectwhichDrupalprofiletouse.│◼Configupda│◼Configupdate└───────────────────────└──────────────────────────│XMLSi│XMLSitemap│s│sw├──────────────────────────────────────│›◼Base-startermodulewithutilitiesandtestscaffolding││◼Search-customSolrsearchintegration││◼Demo-counterblockandexampleteststodemonstratetooling│Use⬆,⬇andSpacebartoselectoneormoremodules.├───────────────────────────────────────────├──────────────────────────────────────────────┌Theme(11/41)───────────────────────────────────────────────┐│○Olivero││○Claro││○Stark││›●Custom(nextprompt)│Use⬆and⬇toselectwhichDrupalthemetouse.WewilluseWewillusethisnamWewillusethisnameasacustomthemename│Storiesareauthor│StoriesareauthoredinTwig│Adevelopmentserv│AdevelopmentserverrunsondUse⬆and⬇toselectyourcoderepositoryprovider.└────────────────────────────────────────────────────└───────────────────────────────────────────────────────Use⬆and⬇toselectyourversionscheme.┌Timezone(17/41)┌Timezone(17/41)────│◼PHPUnit│││◼Behat│││◼TwigCSFixer│││◼DCLint││└─────────────────────────────────────────────────11selected┘Use⬆,⬇andSpacebartoselectoneormoretools.┌Hostingprovider(20/41)────────────────────────────────────┐│○AcquiaCloud││○Lagoon│Use⬆,⬇andSpacebartoselectyourhostingprovider.CustomdirectorywherethewebseCustomdirectorywherethewebserverservCustomdirectorywherethewebserverservesthesite.│◼Customwebhook│Use⬆,⬇andSpacebartoselectoneormoredeploymenttypes.├─├────│Provisioningsetsupthesiteinane│Provisioningsetsupthesiteinanenvironment│○FTPdownload││○Acquiabackup││○Lagoonenvironment││○Containerregistry││○S3bucket│Use⬆and⬇toselectthedatabasefetchsource.┌Useaseconddatabaseformigrations?(25/41)───────────────┐AddsaseconddatabaseserviceforDrupalmigrations.│◻NewRelic││◻Slack││◻Webhook│Use⬆,⬇andSpacebartoselectoneormorenotificationchannels.Use⬆and⬇toselecttheCIprovider.│Automaticallytrig│Automaticallytriggerscompar│○Yes/│○Yes/●└────────────────────────────└─────────────────────────────────────────│Ren│RenovateGitHub├─────────────────────────────────────│›◼PHPpackages,exceptDrupalcore(minorandpatch)││◼Drupalcore(minorandpatch)││◼JavaScriptpackages(minorandpatch)││◼Containerimages(major,minorandpatch)││◼CItools(major,minorandpatch)││◼GitHubActions(major,minorandpatch)│Use⬆,⬇andSpacebartoselectoneormoregroups.├────────────────────────────────────├───────────────────────────────────────┌Codecoverageprovider(32/41)──────────────────────────────┐│○Codecov│Use⬆and⬇toselectthecodecoverageprovider.┌Auto-assigntheauthortotheirPR?(33/41)─────────────────┐HelpstokeepthePRsorganized.┌Auto-addaCONFLICTlabeltoaPRwhenconflictsoccur?(34/41)┐│●Yes/○No│HelpstokeepquicklyidentifyPRsthatneedattention.HelpstomaintaintheprojectdocumentationHelpstomaintaintheprojectdocumentationwithintheHelpstomaintaintheprojectdocumentationwithintherepository.ProvidesAIcodingagentsProvidesAIcodingagentswithbetterProvidesAIcodingagentswithbettercontextabouttheproject.│Modules│cof│Modules│coffee,co││robotstxt,sdc_deve││robotstxt,sdc_devel,seck│Buildf│Buildfront-end│Services││Services│clamav┌ProceedwithinstallingVortex?─────────────────────────────┐⠂CustomizingVortexforyourproject⠒Custo✓Filescopied⠐Preparingdemocontent⠰Preparingdemocontent⠠Preparingdemocontent⠤Preparingdemocontent⠄Preparingdemocontent⠆Preparingdemocontent┌Runthesitebuildnow?─────────────────────────────────────┐Takes~5-10min;outputwillbestreamed.Youcanskipandrunlaterwith…│SetupGitHubActions:││https://www.vortextemplate.com/docs/continuous-integration/github-actions#││onboarding│└────────────────────────────────────────────────────────────────────────────┘ \ No newline at end of file +──────────────────────────────────────────────────────────────────────────────██╗██╗██████╗██████╗████████╗███████╗██╗██╗██║██║██╔═══██╗██╔══██╗╚══██╔══╝██╔════╝╚██╗██╔╝██║██║██║██║██████╔╝██║█████╗╚███╔╝╚██╗██╔╝██║██║██╔══██╗██║██╔══╝██╔██╗╚████╔╝╚██████╔╝██║██║██║███████╗██╔╝██╗╚═══╝╚═════╝╚═╝╚═╝╚═╝╚══════╝╚═╝╚═╝DrupalprojecttemplatebyDrevOpsInstallerversion:development│┌───────────────────────────────────────────────────────────────────────────┐││WelcometotheVortexinteractiveinstaller│││───────────────────────────────────────────│││Thistoolwillguideyouthroughinstallingthelatestdevelopment│││versionofVortexintoyourproject.││││││Youwillbeaskedafewquestionstotailortheconfigurationtoyour│││site.│││Nochangeswillbemadeuntilyouconfirmeverythingattheend.│││PressCtrl+Catanytimetoexittheinstaller.│││PressCtrl+Uatanytimetogobacktothepreviousstep.││└───────────────────────────────────────────────────────────────────────────┘│◇Validatingrepositoryandreference│Checkingrepository"/home/user/vortex"andreference"HEAD"│✓Repositoryandreferencevalidatedsuccessfully┌Generalinformation◇Sitename(1/32)│Wewillusethisnameintheprojectanddocumentation.│star█│E.g.MySite█│StarWar█◆Sitename(1/32)│StarWars◆Sitemachinename(2/32)│star_wars◇Organizationname(3/32)│E.g.MyOrg█│E.g.MyO│Rebe█│Rebellion█◆Organizationname(3/32)│Rebellion◆Organizationmachinename(4/32)│rebellion◆Publicdomain(5/32)│star-wars.com├Drupal◇Howwouldyoulikeyoursitetobecreatedonthefirstrun?(6/32)│Choosehowyoursitewillbecreatedthefirsttimeafterthisinstaller│finishes:│○Drupal,installedfromprofile│Createsanewsitebypopulatingafreshdatabase│fromoneofthestandardDrupalinstallationprofiles.│○DrupalCMS,installedfromprofile│fromtheDrupalCMSrecipe.│○Drupal,loadedfromthedemodatabase│Createsasitebyloadinganexistingdemodatabase│providedwiththeinstaller.│○Drupal,installedfromprofile│○DrupalCMS,installedfromprofile│❯●Drupal,loadedfromthedemodatabase◆Howwouldyoulikeyoursitetobecreatedonthefirstrun?(6/32)│Drupal,loadedfromthedemodatabase◆Profile(7/32)│Standard◇Modules(8/32)│❯◼Coffee│◼Configsplit│◼Configupdate│◼Devel│◼Drupalhelpers│◼Environmentindicator◆Modules(8/32)│Coffee,Configsplit,Configupdate,Devel,Drupalhelpers,Environment│indicator,Fast404,Generatedcontent,Navigationextratools,Pathauto,│Redirect,Rerouteemail,Robots.txt,SDCDevel,Seckit,Shield,Stagefile│proxy,Testmode,XMLSitemap◆Custommodulesprefix(9/32)│sw◇Custommodules(10/32)│Selectwhichcustommodulestoincludeinyourproject:│○Base│Startermodulewithcommonsiteutilities(mailhandling,│deployhooks)andtestscaffoldingforUnit,Kernel,│Functional,andFunctionalJavascripttests.│○Search│CustomSolrsearchintegrationmodule.RequirestheSolr│servicetobeselected.│○Demo│DemonstrateshowVortextoolingworks:includesacounter│blockwithCSS/JS,PHPUnitexampletestsacrossalltest│types,andaBehatfeature.Safetoremoveonrealprojects.│❯◼Base-startermodulewithutilitiesandtestscaffolding│◼Search-customSolrsearchintegration│◼Demo-counterblockandexampleteststodemonstratetooling◆Custommodules(10/32)│Base-startermodulewithutilitiesandtestscaffolding,Search-custom│Solrsearchintegration,Demo-counterblockandexampleteststo│demonstratetooling◆Theme(11/32)│Custom(nextprompt)◆Customthememachinename(12/35)◆Buildfront-endassetsinthecontainer?(13/35)│Yes◇Storybookcomponentlibrary?(14/35)│Componentlibraryforthecustomtheme,renderedbyDrupalitself.│StoriesareauthoredinTwignexttoeachcomponent,sothelibraryshowsthe│samemarkupthesiterenders.│Adevelopmentserverrunsondemandwith`ahoystorybook`.Astaticbuildis│producedduringprovisioningandservedat`/storybook`inlocal,CIand│developmentenvironments.│○Yes/●No◆Storybookcomponentlibrary?(14/35)│No├Coderepository◆Repositoryprovider(15/35)│GitHub◇Releaseversioningscheme(16/35)│Chooseyourversioningscheme:│○CalendarVersioning(CalVer)│year.month.patch(E.g.,24.1.0)│https://calver.org│○Other◆Releaseversioningscheme(16/35)│CalendarVersioning(CalVer)├Environment◆Timezone(17/35)│UTC◆Services(18/35)│ClamAV,Redis,Solr◆Developmenttools(19/35)│Behat,DCLint,ESLint,Hadolint,Jest,PHPCodeSniffer,PHPStan,PHPUnit,│Rector,Stylelint,TwigCSFixer├Hosting│❯●None◆Hostingprovider(20/35)│None◆Customwebrootdirectory(21/35)│web├Deployment◆Deploymenttypes(22/35)│Customwebhook├Workflow◇Provisiontype(23/35)│Provisioningsetsupthesiteinanenvironmentusinganalreadyassembled│codebase.│○Importfromdatabasedump│Provisionsthesitebyimportingadatabasedump│typicallycopiedfromproductionintolower│environments.│○Installfromprofile│ProvisionsthesitebyinstallingafreshDrupal│sitefromaprofileeverytimeanenvironmentis│created.│❯●Importfromdatabasedump◆Provisiontype(23/35)│Importfromdatabasedump│○None◆Databasesource(24/36)│URLdownload◆Useaseconddatabaseformigrations?(25/36)├Notifications◆Notificationchannels(26/36)│Email├ContinuousIntegration◆ContinuousIntegrationprovider(27/36)│GitHubActions◆VisualregressiontestingwithDiffy?(28/36)│●Yes/○No◆ScanforcommittedsecretswithGitleaks?(29/36)├Automations◆Dependencyupdatesprovider(30/36)│RenovateGitHubapp◆Auto-mergedependencyupdates(31/37)│PHPpackages,exceptDrupalcore(minorandpatch),Drupalcore(minorand│patch),JavaScriptpackages(minorandpatch),Containerimages(major,minor│andpatch),CItools(major,minorandpatch),GitHubActions(major,minor│andpatch)◆Codecoverageprovider(32/37)◆Auto-assigntheauthortotheirPR?(33/37)◆Auto-addaCONFLICTlabeltoaPRwhenconflictsoccur?(34/37)├Documentation◆Preserveprojectdocumentation?(35/37)├AI◆ProvideAIagentinstructions?(36/37)◆ConfigureAIcodereviewwithCodeRabbit?(37/37)●Installationsummary││Generalinformation││├──────────────────────────────────┬────────────────────────────────────────┤││Sitename│StarWars│││Sitemachinename│star_wars│││Organizationname│Rebellion│││Organizationmachinename│rebellion│││Publicdomain│star-wars.com││├──────────────────────────────────┴────────────────────────────────────────┤││Drupal│││Starter│load_demodb│││Modules│coffee,config_split,config_update,││││devel,drupal_helpers,││││environment_indicator,fast_404,││││generated_content,││││navigation_extra_tools,pathauto,││││redirect,reroute_email,robotstxt,││││sdc_devel,seckit,shield,││││stage_file_proxy,testmode,xmlsitemap│││Webroot│web│││Profile│standard│││Moduleprefix│sw│││Custommodules│base,search,demo│││Thememachinename│star_wars│││Buildfront-endincontainer│Yes│││Storybookcomponentlibrary│No│││Coderepository│││Codeprovider│github│││Versionscheme│calver│││Environment│││Timezone│UTC│││Services│clamav,redis,solr│││Tools│behat,dclint,eslint,hadolint,jest,││││phpcs,phpstan,phpunit,rector,││││stylelint,twig_cs_fixer│││Hosting│││Hostingprovider│none│││Deployment│││Deploymenttypes│webhook│││Workflow│││Provisiontype│database│││Databasesource│url│││Migrationdatabase│No│││Notifications│││Channels│email│││ContinuousIntegration│││CIprovider│gha│││Visualregressiontesting│No│││SecretscanningwithGitleaks│Yes│││Automations│││Dependencyupdatesprovider│renovatebot_app│││Auto-mergedependencyupdates│php,drupal_core,js,││││container_images,ci_tools,││││github_actions│││Codecoverageprovider│none│││Auto-assignPRauthor│Yes│││Auto-addaCONFLICTlabeltoPRs│Yes│││Documentation││Documentation│││Preserveprojectdocumentation│Yes│││AI│││AIagentinstructions│Yes│││AIcodereview│No│││Locations│││Currentdirectory│/home/user/www/drevops/vortex2/.artifa││││cts/tmp/videos-workspace│││Destinationdirectory│/home/user/vortex/.artifa││││cts/tmp/videos-workspace/star_wars│││Vortexrepository│/home/user/vortex│││Vortexreference│HEAD││└──────────────────────────────────┴────────────────────────────────────────┘Vortexwillbeinstalledintoyourproject'sdirectory"/home/user/demo/star_wars"◆ProceedwithinstallingVortex?●Startingprojectinstallation◇DownloadingVortex│Downloadingfrom"/home/user/vortex"repositoryatref"HEAD"│✓Vortexdownloaded(develop)◇CustomizingVortexforyourproject│✓Vortexwascustomizedforyourproject◇Preparingdestinationdirectory│Createddirectory│"/home/user/demo/star_wars".│InitializinganewGitrepositoryindirectory│✓Destinationdirectoryisready◇Copyingfilestothedestinationdirectory│✓Filescopiedtodestinationdirectory◇Preparingdemocontent│Createddatadirectory│"/home/user/demo/star_wars/.│data".│Nodatabasedumpfilewasfoundin│data"directory.│Fetcheddemodatabasefrom│https://github.com/drevops/vortex/releases/download/1.40.0/db.demo.sql.│✓Democontentprepared│┌────────────────────────────────────────────────┐││FinishedinstallingVortex│││──────────────────────────│││Addandcommitallfiles:│││gitadd-A│││gitcommit-m"Initialcommit."││││││Files:401added│││Statusanddiffofeveryfilearerecordedin:│││.logs/vortex-install-2026-11-11-010448.md││└────────────────────────────────────────────────┘◆Runthesitebuildnow?││Readytobuild│││──────────────│││Buildthesite:│││ahoybuild│╚████╔╝╚██████╔╝██║██║██║╚████╔╝╚██████╔╝██║██║██║█││Youwillbeaskedafewquestionstotailorthec││Youwillbeaskedafewquestionstotailortheconfigu◇Pressanykeytocontinue...│starwars█│Wewilluse│Wewillusethisnameintheprojectan│We│Wewillu│S█│St█│Sta█│Star█│Star█│StarW█│StarWa█│StarWars█◇Sitemachinename(2/32)│star_wars█│Wewillusethisnamefortheprojectdirectoryandinthecode.│StarWarsOrg█│StarWar◇O│Wewill│○│◼Environmentin│◼Fast404│◼Generatedcontent│◼Navigationextratools│◼Pathauto│↓9more│Use⬆,⬇andSpacebartoselectoneormoremodules.│deployhooks)andte│Use⬆,⬇andSpace│Use⬆,⬇andSpacebartoselecto◆◆Customthememachinena│AddsStorybookpackagestothethemeandasteptoprovisioning.│○SemanticVersioning(SemVer)│major.minor.patch(E.g.,1.0.0)│https://semver.org│○Other│Customversioningschemeofyourchoice.│❯●CalendarVersioning(CalVer)│○SemanticVersioning(SemVer)│Use⬆and⬇toselectyourversionscheme.◇Services(18/35)│❯◼ClamAV│◼Solr│◼Redis│Use⬆,⬇andSpacebartoselectoneormoreservices.◇Developmenttools(19/35)│❯◼PHPCodeSniffer│◼PHPStan│◼Rector│◼ESLint│◼Stylelint│◼Jest│◼PHPUnit│◼Behat│◼TwigCSFixer│◼DCLint│↓1more│Use⬆,⬇andSpacebartoselectoneormoretools.◇Hostingprovider(20/35)│○AcquiaCloud│○Lagoon│Use⬆,⬇andSpacebartoselectyourhostingprovider.◇Customwebrootdirectory(21/35)│web█│Customdirectorywherethewebserverservesthesite.◇Deploymenttypes(22/35)│❯◻Codeartifact│◻Lagoonwebhook│◼Customwebhook│Use⬆,⬇andSpacebartoselectoneormoredeploymenttypes.│○│○Installfromprofile│Use⬆and⬇toselecttheprovisiontype.◇Databasesource(24/36)│❯●URLdownload│○FTPdownload│○Acquiabackup│○Lagoonenvironment│○Containerregistry│○S3bucket│Use⬆and⬇toselectthedatabasefetchsource.◇Useaseconddatabaseformigrations?(25/36)│AddsaseconddatabaseserviceforDrupalmigrations.◇Notificationchannels(26/36)│❯◼Email│◻GitHub│◻JIRA│◻NewRelic│◻Slack│◻Webhook│Use⬆,⬇andSpacebartoselectoneormorenotificationchannels.◇ContinuousIntegrationprovider(27/36)│❯●GitHubActions│○CircleCI│Use⬆and⬇toselecttheCIprovider.◇VisualregressiontestingwithDiffy?(28/36)│Diffy-poweredvisualregressionworkflowtocomparedeployedenvironments.│Automaticallytriggerscomparisonsfordependency-updatepullrequests│matchingtheconfiguredbranchpattern(`deps/*`bydefault).│Runscomparisonsforpullrequeststaggedwiththe`VR`labelandpostsa│stickycomment.│AlsosupportsmanualrunsagainstanyURL.│RequiresaDiffyaccount.◇ScanforcommittedsecretswithGitleaks?(29/36)│RunsinCItodetecthardcodedpasswords,APIkeysandtokens.◇Dependencyupdatesprovider(30/36)│❯●RenovateGitHubapp│○Renovateself-hostedinCI│Use⬆and⬇toselectthedependencyupdatesprovider.◇Auto-mergedependencyupdates(31/37)│Pullrequestsintheselectedgroupsaremergedassoonastheymeetthe│branchprotectionrules.Pullrequestsinothergroupsneedamanualmerge.│Requires"Allowauto-merge"intherepositorysettingsandatleastone│requiredstatuscheckonthebasebranch.│❯◼PHPpackages,exceptDrupalcore(minorandpatch)│◼Drupalcore(minorandpatch)│◼JavaScriptpackages(minorandpatch)│◼Containerimages(major,minorandpatch)│◼CItools(major,minorandpatch)│◼GitHubActions(major,minorandpatch)│Use⬆,⬇andSpacebartoselectoneormoregroups.◇Codecoverageprovider(32/37)│○Codecov│Use⬆and⬇toselectthecodecoverageprovider.◇Auto-assigntheauthortotheirPR?(33/37)│HelpstokeepthePRsorganized.◇Auto-addaCONFLICTlabeltoaPRwhenconflictsoccur?(34/37)│HelpstokeepquicklyidentifyPRsthatneedattention.◇Preserveprojectdocumentation?(35/37)│Helpstomaintaintheprojectdocumentationwithintherepository.◇ProvideAIagentinstructions?(36/37)│ProvidesAIcodingagentswithbettercontextabouttheproject.││Organizationname││Organizationname│││Starter│load││Starter│load_demod│││stage_file_proxy,│││stage_file_proxy,testmode│├────────────────────────────│├───────────────────────────────│├──────────────────────────────────┴────────────────────────────────────────│├──────────────────────────────────┬────────│├──────────────────────────────────┬──────────│├──────────────────────────────────┬───────────│├──────────────────────────────────┬──────────────││Visualregression││Visualregressiontesti││Auto-mergedependencyupdate││Auto-mergedependencyupdates│├──────────────────────────────────┬───────────────────────────│├──────────────────────────────────┬────────────────────────────││Currentdirectory│/home/user/ww││Currentdirectory│/home/user/www/drevop◇Preparin││.logs/vortex-install-2026-11-11-010448││.logs/vortex-install-2026-11-11-010448.md◇Runthesitebuildnow?│Takes~5-10min;outputwillbestreamed.Youcanskipandrunlaterwith:│ahoybuild││SetupGitHubAction││SetupGitHubActions:││SetupGitHubActions:│││https://www.vortextemplate.com/docs/continuous-integration/github-actio│││ns#onboarding│ \ No newline at end of file From f4ddfb505400132aec5ef4687a4ad48d649af0fa Mon Sep 17 00:00:00 2001 From: Alex Skrypnyk Date: Wed, 11 Nov 2026 12:14:40 +1100 Subject: [PATCH 07/14] Reworded the installer environment variable docs to pass the spellcheck. --- .vortex/docs/content/contributing/maintenance/installer.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vortex/docs/content/contributing/maintenance/installer.mdx b/.vortex/docs/content/contributing/maintenance/installer.mdx index 5cef3304ca..aed67ba717 100644 --- a/.vortex/docs/content/contributing/maintenance/installer.mdx +++ b/.vortex/docs/content/contributing/maintenance/installer.mdx @@ -53,7 +53,7 @@ value: 3. **Handler defaults** - fallback values defined by each handler. An environment variable named `VORTEX_INSTALLER_PROMPT_` followed by the -uppercased prompt ID answers that prompt, so the installer doesn't ask it. +prompt ID in capitals answers that prompt, so the installer doesn't ask it. For example, `VORTEX_INSTALLER_PROMPT_HOSTING_PROVIDER=lagoon` answers the hosting prompt. The variable wins over the 3 preceding sources. A prompt with several choices reads a comma-separated list. A yes or no prompt reads From 8886b52e590a8783ae932c8c48e88f4f7b817057 Mon Sep 17 00:00:00 2001 From: Alex Skrypnyk Date: Wed, 11 Nov 2026 12:42:27 +1100 Subject: [PATCH 08/14] Re-triggered CI to clear a flaky check. From bf431bac839ecc5b551f599ef97b9e188e9a14da Mon Sep 17 00:00:00 2001 From: Alex Skrypnyk Date: Wed, 11 Nov 2026 14:34:22 +1100 Subject: [PATCH 09/14] Updated 'alexskrypnyk/prompty' to the commit that caches the terminal width and removed the 'COLUMNS' test override. --- .vortex/installer/composer.lock | 8 ++++---- .vortex/installer/phpunit.xml | 2 -- .vortex/installer/tests/Unit/Utils/TuiTest.php | 6 +++--- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/.vortex/installer/composer.lock b/.vortex/installer/composer.lock index a9c3ec46f8..a17e3c926c 100644 --- a/.vortex/installer/composer.lock +++ b/.vortex/installer/composer.lock @@ -82,12 +82,12 @@ "source": { "type": "git", "url": "https://github.com/AlexSkrypnyk/prompty.git", - "reference": "47b3478674a7d13be723d8715e67b2e7cd170340" + "reference": "85fce83c74db8cdd6327cf636f6ed361d3c9ae23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/AlexSkrypnyk/prompty/zipball/47b3478674a7d13be723d8715e67b2e7cd170340", - "reference": "47b3478674a7d13be723d8715e67b2e7cd170340", + "url": "https://api.github.com/repos/AlexSkrypnyk/prompty/zipball/85fce83c74db8cdd6327cf636f6ed361d3c9ae23", + "reference": "85fce83c74db8cdd6327cf636f6ed361d3c9ae23", "shasum": "" }, "require": { @@ -166,7 +166,7 @@ "url": "https://www.patreon.com/alexskrypnyk" } ], - "time": "2026-11-10T23:19:50+00:00" + "time": "2026-11-11T03:26:24+00:00" }, { "name": "alexskrypnyk/str2name", diff --git a/.vortex/installer/phpunit.xml b/.vortex/installer/phpunit.xml index e7d0f02dc7..38c5d687cc 100644 --- a/.vortex/installer/phpunit.xml +++ b/.vortex/installer/phpunit.xml @@ -44,7 +44,5 @@ - - diff --git a/.vortex/installer/tests/Unit/Utils/TuiTest.php b/.vortex/installer/tests/Unit/Utils/TuiTest.php index ba487dacdf..c15181d99d 100644 --- a/.vortex/installer/tests/Unit/Utils/TuiTest.php +++ b/.vortex/installer/tests/Unit/Utils/TuiTest.php @@ -4,6 +4,7 @@ namespace DrevOps\VortexInstaller\Tests\Unit\Utils; +use AlexSkrypnyk\Prompty\Prompty; use DrevOps\VortexInstaller\Tests\Unit\UnitTestCase; use DrevOps\VortexInstaller\Utils\Strings; use DrevOps\VortexInstaller\Utils\Tui; @@ -99,11 +100,10 @@ public static function dataProviderColorMethodsMultiline(): \Iterator { } public function testTerminalWidth(): void { - static::envSet('COLUMNS', '60'); Tui::init(new BufferedOutput()); - $this->assertSame(60, Tui::terminalWidth()); - $this->assertSame(50, Tui::terminalWidth(50)); + $this->assertSame(min(100, max(20, Prompty::terminalWidth())), Tui::terminalWidth()); + $this->assertSame(min(10, max(20, Prompty::terminalWidth())), Tui::terminalWidth(10)); } #[DataProvider('dataProviderBox')] From d1afd61dc3de2f511c5318aa65d5c1287da8c01b Mon Sep 17 00:00:00 2001 From: Alex Skrypnyk Date: Wed, 11 Nov 2026 15:17:57 +1100 Subject: [PATCH 10/14] Nested each dependent installer prompt under the prompt whose answer decides whether it is asked. --- .vortex/docs/.utils/update-videos.php | 3 +- .vortex/installer/CLAUDE.md | 4 +- .../installer/src/Prompts/PromptManager.php | 77 +++++++++++++++++-- 3 files changed, 74 insertions(+), 10 deletions(-) diff --git a/.vortex/docs/.utils/update-videos.php b/.vortex/docs/.utils/update-videos.php index 899376a72d..e15caede34 100755 --- a/.vortex/docs/.utils/update-videos.php +++ b/.vortex/docs/.utils/update-videos.php @@ -245,6 +245,7 @@ function build_installer_expect_script(int|float $prompt_delay, string $uri): st # A prompt waiting for input starts with the active symbol, U+25C7, and an # answered one with the completed symbol, so only a waiting prompt matches. +# A top-level prompt is numbered "(5/36)" and a nested one "(5.1)". while {1} { expect { -re {◇[^\r\n]*Proceed with installing Vortex} { @@ -254,7 +255,7 @@ function build_installer_expect_script(int|float $prompt_delay, string $uri): st "Finished installing Vortex" { break } - -re {◇[^\r\n]*\([0-9]+/[0-9]+\)} { + -re {◇[^\r\n]*\([0-9]+(\.[0-9]+)*(/[0-9]+)?\)} { wait_and_enter } timeout { diff --git a/.vortex/installer/CLAUDE.md b/.vortex/installer/CLAUDE.md index e5a1fbb6dc..e1c9974d24 100644 --- a/.vortex/installer/CLAUDE.md +++ b/.vortex/installer/CLAUDE.md @@ -137,7 +137,9 @@ Content removed if feature not selected in order, under its section heading. `runPrompts()` runs them as 1 `Prompty::flow()`, with each handler's `shouldRun()` as the step's condition. Add a new prompt to `steps()`, and the step count follows -automatically. +automatically. A prompt whose `shouldRun()` reads another prompt's answer +also goes in `PromptManager::children()` under that prompt, so it is asked +as a nested step. Processing runs in a different order, so each handler declares its own `processWeight()` - lowest first, broadly the reverse of the prompt order so diff --git a/.vortex/installer/src/Prompts/PromptManager.php b/.vortex/installer/src/Prompts/PromptManager.php index bdef3c85eb..9650d1fa39 100644 --- a/.vortex/installer/src/Prompts/PromptManager.php +++ b/.vortex/installer/src/Prompts/PromptManager.php @@ -161,27 +161,88 @@ public function runPrompts(): bool { * for a step its condition skipped. * * @return array - * A section heading for each group, followed by its steps keyed by handler - * ID. A step runs only when its handler's shouldRun() accepts the answers - * collected so far. + * A section heading for each group, followed by its top-level steps keyed + * by handler ID. A step runs only when its handler's shouldRun() accepts + * the answers collected so far. */ protected function flowSteps(): array { - $flow = []; + $builders = []; + $skipped = []; $earlier = []; + foreach ($this->steps() as $steps) { + foreach ($steps as $id => $step) { + $builders[$id] = $step; + $skipped[$id] = $earlier; + $earlier[$id] = NULL; + } + } + + $children = $this->children(); + $nested = array_merge(...array_values($children)); + + $flow = []; + foreach ($this->steps() as $section => $steps) { $flow[] = Prompty::section($section); - foreach ($steps as $id => $step) { - $skipped = $earlier; - $flow[$id] = Prompty::step(fn(array $r): mixed => $step($r + $skipped), condition: fn(array $r): bool => $this->handler($id)->shouldRun($r + $skipped)); - $earlier[$id] = NULL; + foreach (array_keys($steps) as $id) { + if (!in_array($id, $nested, TRUE)) { + $flow[$id] = $this->flowStep($id, $builders, $skipped, $children); + } } } return $flow; } + /** + * Build a flow step and the steps nested under it. + * + * @param string $id + * The handler ID. + * @param array $builders + * Step builders keyed by handler ID. + * @param array> $skipped + * For each handler ID, the earlier step IDs with NULL values. + * @param array> $children + * Child handler IDs keyed by their parent handler ID. + * + * @return array + * The Prompty step. + */ + protected function flowStep(string $id, array $builders, array $skipped, array $children): array { + $step = $builders[$id]; + $earlier = $skipped[$id]; + + $nested = []; + foreach ($children[$id] ?? [] as $child_id) { + $nested[$child_id] = $this->flowStep($child_id, $builders, $skipped, $children); + } + + return Prompty::step(fn(array $r): mixed => $step($r + $earlier), condition: fn(array $r): bool => $this->handler($id)->shouldRun($r + $earlier), children: $nested); + } + + /** + * Define which prompts are asked under the answer they depend on. + * + * @return array> + * Child handler IDs keyed by the handler ID whose answer decides whether + * they are asked. + */ + protected function children(): array { + return [ + Profile::id() => [ProfileCustom::id()], + Theme::id() => [ThemeCustom::id(), FrontendBuild::id(), Storybook::id()], + HostingProvider::id() => [HostingProjectName::id()], + ProvisionType::id() => [DatabaseFetchSource::id()], + DatabaseFetchSource::id() => [DatabaseImage::id()], + Migration::id() => [MigrationFetchSource::id()], + MigrationFetchSource::id() => [MigrationImage::id()], + DependencyUpdatesProvider::id() => [DependencyUpdatesAutomerge::id()], + ]; + } + /** * Define the prompts in the order they are asked, grouped by section. * From 7c9a61e727811477ceec0c143e4c65d51a123045 Mon Sep 17 00:00:00 2001 From: Alex Skrypnyk Date: Wed, 11 Nov 2026 15:18:01 +1100 Subject: [PATCH 11/14] Re-recorded the installer video with nested prompts. --- .vortex/docs/static/img/installer.json | 392 +++++++++++++------------ .vortex/docs/static/img/installer.svg | 2 +- 2 files changed, 199 insertions(+), 195 deletions(-) diff --git a/.vortex/docs/static/img/installer.json b/.vortex/docs/static/img/installer.json index 4ccd8ca235..0cd14b2068 100644 --- a/.vortex/docs/static/img/installer.json +++ b/.vortex/docs/static/img/installer.json @@ -1,194 +1,198 @@ -{"version":2,"width":80,"height":27,"timestamp":1794359042,"command":"/home/user/demo/installer.exp","title":"Vortex Installer Demo","env":{"SHELL":"/opt/homebrew/opt/bash/bin/bash"}} -[0.525279, "o", "\u001b[36m──────────────────────────────────────────────────────────────────────────────\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m ██╗ ██╗ ██████╗ ██████╗ ████████╗ ███████╗ ██╗ ██╗\u001b[39m\r\r\n\u001b[36m ██║ ██║ ██╔═══██╗ ██╔══██╗ ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝\u001b[39m\r\r\n\u001b[36m ██║ ██║ ██║ ██║ ██████╔╝ ██║ █████╗ ╚███╔╝\u001b[39m\r\r\n\u001b[36m ╚██╗ ██╔╝ ██║ ██║ ██╔══██╗ ██║ ██╔══╝ ██╔██╗\u001b[39m\r\r\n\u001b[36m ╚████╔╝ ╚██████╔╝ ██║ ██║ ██║ "] -[0.525396, "o", " █"] -[0.525495, "o", "██████╗ ██╔╝ ██╗\u001b[39m\r\r\n\u001b[36m ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝ ╚═╝ ╚═╝\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m Drupal project template\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m by DrevOps\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m──────────────────────────────────────────────────────────────────────────────\u001b[39m\r\r\n\u001b[2m Installer version: development\u001b[22m\r\r\n"] -[0.526733, "o", "\u001b[90m│\u001b[0m \u001b[90m┌───────────────────────────────────────────────────────────────────────────┐\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mWelcome to the Vortex interactive installer\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m───────────────────────────────────────────\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m This tool will guide you through installing the latest \u001b[4mdevelopment\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m version of Vortex into your project. \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m You will be asked a few questions to tailor the c"] -[0.526737, "o", "onfigu"] -[0.52684, "o", "ration to your \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m site. \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m No changes will be made until you confirm everything at the end. \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Press \u001b[33mCtrl+C\u001b[39m at any time to exit the installer.\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Press \u001b[33mCtrl+U\u001b[39m at any time to go back to the previous step.\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m└───────────────────────────────────────────────────────────────────────────┘\u001b[0m\r\r\n\u001b[90m│\u001b"] -[0.526876, "o", "[0m\r\r\n"] -[0.527437, "o", "\u001b[36m◇\u001b[0m Validating repository and reference\r\r\n"] -[0.533838, "o", "\u001b[90m│\u001b[0m \u001b[2mChecking repository \"/home/user/vortex\" and reference \"HEAD\"\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Repository and reference validated successfully\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[0.550515, "o", "\u001b[?25l"] -[0.550572, "o", "\u001b[36m◇\u001b[0m Press any key to continue...\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[3.554701, "o", "\u001b[2A\r\u001b[J"] -[3.561934, "o", "\u001b[?25h"] -[3.576967, "o", "\u001b[?25l"] -[3.577043, "o", "\r\r\n\u001b[90m┌\u001b[0m \u001b[1mGeneral information\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[3.577678, "o", "\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[3.732154, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar war\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar wa\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar w\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar \u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use"] -[3.732161, "o", " this name in the project an"] -[4.491371, "o", "d documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37msta\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mst\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37ms\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] -[4.491491, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe "] -[4.491627, "o", "will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.496006, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r"] -[5.496075, "o", "\r\n\u001b[90m│\u001b[0m \u001b[2mWe will u"] -[5.496085, "o", "se this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.496216, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.496369, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.496487, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.496578, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.496677, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.496775, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.49688, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.496984, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.497086, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.497188, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.49728, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.49737, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.497477, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.497567, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.497665, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.497771, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.497885, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.497948, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.498062, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.49815, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.498268, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.4984, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.498502, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.498625, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.498669, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.498756, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.498852, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.49896, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.49905, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.499141, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.499257, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.499357, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.499455, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.499591, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mS\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.499656, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mSt\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.499711, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mSta\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.499882, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.499965, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar \u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.500077, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar W\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.50013, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wa\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.500253, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar War\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.500351, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.500417, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Site name (1/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mStar Wars\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[5.500959, "o", "\u001b[36m◇\u001b[0m Site machine name \u001b[2m(2/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar_wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name for the project directory and in the code.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.505088, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Site machine name (2/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mstar_wars\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.505541, "o", "\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.658605, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars Or\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars O\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars \u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar War\u001b[0"] -[6.658662, "o", "m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0"] -[7.87982, "o", "m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wa\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar W\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar \u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m O"] -[7.88, "o", "rganization name \u001b[2m(3/32)"] -[7.880301, "o", "\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mSta\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mSt\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mS\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[8.883668, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] -[8.883755, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] -[8.883763, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[9.887598, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] -[9.887763, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] -[9.887848, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[10.890701, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] -[10.890709, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] -[10.890799, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[11.89437, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] -[11.894377, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] -[11.894477, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[12.896034, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] -[12.896044, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] -[12.896194, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[13.900065, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] -[13.90007, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] -[13.900175, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[14.904974, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] -[14.904981, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] -[14.905083, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[15.905631, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mR\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRe\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mReb\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebe\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r"] -[15.905646, "o", "\r\n\u001b[90m│\u001b[0m \u001b[2mWe will "] -[15.905759, "o", "use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[16.906282, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebel\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebell\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebelli\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebellio\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebellion\u001b[0m\u001b[36m█\u001b[0m\r\r"] -[16.906288, "o", "\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m"] -[16.906366, "o", " \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[17.910635, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Organization name (3/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mRebellion\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Organization machine name \u001b[2m(4/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mrebellion\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the code.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Organization machine name (4/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mrebellion\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Public domain \u001b[2m(5/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar-wars.com\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mDomain name without protocol and trailing slash.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Public domain (5/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mstar-wars.com\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mDrupal\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m How would you like your site to be created on the first run? \u001b[2m(6/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mChoose how your site will be created the first time after this installer\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mfinishes:\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n"] -[17.910668, "o", "\u001b[90m│\u001b[0m \u001b[2;3m ○"] -[17.910787, "o", " \u001b[1mDrupal, installed from profile\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Creates a new site by \u001b[4mpopulating a fresh database\u001b[0m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m from one of the standard Drupal installation profiles.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mDrupal CMS, installed from profile\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Creates a new site by \u001b[4mpopulating a fresh database\u001b[0m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m from the Drupal CMS recipe.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mDrupal, loaded from the demo database\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Creates a site by \u001b[4mloading an existing demo database\u001b[0m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m provided with the installer.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mDrupal, installed from profile\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mDrupal CMS, installed from profile\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Drupal, loaded from the demo database\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b["] -[17.910791, "o", "90m│\u001b[0m \u001b[2m"] -[18.913738, "o", "Use ⬆ and ⬇. Applies only on the first run of the installer.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[22A\r\u001b[J\u001b[36m◆\u001b[0m How would you like your site to be created on the first run? (6/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mDrupal, loaded from the demo database\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Profile \u001b[2m(7/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Standard\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mMinimal\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mDemo Umami\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mCustom (next prompt)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select which Drupal profile to use.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[9A\r\u001b[J\u001b[36m◆\u001b[0m Profile (7/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mStandard\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Modules \u001b[2m(8/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m Coffee\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Config split\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Config update\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Devel\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Drupal helpers\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Environment in"] -[18.913753, "o", "dicator\r\r\n\u001b[90m│\u001b[0m \u001b["] -[18.913984, "o", "32m◼\u001b[0m Fast 404\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Generated content\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Navigation extra tools\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Pathauto\r\r\n\u001b[90m│\u001b[0m \u001b[2m↓ 9 more\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more modules.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[19.916725, "o", "\u001b[17A\r\u001b[J\u001b[36m◆\u001b[0m Modules (8/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mCoffee, Config split, Config update, Devel, Drupal helpers, Environment\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mindicator, Fast 404, Generated content, Navigation extra tools, Pathauto,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRedirect, Reroute email, Robots.txt, SDC Devel, Seckit, Shield, Stage file\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mproxy, Testmode, XML Sitemap\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Custom modules prefix \u001b[2m(9/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37msw\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in custom modules\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Custom modules prefix (9/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2msw\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Custom modules \u001b[2m(10/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mSelect which custom modules to include in your project:\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mBase\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Starter module with common site utilities (mail handling,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m "] -[19.916733, "o", "deploy hooks) and te"] -[19.916841, "o", "st scaffolding for Unit, Kernel,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Functional, and FunctionalJavascript tests.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mSearch\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Custom Solr search integration module. Requires the Solr\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m service to be selected.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mDemo\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Demonstrates how Vortex tooling works: includes a counter\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m block with CSS/JS, PHPUnit example tests across all test\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m types, and a Behat feature. Safe to remove on real projects.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m Base - starter module with utilities and test scaffolding\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Search - custom Solr search integration\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Demo - counter block and example tests to demonstrate tooling\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space"] -[19.916847, "o", " bar to select o"] -[20.921686, "o", "ne or more modules.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[23A\r\u001b[J\u001b[36m◆\u001b[0m Custom modules (10/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mBase - starter module with utilities and test scaffolding, Search - custom\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mSolr search integration, Demo - counter block and example tests to\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mdemonstrate tooling\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Theme \u001b[2m(11/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mOlivero\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mClaro\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mStark\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Custom (next prompt)\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select which Drupal theme to use.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[9A\r\u001b[J\u001b[36m◆\u001b[0m Theme (11/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mCustom (next prompt)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Custom theme machine name \u001b[2m(12/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar_wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name as a custom theme name\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m"] -[20.921692, "o", " Custom theme machine na"] -[20.921778, "o", "me (12/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mstar_wars\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[21.924945, "o", "\u001b[36m◇\u001b[0m Build front-end assets in the container? \u001b[2m(13/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mDisable to build theme assets on the host or as part of deployment.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Build front-end assets in the container? (13/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Storybook component library? \u001b[2m(14/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mComponent library for the custom theme, rendered by Drupal itself.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mStories are authored in Twig next to each component, so the library shows the\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3msame markup the site renders.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mA development server runs on demand with `ahoy storybook`. A static build is\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mproduced during provisioning and served at `/storybook` in local, CI and\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mdevelopment environments.\u001b[0m\r\r\n\u001b[90m│\u001b["] -[21.924952, "o", "0m\r\r\n\u001b[90m│\u001b[0m "] -[21.925082, "o", "\u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mAdds Storybook packages to the theme and a step to provisioning.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[22.927396, "o", "\u001b[14A\r\u001b[J\u001b[36m◆\u001b[0m Storybook component library? (14/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mCode repository\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Repository provider \u001b[2m(15/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mVortex offers full automation with GitHub, while support for other providers\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mis limited.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m GitHub\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mOther\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select your code repository provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[9A\r\u001b[J\u001b[36m◆\u001b[0m Repository provider (15/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mGitHub\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Release versioning scheme \u001b[2m(16/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mChoose your versioning scheme:\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mCalendar Versioning (CalVer)\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m \u001b[4myear.month.patch\u001b[0m\u001b[2;3m (E.g., \u001b[4m24.1.0\u001b[0m\u001b[2;3m)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m https://calver.org\u001b[0"] -[22.927402, "o", "m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3"] -[22.927517, "o", "m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mSemantic Versioning (SemVer)\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m \u001b[4mmajor.minor.patch\u001b[0m\u001b[2;3m (E.g., \u001b[4m1.0.0\u001b[0m\u001b[2;3m)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m https://semver.org\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mOther\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Custom versioning scheme of your choice.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Calendar Versioning (CalVer)\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mSemantic Versioning (SemVer)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mOther\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select your version scheme.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[23.932223, "o", "\u001b[20A\r\u001b[J\u001b[36m◆\u001b[0m Release versioning scheme (16/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mCalendar Versioning (CalVer)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mEnvironment\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Timezone \u001b[2m(17/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mUTC\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mEtc/UTC\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUTC\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇, or start typing to select the timezone for your project.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Timezone (17/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mUTC\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Services \u001b[2m(18/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m ClamAV\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Solr\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Redis\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more services.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[23.932276, "o", "\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Services (18/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mClamAV, Redis, Solr\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[24.933795, "o", "\u001b[36m◇\u001b[0m Development tools \u001b[2m(19/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m PHP CodeSniffer\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m PHPStan\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Rector\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m ESLint\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Stylelint\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Jest\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m PHPUnit\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Behat\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Twig CS Fixer\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m DCLint\r\r\n\u001b[90m│\u001b[0m \u001b[2m↓ 1 more\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more tools.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[25.938558, "o", "\u001b[17A\r\u001b[J\u001b[36m◆\u001b[0m Development tools (19/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mBehat, DCLint, ESLint, Hadolint, Jest, PHP CodeSniffer, PHPStan, PHPUnit,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRector, Stylelint, Twig CS Fixer\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mHosting\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Hosting provider \u001b[2m(20/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mAcquia Cloud\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mLagoon\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mOther\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m None\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select your hosting provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[26.941497, "o", "\u001b[9A\r\u001b[J\u001b[36m◆\u001b[0m Hosting provider (20/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Custom web root directory \u001b[2m(21/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mweb\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mCustom directory where the web server serves the site.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[27.9463, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Custom web root directory (21/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mweb\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mDeployment\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Deployment types \u001b[2m(22/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◻\u001b[0m Code artifact\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mLagoon webhook\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Custom webhook\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more deployment types.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[28.947875, "o", "\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Deployment types (22/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mCustom webhook\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mWorkflow\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Provision type \u001b[2m(23/35)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mProvisioning sets up the site in an environment using an already assembled\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mcodebase.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mImport from database dump\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Provisions the site by importing a database dump\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m typically copied from production into lower\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m environments.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mInstall from profile\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Provisions the site by installing a fresh Drupal\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m site from a profile every time an environment is\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m created.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Import from database dump\r\r\n\u001b[9"] -[28.947881, "o", "0m│\u001b[0m \u001b[2m○\u001b["] -[28.947978, "o", "0m \u001b[2mInstall from profile\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the provision type.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[29.948185, "o", "\u001b[19A\r\u001b[J\u001b[36m◆\u001b[0m Provision type (23/35)\r\r\n\u001b[90m│\u001b[0m \u001b[2mImport from database dump\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Database source \u001b[2m(24/36)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m URL download\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mFTP download\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mAcquia backup\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mLagoon environment\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mContainer registry\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mS3 bucket\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the database fetch source.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[30.948908, "o", "\u001b[12A\r\u001b[J\u001b[36m◆\u001b[0m Database source (24/36)\r\r\n\u001b[90m│\u001b[0m \u001b[2mURL download\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Use a second database for migrations? \u001b[2m(25/36)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mAdds a second database service for Drupal migrations.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[31.949607, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Use a second database for migrations? (25/36)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mNotifications\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Notification channels \u001b[2m(26/36)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m Email\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mGitHub\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mJIRA\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mNew Relic\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mSlack\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mWebhook\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more notification channels.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[31.949672, "o", "\u001b[11A\r\u001b[J\u001b[36m◆\u001b[0m Notification channels (26/36)\r\r\n\u001b[90m│\u001b[0m \u001b[2mEmail\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[32.950917, "o", "\u001b[90m├\u001b[0m \u001b[1mContinuous Integration\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Continuous Integration provider \u001b[2m(27/36)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m GitHub Actions\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mCircleCI\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the CI provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[33.95586, "o", "\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Continuous Integration provider (27/36)\r\r\n\u001b[90m│\u001b[0m \u001b[2mGitHub Actions\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Visual regression testing with Diffy? \u001b[2m(28/36)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mDiffy-powered visual regression workflow to compare deployed environments.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mAutomatically triggers comparisons for dependency-update pull requests\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mmatching the configured branch pattern (`deps/*` by default).\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mRuns comparisons for pull requests tagged with the `VR` label and posts a\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3msticky comment.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mAlso supports manual runs against any URL.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRequires a Diffy account.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[33.955902, "o", "\u001b[15A\r\u001b[J\u001b[36m◆\u001b[0m Visual regression testing with Diffy? (28/36)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[34.960716, "o", "\u001b[36m◇\u001b[0m Scan for committed secrets with Gitleaks? \u001b[2m(29/36)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRuns in CI to detect hardcoded passwords, API keys and tokens.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[35.966718, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Scan for committed secrets with Gitleaks? (29/36)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mAutomations\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Dependency updates provider \u001b[2m(30/36)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Renovate GitHub app\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mRenovate self-hosted in CI\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the dependency updates provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[35.966981, "o", "\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Dependency updates provider (30/36)\r\r\n\u001b[90m│\u001b[0m \u001b[2mRenovate GitHub app\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[36.972045, "o", "\u001b[36m◇\u001b[0m Auto-merge dependency updates \u001b[2m(31/37)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mPull requests in the selected groups are merged as soon as they meet the\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mbranch protection rules. Pull requests in other groups need a manual merge.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mRequires \"Allow auto-merge\" in the repository settings and at least one\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mrequired status check on the base branch.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m PHP packages, except Drupal core (minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Drupal core (minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m JavaScript packages (minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Container images (major, minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m CI tools (major, minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m GitHub Actions (major, minor and patch)\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more groups.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[37.976479, "o", "\u001b[16A\r\u001b[J\u001b[36m◆\u001b[0m Auto-merge dependency updates (31/37)\r\r\n\u001b[90m│\u001b[0m \u001b[2mPHP packages, except Drupal core (minor and patch), Drupal core (minor and\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mpatch), JavaScript packages (minor and patch), Container images (major, minor\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mand patch), CI tools (major, minor and patch), GitHub Actions (major, minor\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mand patch)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Code coverage provider \u001b[2m(32/37)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mCodecov\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m None\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the code coverage provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[37.976585, "o", "\u001b[7A\r\u001b[J\u001b[36m◆\u001b[0m Code coverage provider (32/37)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[38.979269, "o", "\u001b[36m◇\u001b[0m Auto-assign the author to their PR? \u001b[2m(33/37)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mHelps to keep the PRs organized.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[39.98135, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Auto-assign the author to their PR? (33/37)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Auto-add a CONFLICT label to a PR when conflicts occur? \u001b[2m(34/37)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mHelps to keep quickly identify PRs that need attention.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[40.981735, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Auto-add a CONFLICT label to a PR when conflicts occur? (34/37)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mDocumentation\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Preserve project documentation? \u001b[2m(35/37)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mHelps to maintain the project documentation within the repository.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[41.982046, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Preserve project documentation? (35/37)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mAI\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Provide AI agent instructions? \u001b[2m(36/37)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mProvides AI coding agents with better context about the project.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[42.98486, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Provide AI agent instructions? (36/37)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Configure AI code review with CodeRabbit? \u001b[2m(37/37)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRequires the CodeRabbit app on the repository.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Configure AI code review with CodeRabbit? (37/37)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[43.9897, "o", "\u001b[?25h\u001b[34m●\u001b[0m \u001b[34mInstallation summary\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m┌───────────────────────────────────────────────────────────────────────────┐\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mGeneral information\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Site name \u001b[90m│\u001b[0m Star Wars \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Site machine name \u001b[90m│\u001b[0m star_wars \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Organization name \u001b[90m"] -[43.98973, "o", "│\u001b[0m"] -[43.989802, "o", " Rebellion \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Organization machine name \u001b[90m│\u001b[0m rebellion \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Public domain \u001b[90m│\u001b[0m star-wars.com \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mDrupal\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Starter \u001b[90m│\u001b[0m load"] -[43.989807, "o", "_demod"] -[43.989891, "o", "b \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Modules \u001b[90m│\u001b[0m coffee, config_split, config_update, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m devel, drupal_helpers, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m environment_indicator, fast_404, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m generated_content, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m navigation_extra_tools, pathauto, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m redirect, reroute_email, robotstxt, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m sdc_devel, seckit, shield, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m stage_file_proxy, "] -[43.989898, "o", "testmode"] -[43.990015, "o", ", xmlsitemap \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Webroot \u001b[90m│\u001b[0m web \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Profile \u001b[90m│\u001b[0m standard \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Module prefix \u001b[90m│\u001b[0m sw \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Custom modules \u001b[90m│\u001b[0m base, search, demo \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Theme machine name \u001b[90m│\u001b[0m star_wars \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Build front-end in container \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Storybook component library \u001b[90m│\u001b[0m No \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├────────────────────────────"] -[43.990022, "o", "───"] -[43.990105, "o", "───┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mCode repository\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Code provider \u001b[90m│\u001b[0m github \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Version scheme \u001b[90m│\u001b[0m calver \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────"] -[43.990111, "o", "┤\u001b["] -[43.990213, "o", "0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mEnvironment\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Timezone \u001b[90m│\u001b[0m UTC \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Services \u001b[90m│\u001b[0m clamav, redis, solr \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Tools \u001b[90m│\u001b[0m behat, dclint, eslint, hadolint, jest, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m phpcs, phpstan, phpunit, rector, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m stylelint, twig_cs_fixer \u001b[90m│\u001b[0m\r\r\n\u001b[9"] -[43.990218, "o", "0m│\u001b[0"] -[43.990326, "o", "m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mHosting\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Hosting provider \u001b[90m│\u001b[0m none \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m "] -[43.990331, "o", " \u001b[90"] -[43.990404, "o", "m│\u001b[0m \u001b[1mDeployment\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Deployment types \u001b[90m│\u001b[0m webhook \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mWorkflow\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────"] -[43.990408, "o", "──"] -[43.99049, "o", "──────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Provision type \u001b[90m│\u001b[0m database \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Database source \u001b[90m│\u001b[0m url \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Migration database \u001b[90m│\u001b[0m No \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mNotifications\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬───────────"] -[43.990493, "o", "───"] -[43.990562, "o", "──────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Channels \u001b[90m│\u001b[0m email \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mContinuous Integration\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m CI provider \u001b[90m│\u001b[0m gha \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Visual regression"] -[43.990565, "o", " testi"] -[43.990653, "o", "ng \u001b[90m│\u001b[0m No \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Secret scanning with Gitleaks \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mAutomations\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Dependency updates provider \u001b[90m│\u001b[0m renovatebot_app \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Auto-merge dependency update"] -[43.990655, "o", "s \u001b"] -[43.99072, "o", "[90m│\u001b[0m php, drupal_core, js, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m container_images, ci_tools, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m github_actions \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Code coverage provider \u001b[90m│\u001b[0m none \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Auto-assign PR author \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Auto-add a CONFLICT label to PRs \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mDocumentation\u001b[0m "] -[43.990728, "o", " "] -[43.990826, "o", " \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Preserve project documentation \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mAI\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬───────────────────────────"] -[43.990829, "o", "─"] -[43.990915, "o", "────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m AI agent instructions \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m AI code review \u001b[90m│\u001b[0m No \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mLocations\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Current directory \u001b[90m│\u001b[0m /home/user/ww"] -[43.990919, "o", "w/drevop"] -[43.991029, "o", "s/vortex2/.artifa \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m cts/tmp/videos-workspace \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Destination directory \u001b[90m│\u001b[0m /home/user/vortex/.artifa \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m cts/tmp/videos-workspace/star_wars \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Vortex repository \u001b[90m│\u001b[0m /home/user/vortex \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Vortex reference \u001b[90m│\u001b[0m HEAD \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m└──────────────────────────────────┴────────────────────────────────────────┘\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[43.994161, "o", " Vortex will be installed into your project's directory \"/home/user/demo/star_wars\"\r\r\n"] -[44.008936, "o", "\u001b[?25l"] -[44.009141, "o", "\u001b[36m◇\u001b[0m Proceed with installing Vortex?\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[4A\r\u001b[J\u001b[36m◆\u001b[0m Proceed with installing Vortex?\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[46.013888, "o", "\u001b[?25h\u001b[34m●\u001b[0m \u001b[34mStarting project installation\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Downloading Vortex\r\r\n\u001b[90m│\u001b[0m \u001b[2mDownloading from \"/home/user/vortex\" repository at ref \"HEAD\"\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Vortex downloaded (develop)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Customizing Vortex for your project\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Vortex was customized for your project\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Preparing destination directory\r\r\n\u001b[90m│\u001b[0m \u001b[2mCreated directory\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m\"/home/user/demo/star_wars\".\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mInitializing a new Git repository in directory\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m\"/home/user/demo/star_wars\".\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Destination directory is ready\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Copying files to the destination directory\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Files copied to destination directory\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Preparin"] -[46.013897, "o", "g demo content\r\r\n\r\r\n"] -[46.210479, "o", "\u001b[90m│\u001b[0m \u001b[2mCreated data directory\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m\"/home/user/demo/star_wars/.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mdata\".\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo database dump file was found in\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m\"/home/user/demo/star_wars/.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mdata\" directory.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mFetched demo database from\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mhttps://github.com/drevops/vortex/releases/download/1.40.0/db.demo.sql.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Demo content prepared\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[46.211123, "o", "\u001b[90m│\u001b[0m \u001b[90m┌────────────────────────────────────────────────┐\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mFinished installing Vortex\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m──────────────────────────\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Add and commit all files: \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m git add -A \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m git commit -m \"Initial commit.\" \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Files: 401 added \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Status and diff of every file are recorded in: \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m .logs/vortex-install-2026-11-11-010448"] -[46.211131, "o", ".md \u001b["] -[46.211254, "o", "90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m└────────────────────────────────────────────────┘\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[46.226108, "o", "\u001b[?25l"] -[46.226294, "o", "\u001b[36m◇\u001b[0m Run the site build now?\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mTakes ~5-10 min; output will be streamed. You can skip and run later with:\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mahoy build\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[48.229317, "o", "\u001b[7A\r\u001b[J\u001b[36m◆\u001b[0m Run the site build now?\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[?25h\u001b[90m│\u001b[0m \u001b[90m┌───────────────────────────────────────────────────────────────────────────┐\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mReady to build\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m──────────────\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Build the site: \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m ahoy build \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Setup GitHub Action"] -[48.229326, "o", "s: "] -[48.229416, "o", " \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m https://www.vortextemplate.com/docs/continuous-integration/github-actio \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m ns#onboarding \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m└───────────────────────────────────────────────────────────────────────────┘\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[48.238141, "x", "0"] +{"version":2,"width":80,"height":27,"timestamp":1794370130,"command":"/home/user/demo/installer.exp","title":"Vortex Installer Demo","env":{"SHELL":"/opt/homebrew/opt/bash/bin/bash"}} +[0.572558, "o", "\u001b[36m──────────────────────────────────────────────────────────────────────────────\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m ██╗ ██╗ ██████╗ ██████╗ ████████╗ ███████╗ ██╗ ██╗\u001b[39m\r\r\n\u001b[36m ██║ ██║ ██╔═══██╗ ██╔══██╗ ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝\u001b[39m\r\r\n\u001b[36m ██║ ██║ ██║ ██║ ██████╔╝ ██║ █████╗ ╚███╔╝\u001b[39m\r\r\n\u001b[36m ╚██╗ ██╔╝ ██║ ██║ ██╔══██╗ ██║ ██╔══╝ ██╔██╗\u001b[39m\r\r\n\u001b[36m ╚████╔╝ ╚██████╔╝ ██║ ██║ ██║ "] +[0.572569, "o", " █"] +[0.572647, "o", "██████╗ ██╔╝ ██╗\u001b[39m\r\r\n\u001b[36m ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝ ╚═╝ ╚═╝\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m Drupal project template\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m by DrevOps\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m──────────────────────────────────────────────────────────────────────────────\u001b[39m\r\r\n\u001b[2m Installer version: development\u001b[22m\r\r\n"] +[0.573964, "o", "\u001b[90m│\u001b[0m \u001b[90m┌───────────────────────────────────────────────────────────────────────────┐\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mWelcome to the Vortex interactive installer\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m───────────────────────────────────────────\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m This tool will guide you through installing the latest \u001b[4mdevelopment\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m version of Vortex into your project. \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m You will be asked a few questions to tailor the c"] +[0.574011, "o", "onfigu"] +[0.574051, "o", "ration to your \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m site. \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m No changes will be made until you confirm everything at the end. \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Press \u001b[33mCtrl+C\u001b[39m at any time to exit the installer.\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Press \u001b[33mCtrl+U\u001b[39m at any time to go back to the previous step.\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m└───────────────────────────────────────────────────────────────────────────┘\u001b[0m\r\r\n\u001b[90m│\u001b"] +[0.574077, "o", "[0m\r\r\n"] +[0.574699, "o", "\u001b[36m◇\u001b[0m Validating repository and reference\r\r\n"] +[0.580922, "o", "\u001b[90m│\u001b[0m \u001b[2mChecking repository \"/home/user/vortex\" and reference \"HEAD\"\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Repository and reference validated successfully\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[0.598426, "o", "\u001b[?25l"] +[0.598487, "o", "\u001b[36m◇\u001b[0m Press any key to continue...\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[3.599062, "o", "\u001b[2A\r\u001b[J"] +[3.607435, "o", "\u001b[?25h"] +[3.625752, "o", "\u001b[?25l"] +[3.62576, "o", "\r\r\n\u001b[90m┌\u001b[0m \u001b[1mGeneral information\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[3.626209, "o", "\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[3.781591, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar war\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar wa\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar w\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar \u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use"] +[3.781647, "o", " this name in the project an"] +[5.075415, "o", "d documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37msta\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mst\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37ms\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] +[5.075422, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe "] +[5.0755, "o", "will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.078222, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r"] +[6.078231, "o", "\r\n\u001b[90m│\u001b[0m \u001b[2mWe will u"] +[6.07832, "o", "se this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.078421, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.078533, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.078626, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.078726, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.078833, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.078926, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.079019, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.079121, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.07922, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.079323, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.079412, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.079508, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.079615, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.079736, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.079832, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.079935, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.07999, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.080105, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.080272, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.080355, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.080495, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.08054, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.080702, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.080804, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.080894, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.080991, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.08109, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.081201, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.081271, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.081412, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.081475, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.081582, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.081677, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.081784, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.081895, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.082011, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mS\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.082121, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mSt\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.082216, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mSta\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.082307, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.082402, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar \u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.082501, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar W\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.082623, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wa\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.082682, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar War\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.082831, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.082934, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Site name (1/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mStar Wars\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.083309, "o", "\u001b[36m◇\u001b[0m Site machine name \u001b[2m(2/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar_wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name for the project directory and in the code.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[7.083742, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Site machine name (2/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mstar_wars\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[7.083999, "o", "\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[7.234605, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars Or\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars O\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars \u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar War\u001b[0"] +[7.234618, "o", "m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0"] +[8.086723, "o", "m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wa\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar W\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar \u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m O"] +[8.086748, "o", "rganization name \u001b[2m(3/32)"] +[8.086828, "o", "\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mSta\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[9.090803, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mSt\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mS\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r"] +[9.090811, "o", "\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0"] +[9.090957, "o", "m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[10.098977, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] +[10.102382, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] +[10.102569, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b["] +[10.104128, "o", "0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m O"] +[11.107729, "o", "rganization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b["] +[11.107815, "o", "90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b"] +[11.107952, "o", "[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[12.112257, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] +[12.112263, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] +[12.112371, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[13.116517, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] +[13.116562, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] +[13.116657, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[14.116896, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] +[14.116904, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] +[14.117056, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[15.117645, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] +[15.117653, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] +[15.117752, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[16.118161, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mR\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRe\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mReb\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebe\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebel\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90"] +[16.118169, "o", "m│\u001b[0m \u001b[2mWe will use th"] +[16.118315, "o", "is name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[17.118904, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebell\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebelli\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebellio\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebellion\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Organization name (3/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mRebellion\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Or"] +[17.118911, "o", "ganization machine name \u001b[2"] +[17.119059, "o", "m(4/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mrebellion\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the code.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[18.124014, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Organization machine name (4/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mrebellion\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Public domain \u001b[2m(5/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar-wars.com\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mDomain name without protocol and trailing slash.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Public domain (5/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mstar-wars.com\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mDrupal\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m How would you like your site to be created on the first run? \u001b[2m(6/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mChoose how your site will be created the first time after this installer\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mfinishes:\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mDrupal, installed from profile\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Creates a new site by \u001b[4mpopulating a fresh database\u001b[0m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m from one of the standard Drupal installation profiles.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b["] +[18.124036, "o", "2;3m ○ \u001b[1mDrupal"] +[18.124135, "o", " CMS, installed from profile\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Creates a new site by \u001b[4mpopulating a fresh database\u001b[0m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m from the Drupal CMS recipe.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mDrupal, loaded from the demo database\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Creates a site by \u001b[4mloading an existing demo database\u001b[0m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m provided with the installer.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mDrupal, installed from profile\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mDrupal CMS, installed from profile\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Drupal, loaded from the demo database\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇. Applies only on the first run of the installer.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[19.127962, "o", "\u001b[22A\r\u001b[J\u001b[36m◆\u001b[0m How would you like your site to be created on the first run? (6/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mDrupal, loaded from the demo database\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Profile \u001b[2m(7/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Standard\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mMinimal\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mDemo Umami\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mCustom (next prompt)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select which Drupal profile to use.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[9A\r\u001b[J\u001b[36m◆\u001b[0m Profile (7/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mStandard\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Modules \u001b[2m(8/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m Coffee\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Config split\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Config update\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Devel\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Diff\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Drupal helpers\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Entity usage\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Environment indicator\r\r\n"] +[19.128008, "o", "\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m"] +[19.128077, "o", " Fast 404\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Field group\r\r\n\u001b[90m│\u001b[0m \u001b[2m↓ 19 more\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more modules.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[20.133044, "o", "\u001b[17A\r\u001b[J\u001b[36m◆\u001b[0m Modules (8/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mCoffee, Config split, Config update, Devel, Diff, Drupal helpers, Entity\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2musage, Environment indicator, Fast 404, Field group, Generated content, Gin\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2madmin theme, Linkit, Menu trail by path, Metatag, Navigation extra tools,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mPathauto, Redirect, Reroute email, Robots.txt, Scheduled transitions,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mSchema.org Metatag, SDC Devel, Seckit, Shield, Stage file proxy, Testmode,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mViews bulk operations, XML Sitemap\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Custom modules prefix \u001b[2m(9/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37msw\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in custom modules\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Custom modules prefix (9/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2msw\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Custom modules \u001b[2m(10/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mSelect which custom modules to include in your project:\u001b[0"] +[20.133053, "o", "m\r\r\n\u001b[90m│\u001b[0m \u001b"] +[20.133189, "o", "[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mBase\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Starter module with deploy hooks and test scaffolding for\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Unit, Kernel, Functional, and FunctionalJavascript tests.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mSearch\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Custom Solr search integration module. Requires the Solr\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m service to be selected.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mDemo\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Demonstrates how Vortex tooling works: includes a counter\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m block with CSS/JS, PHPUnit example tests across all test\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m types, and a Behat feature. Safe to remove on real projects.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m Base - starter module with utilities and test scaffolding\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Search - custom Solr search integration\r\r\n\u001b[90m│\u001b[0m \u001b"] +[20.133222, "o", "[32m◼\u001b[0m Demo"] +[21.134199, "o", " - counter block and example tests to demonstrate tooling\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more modules.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[22A\r\u001b[J\u001b[36m◆\u001b[0m Custom modules (10/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mBase - starter module with utilities and test scaffolding, Search - custom\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mSolr search integration, Demo - counter block and example tests to\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mdemonstrate tooling\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Theme \u001b[2m(11/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mOlivero\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mClaro\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mStark\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Custom (next prompt)\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select which Drupal theme to use.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[9A\r\u001b[J\u001b[36m◆\u001b[0m Theme (11/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mCustom (next prompt)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[36m◇\u001b[0m Custom theme machine name \u001b[2m(11.1)\u001b[0m\r\r\n\u001b[90m│"] +[21.13428, "o", "\u001b[0m \u001b[90m│\u001b[0m \r\r\n\u001b"] +[21.134339, "o", "[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[37mstar_wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[2mWe will use this name as a custom theme name\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \r\r\n"] +[22.134593, "o", "\u001b[6A\r\u001b[J\u001b[90m│\u001b[0m \u001b[36m◆\u001b[0m Custom theme machine name (11.1)\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[2mstar_wars\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[36m◇\u001b[0m Build front-end assets in the container? \u001b[2m(11.2)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[2mDisable to build theme assets on the host or as part of deployment.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \r\r\n\u001b[6A\r\u001b[J\u001b[90m│\u001b[0m \u001b[36m◆\u001b[0m Build front-end assets in the container? (11.2)\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[36m◇\u001b[0m Storybook component library? \u001b[2m(11.3)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mComponent library for the custom theme, rendered by Drupal itself.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mStories are authored in Twig next to each component, so the library shows\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mthe same markup the site"] +[22.134599, "o", " renders.\u001b[0m\r\r\n\u001b"] +[22.134747, "o", "[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mA development server runs on demand with `ahoy storybook`. A static build\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mis produced during provisioning and served at `/storybook` in local, CI\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mand development environments.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[2mAdds Storybook packages to the theme and a step to provisioning.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n"] +[23.136427, "o", "\u001b[14A\r\u001b[J\u001b[90m│\u001b[0m \u001b[36m◆\u001b[0m Storybook component library? (11.3)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[90m├\u001b[0m \u001b[1mCode repository\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Repository provider \u001b[2m(12/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mVortex offers full automation with GitHub, while support for other providers\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mis limited.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m GitHub\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mOther\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select your code repository provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[9A\r\u001b[J\u001b[36m◆\u001b[0m Repository provider (12/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mGitHub\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Release versioning scheme \u001b[2m(13/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mChoose your versioning scheme:\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mCalendar Versioning (CalVer)\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m \u001b[4myear.month.patch\u001b[0m\u001b[2;3m (E.g., \u001b[4m24.1.0\u001b[0m\u001b[2;3m)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m "] +[23.136439, "o", "https://calver.org\u001b[0m"] +[23.136572, "o", "\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mSemantic Versioning (SemVer)\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m \u001b[4mmajor.minor.patch\u001b[0m\u001b[2;3m (E.g., \u001b[4m1.0.0\u001b[0m\u001b[2;3m)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m https://semver.org\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mOther\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Custom versioning scheme of your choice.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Calendar Versioning (CalVer)\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mSemantic Versioning (SemVer)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mOther\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select your version scheme.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[24.136956, "o", "\u001b[20A\r\u001b[J\u001b[36m◆\u001b[0m Release versioning scheme (13/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mCalendar Versioning (CalVer)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mEnvironment\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Timezone \u001b[2m(14/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mUTC\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mEtc/UTC\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUTC\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇, or start typing to select the timezone for your project.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Timezone (14/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mUTC\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Services \u001b[2m(15/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m ClamAV\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Solr\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Redis\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more services.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[25.141153, "o", "\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Services (15/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mClamAV, Redis, Solr\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Development tools \u001b[2m(16/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m PHP CodeSniffer\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m PHPStan\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Rector\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m ESLint\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Stylelint\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Jest\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m PHPUnit\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Behat\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Twig CS Fixer\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m DCLint\r\r\n\u001b[90m│\u001b[0m \u001b[2m↓ 1 more\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more tools.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[26.145696, "o", "\u001b[17A\r\u001b[J\u001b[36m◆\u001b[0m Development tools (16/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mBehat, DCLint, ESLint, Hadolint, Jest, PHP CodeSniffer, PHPStan, PHPUnit,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRector, Stylelint, Twig CS Fixer\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mHosting\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Hosting provider \u001b[2m(17/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mAcquia Cloud\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mLagoon\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mOther\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m None\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select your hosting provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[27.150709, "o", "\u001b[9A\r\u001b[J\u001b[36m◆\u001b[0m Hosting provider (17/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Custom web root directory \u001b[2m(18/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mweb\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mCustom directory where the web server serves the site.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[28.151355, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Custom web root directory (18/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mweb\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mDeployment\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Deployment types \u001b[2m(19/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◻\u001b[0m Code artifact\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mLagoon webhook\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Custom webhook\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more deployment types.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[29.151993, "o", "\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Deployment types (19/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mCustom webhook\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mWorkflow\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Provision type \u001b[2m(20/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mProvisioning sets up the site in an environment using an already assembled\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mcodebase.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mImport from database dump\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Provisions the site by importing a database dump\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m typically copied from production into lower\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m environments.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mInstall from profile\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Provisions the site by installing a fresh Drupal\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m site from a profile every time an environment is\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m created.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Import from database dump\r\r\n\u001b[9"] +[29.152046, "o", "0m│\u001b[0m \u001b[2m○\u001b["] +[29.152101, "o", "0m \u001b[2mInstall from profile\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the provision type.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[30.152426, "o", "\u001b[19A\r\u001b[J\u001b[36m◆\u001b[0m Provision type (20/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mImport from database dump\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[36m◇\u001b[0m Database source \u001b[2m(20.1)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m URL download\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mFTP download\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mAcquia backup\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mLagoon environment\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mContainer registry\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mS3 bucket\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the database fetch source.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n"] +[30.152546, "o", "\u001b[12A\r\u001b[J\u001b[90m│\u001b[0m \u001b[36m◆\u001b[0m Database source (20.1)\r\r\n\u001b[90m│\u001b[0m \u001b[2mURL download\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n"] +[31.153013, "o", "\u001b[36m◇\u001b[0m Use a second database for migrations? \u001b[2m(21/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mAdds a second database service for Drupal migrations.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[32.153782, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Use a second database for migrations? (21/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mNotifications\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Notification channels \u001b[2m(22/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m Email\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mGitHub\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mJIRA\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mNew Relic\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mSlack\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mWebhook\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more notification channels.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[32.153869, "o", "\u001b[11A\r\u001b[J\u001b[36m◆\u001b[0m Notification channels (22/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mEmail\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[33.158692, "o", "\u001b[90m├\u001b[0m \u001b[1mContinuous Integration\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Continuous Integration provider \u001b[2m(23/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m GitHub Actions\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mCircleCI\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the CI provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[34.16232, "o", "\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Continuous Integration provider (23/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mGitHub Actions\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Visual regression testing with Diffy? \u001b[2m(24/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mDiffy-powered visual regression workflow to compare deployed environments.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mAutomatically triggers comparisons for dependency-update pull requests\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mmatching the configured branch pattern (`deps/*` by default).\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mRuns comparisons for pull requests tagged with the `VR` label and posts a\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3msticky comment.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mAlso supports manual runs against any URL.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRequires a Diffy account.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[35.167441, "o", "\u001b[15A\r\u001b[J\u001b[36m◆\u001b[0m Visual regression testing with Diffy? (24/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Scan for committed secrets with Gitleaks? \u001b[2m(25/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRuns in CI to detect hardcoded passwords, API keys and tokens.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[36.167857, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Scan for committed secrets with Gitleaks? (25/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mAutomations\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Dependency updates provider \u001b[2m(26/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Renovate GitHub app\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mRenovate self-hosted in CI\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the dependency updates provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[37.168388, "o", "\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Dependency updates provider (26/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mRenovate GitHub app\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[36m◇\u001b[0m Auto-merge dependency updates \u001b[2m(26.1)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mPull requests in the selected groups are merged as soon as they meet the\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mbranch protection rules. Pull requests in other groups need a manual\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mmerge.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mRequires \"Allow auto-merge\" in the repository settings and at least one\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mrequired status check on the base branch.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m PHP packages, except Drupal core (minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Drupal core (minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m JavaScript packages (minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Container images (major, minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m CI "] +[37.168395, "o", "tools (major, mi"] +[37.168513, "o", "nor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m GitHub Actions (major, minor and patch)\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more groups.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n"] +[38.168828, "o", "\u001b[17A\r\u001b[J\u001b[90m│\u001b[0m \u001b[36m◆\u001b[0m Auto-merge dependency updates (26.1)\r\r\n\u001b[90m│\u001b[0m \u001b[2mPHP packages, except Drupal core (minor and patch), Drupal core (minor and\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mpatch), JavaScript packages (minor and patch), Container images (major,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mminor and patch), CI tools (major, minor and patch), GitHub Actions\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m(major, minor and patch)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[36m◇\u001b[0m Code coverage provider \u001b[2m(27/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mCodecov\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m None\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the code coverage provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[39.169409, "o", "\u001b[7A\r\u001b[J\u001b[36m◆\u001b[0m Code coverage provider (27/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Auto-assign the author to their PR? \u001b[2m(28/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mHelps to keep the PRs organized.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[40.169825, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Auto-assign the author to their PR? (28/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Auto-add a CONFLICT label to a PR when conflicts occur? \u001b[2m(29/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mHelps to keep quickly identify PRs that need attention.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[41.170635, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Auto-add a CONFLICT label to a PR when conflicts occur? (29/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mDocumentation\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Preserve project documentation? \u001b[2m(30/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mHelps to maintain the project documentation within the repository.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[42.17152, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Preserve project documentation? (30/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mAI\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Provide AI agent instructions? \u001b[2m(31/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mProvides AI coding agents with better context about the project.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[43.175771, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Provide AI agent instructions? (31/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Configure AI code review with CodeRabbit? \u001b[2m(32/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRequires the CodeRabbit app on the repository.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[43.175855, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Configure AI code review with CodeRabbit? (32/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[44.18058, "o", "\u001b[?25h\u001b[34m●\u001b[0m \u001b[34mInstallation summary\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m┌───────────────────────────────────────────────────────────────────────────┐\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mGeneral information\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Site name \u001b[90m│\u001b[0m Star Wars \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Site machine name \u001b[90m│\u001b[0m star_wars \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Organization name \u001b[90m"] +[44.18059, "o", "│\u001b[0m"] +[44.180694, "o", " Rebellion \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Organization machine name \u001b[90m│\u001b[0m rebellion \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Public domain \u001b[90m│\u001b[0m star-wars.com \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mDrupal\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Starter \u001b[90m│\u001b[0m load"] +[44.180725, "o", "_demod"] +[44.180796, "o", "b \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Modules \u001b[90m│\u001b[0m coffee, config_split, config_update, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m devel, diff, drupal_helpers, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m entity_usage, environment_indicator, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m fast_404, field_group, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m generated_content, gin, linkit, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m menu_trail_by_path, metatag, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m navigation_extra_tools, pathauto, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m redirect, reroute_"] +[44.180819, "o", "email, r"] +[44.180921, "o", "obotstxt, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m scheduled_transitions, schema_metatag, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m sdc_devel, seckit, shield, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m stage_file_proxy, testmode, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m views_bulk_operations, xmlsitemap \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Webroot \u001b[90m│\u001b[0m web \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Profile \u001b[90m│\u001b[0m standard \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Module prefix \u001b[90m│\u001b[0m sw \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Custom modules \u001b[90m│\u001b[0m base, search, demo "] +[44.180944, "o", " \u001b[9"] +[44.181035, "o", "0m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Theme machine name \u001b[90m│\u001b[0m star_wars \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Build front-end in container \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Storybook component library \u001b[90m│\u001b[0m No \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mCode repository\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤"] +[44.181085, "o", "\u001b[0m\r\r\n"] +[44.181172, "o", "\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Code provider \u001b[90m│\u001b[0m github \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Version scheme \u001b[90m│\u001b[0m calver \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mEnvironment\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Timezone \u001b[90m│\u001b[0m UTC \u001b[90m│\u001b[0m\r\r\n\u001b[90m"] +[44.181217, "o", "│\u001b[0"] +[44.181313, "o", "m \u001b[90m│\u001b[0m Services \u001b[90m│\u001b[0m clamav, redis, solr \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Tools \u001b[90m│\u001b[0m behat, dclint, eslint, hadolint, jest, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m phpcs, phpstan, phpunit, rector, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m stylelint, twig_cs_fixer \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mHosting\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬──────"] +[44.181364, "o", "──"] +[44.181409, "o", "────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Hosting provider \u001b[90m│\u001b[0m none \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mDeployment\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Deployment types \u001b[90m│\u001b[0m webhook \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├─"] +[44.181445, "o", "──"] +[44.181532, "o", "───────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mWorkflow\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Provision type \u001b[90m│\u001b[0m database \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Database source \u001b[90m│\u001b[0m url \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Migration database \u001b[90m│\u001b[0m No \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├────"] +[44.181568, "o", "───"] +[44.181641, "o", "───────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mNotifications\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Channels \u001b[90m│\u001b[0m email \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mContinuous Int"] +[44.181675, "o", "egrati"] +[44.181748, "o", "on\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m CI provider \u001b[90m│\u001b[0m gha \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Visual regression testing \u001b[90m│\u001b[0m No \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Secret scanning with Gitleaks \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mAutomations\u001b[0m "] +[44.181752, "o", " "] +[44.181866, "o", " \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Dependency updates provider \u001b[90m│\u001b[0m renovatebot_app \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Auto-merge dependency updates \u001b[90m│\u001b[0m php, drupal_core, js, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m container_images, ci_tools, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m github_actions \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Code coverage provider \u001b[90m│\u001b[0m none \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Auto-assign PR author \u001b[90m│\u001b["] +[44.181912, "o", "0m Yes "] +[44.181988, "o", " \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Auto-add a CONFLICT label to PRs \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mDocumentation\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Preserve project documentation \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├────────────────────"] +[44.182036, "o", "──"] +[44.182081, "o", "────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mAI\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m AI agent instructions \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m AI code review \u001b[90m│\u001b[0m No \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴───────────────────────────────"] +[44.182108, "o", "─"] +[44.182184, "o", "────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mLocations\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Current directory \u001b[90m│\u001b[0m /home/user/vortex/.artifa \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m cts/tmp/videos-workspace \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Destination directory \u001b[90m│\u001b[0m /home/user/vortex/.artifa \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m cts/tmp/videos-workspace/star_wars \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Vortex repository \u001b[90m│\u001b[0m /home/user/www/drevops/vorte"] +[44.182189, "o", "x2 "] +[44.182273, "o", " \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Vortex reference \u001b[90m│\u001b[0m HEAD \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m└──────────────────────────────────┴────────────────────────────────────────┘\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[44.185464, "o", " Vortex will be installed into your project's directory \"/home/user/demo/star_wars\"\r\r\n"] +[44.202083, "o", "\u001b[?25l"] +[44.202205, "o", "\u001b[36m◇\u001b[0m Proceed with installing Vortex?\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[4A\r\u001b[J\u001b[36m◆\u001b[0m Proceed with installing Vortex?\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[46.203479, "o", "\u001b[?25h\u001b[34m●\u001b[0m \u001b[34mStarting project installation\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Downloading Vortex\r\r\n\u001b[90m│\u001b[0m \u001b[2mDownloading from \"/home/user/vortex\" repository at ref \"HEAD\"\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Vortex downloaded (develop)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Customizing Vortex for your project\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Vortex was customized for your project\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Preparing destination directory\r\r\n\u001b[90m│\u001b[0m \u001b[2mCreated directory\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m\"/home/user/demo/star_wars\".\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mInitializing a new Git repository in directory\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m\"/home/user/demo/star_wars\".\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Destination directory is ready\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Copying files to the destination directory\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Files copied to destination directory\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Preparin"] +[46.203519, "o", "g demo content\r\r\n\r\r\n"] +[46.211486, "o", "\u001b[90m│\u001b[0m \u001b[2mCreated data directory\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m\"/home/user/demo/star_wars/.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mdata\".\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo database dump file was found in\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m\"/home/user/demo/star_wars/.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mdata\" directory.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mFetched demo database from\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mhttps://github.com/drevops/vortex/releases/download/1.40.0/db.demo.sql.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Demo content prepared\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[46.212136, "o", "\u001b[90m│\u001b[0m \u001b[90m┌────────────────────────────────────────────────┐\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mFinished installing Vortex\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m──────────────────────────\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Add and commit all files: \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m git add -A \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m git commit -m \"Initial commit.\" \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Files: 402 added \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Status and diff of every file are recorded in: \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m .logs/vortex-install-2026-11-11-040935"] +[46.212153, "o", ".md \u001b["] +[46.212247, "o", "90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m└────────────────────────────────────────────────┘\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[46.227358, "o", "\u001b[?25l"] +[46.227549, "o", "\u001b[36m◇\u001b[0m Run the site build now?\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mTakes ~5-10 min; output will be streamed. You can skip and run later with:\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mahoy build\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[48.230485, "o", "\u001b[7A\r\u001b[J\u001b[36m◆\u001b[0m Run the site build now?\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[?25h\u001b[90m│\u001b[0m \u001b[90m┌───────────────────────────────────────────────────────────────────────────┐\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mReady to build\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m──────────────\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Build the site: \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m ahoy build \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Setup GitHub Action"] +[48.230507, "o", "s: "] +[48.230686, "o", " \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m https://www.vortextemplate.com/docs/continuous-integration/github-actio \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m ns#onboarding \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m└───────────────────────────────────────────────────────────────────────────┘\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[48.239818, "x", "0"] diff --git a/.vortex/docs/static/img/installer.svg b/.vortex/docs/static/img/installer.svg index 4440da59ec..15880d6981 100644 --- a/.vortex/docs/static/img/installer.svg +++ b/.vortex/docs/static/img/installer.svg @@ -1 +1 @@ -──────────────────────────────────────────────────────────────────────────────██╗██╗██████╗██████╗████████╗███████╗██╗██╗██║██║██╔═══██╗██╔══██╗╚══██╔══╝██╔════╝╚██╗██╔╝██║██║██║██║██████╔╝██║█████╗╚███╔╝╚██╗██╔╝██║██║██╔══██╗██║██╔══╝██╔██╗╚████╔╝╚██████╔╝██║██║██║███████╗██╔╝██╗╚═══╝╚═════╝╚═╝╚═╝╚═╝╚══════╝╚═╝╚═╝DrupalprojecttemplatebyDrevOpsInstallerversion:development│┌───────────────────────────────────────────────────────────────────────────┐││WelcometotheVortexinteractiveinstaller│││───────────────────────────────────────────│││Thistoolwillguideyouthroughinstallingthelatestdevelopment│││versionofVortexintoyourproject.││││││Youwillbeaskedafewquestionstotailortheconfigurationtoyour│││site.│││Nochangeswillbemadeuntilyouconfirmeverythingattheend.│││PressCtrl+Catanytimetoexittheinstaller.│││PressCtrl+Uatanytimetogobacktothepreviousstep.││└───────────────────────────────────────────────────────────────────────────┘│◇Validatingrepositoryandreference│Checkingrepository"/home/user/vortex"andreference"HEAD"│✓Repositoryandreferencevalidatedsuccessfully┌Generalinformation◇Sitename(1/32)│Wewillusethisnameintheprojectanddocumentation.│star█│E.g.MySite█│StarWar█◆Sitename(1/32)│StarWars◆Sitemachinename(2/32)│star_wars◇Organizationname(3/32)│E.g.MyOrg█│E.g.MyO│Rebe█│Rebellion█◆Organizationname(3/32)│Rebellion◆Organizationmachinename(4/32)│rebellion◆Publicdomain(5/32)│star-wars.com├Drupal◇Howwouldyoulikeyoursitetobecreatedonthefirstrun?(6/32)│Choosehowyoursitewillbecreatedthefirsttimeafterthisinstaller│finishes:│○Drupal,installedfromprofile│Createsanewsitebypopulatingafreshdatabase│fromoneofthestandardDrupalinstallationprofiles.│○DrupalCMS,installedfromprofile│fromtheDrupalCMSrecipe.│○Drupal,loadedfromthedemodatabase│Createsasitebyloadinganexistingdemodatabase│providedwiththeinstaller.│○Drupal,installedfromprofile│○DrupalCMS,installedfromprofile│❯●Drupal,loadedfromthedemodatabase◆Howwouldyoulikeyoursitetobecreatedonthefirstrun?(6/32)│Drupal,loadedfromthedemodatabase◆Profile(7/32)│Standard◇Modules(8/32)│❯◼Coffee│◼Configsplit│◼Configupdate│◼Devel│◼Drupalhelpers│◼Environmentindicator◆Modules(8/32)│Coffee,Configsplit,Configupdate,Devel,Drupalhelpers,Environment│indicator,Fast404,Generatedcontent,Navigationextratools,Pathauto,│Redirect,Rerouteemail,Robots.txt,SDCDevel,Seckit,Shield,Stagefile│proxy,Testmode,XMLSitemap◆Custommodulesprefix(9/32)│sw◇Custommodules(10/32)│Selectwhichcustommodulestoincludeinyourproject:│○Base│Startermodulewithcommonsiteutilities(mailhandling,│deployhooks)andtestscaffoldingforUnit,Kernel,│Functional,andFunctionalJavascripttests.│○Search│CustomSolrsearchintegrationmodule.RequirestheSolr│servicetobeselected.│○Demo│DemonstrateshowVortextoolingworks:includesacounter│blockwithCSS/JS,PHPUnitexampletestsacrossalltest│types,andaBehatfeature.Safetoremoveonrealprojects.│❯◼Base-startermodulewithutilitiesandtestscaffolding│◼Search-customSolrsearchintegration│◼Demo-counterblockandexampleteststodemonstratetooling◆Custommodules(10/32)│Base-startermodulewithutilitiesandtestscaffolding,Search-custom│Solrsearchintegration,Demo-counterblockandexampleteststo│demonstratetooling◆Theme(11/32)│Custom(nextprompt)◆Customthememachinename(12/35)◆Buildfront-endassetsinthecontainer?(13/35)│Yes◇Storybookcomponentlibrary?(14/35)│Componentlibraryforthecustomtheme,renderedbyDrupalitself.│StoriesareauthoredinTwignexttoeachcomponent,sothelibraryshowsthe│samemarkupthesiterenders.│Adevelopmentserverrunsondemandwith`ahoystorybook`.Astaticbuildis│producedduringprovisioningandservedat`/storybook`inlocal,CIand│developmentenvironments.│○Yes/●No◆Storybookcomponentlibrary?(14/35)│No├Coderepository◆Repositoryprovider(15/35)│GitHub◇Releaseversioningscheme(16/35)│Chooseyourversioningscheme:│○CalendarVersioning(CalVer)│year.month.patch(E.g.,24.1.0)│https://calver.org│○Other◆Releaseversioningscheme(16/35)│CalendarVersioning(CalVer)├Environment◆Timezone(17/35)│UTC◆Services(18/35)│ClamAV,Redis,Solr◆Developmenttools(19/35)│Behat,DCLint,ESLint,Hadolint,Jest,PHPCodeSniffer,PHPStan,PHPUnit,│Rector,Stylelint,TwigCSFixer├Hosting│❯●None◆Hostingprovider(20/35)│None◆Customwebrootdirectory(21/35)│web├Deployment◆Deploymenttypes(22/35)│Customwebhook├Workflow◇Provisiontype(23/35)│Provisioningsetsupthesiteinanenvironmentusinganalreadyassembled│codebase.│○Importfromdatabasedump│Provisionsthesitebyimportingadatabasedump│typicallycopiedfromproductionintolower│environments.│○Installfromprofile│ProvisionsthesitebyinstallingafreshDrupal│sitefromaprofileeverytimeanenvironmentis│created.│❯●Importfromdatabasedump◆Provisiontype(23/35)│Importfromdatabasedump│○None◆Databasesource(24/36)│URLdownload◆Useaseconddatabaseformigrations?(25/36)├Notifications◆Notificationchannels(26/36)│Email├ContinuousIntegration◆ContinuousIntegrationprovider(27/36)│GitHubActions◆VisualregressiontestingwithDiffy?(28/36)│●Yes/○No◆ScanforcommittedsecretswithGitleaks?(29/36)├Automations◆Dependencyupdatesprovider(30/36)│RenovateGitHubapp◆Auto-mergedependencyupdates(31/37)│PHPpackages,exceptDrupalcore(minorandpatch),Drupalcore(minorand│patch),JavaScriptpackages(minorandpatch),Containerimages(major,minor│andpatch),CItools(major,minorandpatch),GitHubActions(major,minor│andpatch)◆Codecoverageprovider(32/37)◆Auto-assigntheauthortotheirPR?(33/37)◆Auto-addaCONFLICTlabeltoaPRwhenconflictsoccur?(34/37)├Documentation◆Preserveprojectdocumentation?(35/37)├AI◆ProvideAIagentinstructions?(36/37)◆ConfigureAIcodereviewwithCodeRabbit?(37/37)●Installationsummary││Generalinformation││├──────────────────────────────────┬────────────────────────────────────────┤││Sitename│StarWars│││Sitemachinename│star_wars│││Organizationname│Rebellion│││Organizationmachinename│rebellion│││Publicdomain│star-wars.com││├──────────────────────────────────┴────────────────────────────────────────┤││Drupal│││Starter│load_demodb│││Modules│coffee,config_split,config_update,││││devel,drupal_helpers,││││environment_indicator,fast_404,││││generated_content,││││navigation_extra_tools,pathauto,││││redirect,reroute_email,robotstxt,││││sdc_devel,seckit,shield,││││stage_file_proxy,testmode,xmlsitemap│││Webroot│web│││Profile│standard│││Moduleprefix│sw│││Custommodules│base,search,demo│││Thememachinename│star_wars│││Buildfront-endincontainer│Yes│││Storybookcomponentlibrary│No│││Coderepository│││Codeprovider│github│││Versionscheme│calver│││Environment│││Timezone│UTC│││Services│clamav,redis,solr│││Tools│behat,dclint,eslint,hadolint,jest,││││phpcs,phpstan,phpunit,rector,││││stylelint,twig_cs_fixer│││Hosting│││Hostingprovider│none│││Deployment│││Deploymenttypes│webhook│││Workflow│││Provisiontype│database│││Databasesource│url│││Migrationdatabase│No│││Notifications│││Channels│email│││ContinuousIntegration│││CIprovider│gha│││Visualregressiontesting│No│││SecretscanningwithGitleaks│Yes│││Automations│││Dependencyupdatesprovider│renovatebot_app│││Auto-mergedependencyupdates│php,drupal_core,js,││││container_images,ci_tools,││││github_actions│││Codecoverageprovider│none│││Auto-assignPRauthor│Yes│││Auto-addaCONFLICTlabeltoPRs│Yes│││Documentation││Documentation│││Preserveprojectdocumentation│Yes│││AI│││AIagentinstructions│Yes│││AIcodereview│No│││Locations│││Currentdirectory│/home/user/www/drevops/vortex2/.artifa││││cts/tmp/videos-workspace│││Destinationdirectory│/home/user/vortex/.artifa││││cts/tmp/videos-workspace/star_wars│││Vortexrepository│/home/user/vortex│││Vortexreference│HEAD││└──────────────────────────────────┴────────────────────────────────────────┘Vortexwillbeinstalledintoyourproject'sdirectory"/home/user/demo/star_wars"◆ProceedwithinstallingVortex?●Startingprojectinstallation◇DownloadingVortex│Downloadingfrom"/home/user/vortex"repositoryatref"HEAD"│✓Vortexdownloaded(develop)◇CustomizingVortexforyourproject│✓Vortexwascustomizedforyourproject◇Preparingdestinationdirectory│Createddirectory│"/home/user/demo/star_wars".│InitializinganewGitrepositoryindirectory│✓Destinationdirectoryisready◇Copyingfilestothedestinationdirectory│✓Filescopiedtodestinationdirectory◇Preparingdemocontent│Createddatadirectory│"/home/user/demo/star_wars/.│data".│Nodatabasedumpfilewasfoundin│data"directory.│Fetcheddemodatabasefrom│https://github.com/drevops/vortex/releases/download/1.40.0/db.demo.sql.│✓Democontentprepared│┌────────────────────────────────────────────────┐││FinishedinstallingVortex│││──────────────────────────│││Addandcommitallfiles:│││gitadd-A│││gitcommit-m"Initialcommit."││││││Files:401added│││Statusanddiffofeveryfilearerecordedin:│││.logs/vortex-install-2026-11-11-010448.md││└────────────────────────────────────────────────┘◆Runthesitebuildnow?││Readytobuild│││──────────────│││Buildthesite:│││ahoybuild│╚████╔╝╚██████╔╝██║██║██║╚████╔╝╚██████╔╝██║██║██║█││Youwillbeaskedafewquestionstotailorthec││Youwillbeaskedafewquestionstotailortheconfigu◇Pressanykeytocontinue...│starwars█│Wewilluse│Wewillusethisnameintheprojectan│We│Wewillu│S█│St█│Sta█│Star█│Star█│StarW█│StarWa█│StarWars█◇Sitemachinename(2/32)│star_wars█│Wewillusethisnamefortheprojectdirectoryandinthecode.│StarWarsOrg█│StarWar◇O│Wewill│○│◼Environmentin│◼Fast404│◼Generatedcontent│◼Navigationextratools│◼Pathauto│↓9more│Use⬆,⬇andSpacebartoselectoneormoremodules.│deployhooks)andte│Use⬆,⬇andSpace│Use⬆,⬇andSpacebartoselecto◆◆Customthememachinena│AddsStorybookpackagestothethemeandasteptoprovisioning.│○SemanticVersioning(SemVer)│major.minor.patch(E.g.,1.0.0)│https://semver.org│○Other│Customversioningschemeofyourchoice.│❯●CalendarVersioning(CalVer)│○SemanticVersioning(SemVer)│Use⬆and⬇toselectyourversionscheme.◇Services(18/35)│❯◼ClamAV│◼Solr│◼Redis│Use⬆,⬇andSpacebartoselectoneormoreservices.◇Developmenttools(19/35)│❯◼PHPCodeSniffer│◼PHPStan│◼Rector│◼ESLint│◼Stylelint│◼Jest│◼PHPUnit│◼Behat│◼TwigCSFixer│◼DCLint│↓1more│Use⬆,⬇andSpacebartoselectoneormoretools.◇Hostingprovider(20/35)│○AcquiaCloud│○Lagoon│Use⬆,⬇andSpacebartoselectyourhostingprovider.◇Customwebrootdirectory(21/35)│web█│Customdirectorywherethewebserverservesthesite.◇Deploymenttypes(22/35)│❯◻Codeartifact│◻Lagoonwebhook│◼Customwebhook│Use⬆,⬇andSpacebartoselectoneormoredeploymenttypes.│○│○Installfromprofile│Use⬆and⬇toselecttheprovisiontype.◇Databasesource(24/36)│❯●URLdownload│○FTPdownload│○Acquiabackup│○Lagoonenvironment│○Containerregistry│○S3bucket│Use⬆and⬇toselectthedatabasefetchsource.◇Useaseconddatabaseformigrations?(25/36)│AddsaseconddatabaseserviceforDrupalmigrations.◇Notificationchannels(26/36)│❯◼Email│◻GitHub│◻JIRA│◻NewRelic│◻Slack│◻Webhook│Use⬆,⬇andSpacebartoselectoneormorenotificationchannels.◇ContinuousIntegrationprovider(27/36)│❯●GitHubActions│○CircleCI│Use⬆and⬇toselecttheCIprovider.◇VisualregressiontestingwithDiffy?(28/36)│Diffy-poweredvisualregressionworkflowtocomparedeployedenvironments.│Automaticallytriggerscomparisonsfordependency-updatepullrequests│matchingtheconfiguredbranchpattern(`deps/*`bydefault).│Runscomparisonsforpullrequeststaggedwiththe`VR`labelandpostsa│stickycomment.│AlsosupportsmanualrunsagainstanyURL.│RequiresaDiffyaccount.◇ScanforcommittedsecretswithGitleaks?(29/36)│RunsinCItodetecthardcodedpasswords,APIkeysandtokens.◇Dependencyupdatesprovider(30/36)│❯●RenovateGitHubapp│○Renovateself-hostedinCI│Use⬆and⬇toselectthedependencyupdatesprovider.◇Auto-mergedependencyupdates(31/37)│Pullrequestsintheselectedgroupsaremergedassoonastheymeetthe│branchprotectionrules.Pullrequestsinothergroupsneedamanualmerge.│Requires"Allowauto-merge"intherepositorysettingsandatleastone│requiredstatuscheckonthebasebranch.│❯◼PHPpackages,exceptDrupalcore(minorandpatch)│◼Drupalcore(minorandpatch)│◼JavaScriptpackages(minorandpatch)│◼Containerimages(major,minorandpatch)│◼CItools(major,minorandpatch)│◼GitHubActions(major,minorandpatch)│Use⬆,⬇andSpacebartoselectoneormoregroups.◇Codecoverageprovider(32/37)│○Codecov│Use⬆and⬇toselectthecodecoverageprovider.◇Auto-assigntheauthortotheirPR?(33/37)│HelpstokeepthePRsorganized.◇Auto-addaCONFLICTlabeltoaPRwhenconflictsoccur?(34/37)│HelpstokeepquicklyidentifyPRsthatneedattention.◇Preserveprojectdocumentation?(35/37)│Helpstomaintaintheprojectdocumentationwithintherepository.◇ProvideAIagentinstructions?(36/37)│ProvidesAIcodingagentswithbettercontextabouttheproject.││Organizationname││Organizationname│││Starter│load││Starter│load_demod│││stage_file_proxy,│││stage_file_proxy,testmode│├────────────────────────────│├───────────────────────────────│├──────────────────────────────────┴────────────────────────────────────────│├──────────────────────────────────┬────────│├──────────────────────────────────┬──────────│├──────────────────────────────────┬───────────│├──────────────────────────────────┬──────────────││Visualregression││Visualregressiontesti││Auto-mergedependencyupdate││Auto-mergedependencyupdates│├──────────────────────────────────┬───────────────────────────│├──────────────────────────────────┬────────────────────────────││Currentdirectory│/home/user/ww││Currentdirectory│/home/user/www/drevop◇Preparin││.logs/vortex-install-2026-11-11-010448││.logs/vortex-install-2026-11-11-010448.md◇Runthesitebuildnow?│Takes~5-10min;outputwillbestreamed.Youcanskipandrunlaterwith:│ahoybuild││SetupGitHubAction││SetupGitHubActions:││SetupGitHubActions:│││https://www.vortextemplate.com/docs/continuous-integration/github-actio│││ns#onboarding│ \ No newline at end of file +──────────────────────────────────────────────────────────────────────────────██╗██╗██████╗██████╗████████╗███████╗██╗██╗██║██║██╔═══██╗██╔══██╗╚══██╔══╝██╔════╝╚██╗██╔╝██║██║██║██║██████╔╝██║█████╗╚███╔╝╚██╗██╔╝██║██║██╔══██╗██║██╔══╝██╔██╗╚████╔╝╚██████╔╝██║██║██║███████╗██╔╝██╗╚═══╝╚═════╝╚═╝╚═╝╚═╝╚══════╝╚═╝╚═╝DrupalprojecttemplatebyDrevOpsInstallerversion:development│┌───────────────────────────────────────────────────────────────────────────┐││WelcometotheVortexinteractiveinstaller│││───────────────────────────────────────────│││Thistoolwillguideyouthroughinstallingthelatestdevelopment│││versionofVortexintoyourproject.││││││Youwillbeaskedafewquestionstotailortheconfigurationtoyour│││site.│││Nochangeswillbemadeuntilyouconfirmeverythingattheend.│││PressCtrl+Catanytimetoexittheinstaller.│││PressCtrl+Uatanytimetogobacktothepreviousstep.││└───────────────────────────────────────────────────────────────────────────┘│◇Validatingrepositoryandreference│Checkingrepository"/home/user/vortex"andreference"HEAD"│✓Repositoryandreferencevalidatedsuccessfully┌Generalinformation◇Sitename(1/32)│Wewillusethisnameintheprojectanddocumentation.│star█│E.g.MySite█│Sta█│StarWar█◆Sitename(1/32)│StarWars◆Sitemachinename(2/32)│star_wars◇Organizationname(3/32)◇O│E.g.MyOrg█│E.g.MyO│Rebel█◆Organizationname(3/32)│Rebellion◆Organizationmachinename(4/32)│rebellion◆Publicdomain(5/32)│star-wars.com├Drupal◇Howwouldyoulikeyoursitetobecreatedonthefirstrun?(6/32)│Choosehowyoursitewillbecreatedthefirsttimeafterthisinstaller│finishes:│○Drupal,installedfromprofile│Createsanewsitebypopulatingafreshdatabase│fromoneofthestandardDrupalinstallationprofiles.◆Howwouldyoulikeyoursitetobecreatedonthefirstrun?(6/32)│Drupal,loadedfromthedemodatabase◆Profile(7/32)│Standard◇Modules(8/32)│❯◼Coffee│◼Configsplit│◼Configupdate│◼Devel│◼Diff│◼Drupalhelpers│◼Entityusage│◼Environmentindicator◆Modules(8/32)│Coffee,Configsplit,Configupdate,Devel,Diff,Drupalhelpers,Entity│usage,Environmentindicator,Fast404,Fieldgroup,Generatedcontent,Gin│admintheme,Linkit,Menutrailbypath,Metatag,Navigationextratools,│Pathauto,Redirect,Rerouteemail,Robots.txt,Scheduledtransitions,│Schema.orgMetatag,SDCDevel,Seckit,Shield,Stagefileproxy,Testmode,│Viewsbulkoperations,XMLSitemap◆Custommodulesprefix(9/32)│sw◇Custommodules(10/32)│Selectwhichcustommodulestoincludeinyourproject:│○Base│Startermodulewithdeployhooksandtestscaffoldingfor│Unit,Kernel,Functional,andFunctionalJavascripttests.│○Search│CustomSolrsearchintegrationmodule.RequirestheSolr│servicetobeselected.│○Demo│DemonstrateshowVortextoolingworks:includesacounter│blockwithCSS/JS,PHPUnitexampletestsacrossalltest│types,andaBehatfeature.Safetoremoveonrealprojects.│❯◼Base-startermodulewithutilitiesandtestscaffolding│◼Search-customSolrsearchintegration◆Custommodules(10/32)│Base-startermodulewithutilitiesandtestscaffolding,Search-custom│Solrsearchintegration,Demo-counterblockandexampleteststo│demonstratetooling◆Theme(11/32)│Custom(nextprompt)│││◇Customthememachinename(11.1)│◆Customthememachinename(11.1)││star_wars│◆Buildfront-endassetsinthecontainer?(11.2)││Yes│◇Storybookcomponentlibrary?(11.3)│Componentlibraryforthecustomtheme,renderedbyDrupalitself.│StoriesareauthoredinTwignexttoeachcomponent,sothelibraryshows│thesamemarkupthesiterenders.│◆Storybookcomponentlibrary?(11.3)│No├Coderepository◆Repositoryprovider(12/32)│GitHub◇Releaseversioningscheme(13/32)│Chooseyourversioningscheme:│○CalendarVersioning(CalVer)│year.month.patch(E.g.,24.1.0)│https://calver.org│○Other├Environment◆Timezone(14/32)│UTC◆Services(15/32)│ClamAV,Redis,Solr◆Developmenttools(16/32)│Behat,DCLint,ESLint,Hadolint,Jest,PHPCodeSniffer,PHPStan,PHPUnit,│Rector,Stylelint,TwigCSFixer├Hosting│❯●None◆Hostingprovider(17/32)│None◆Customwebrootdirectory(18/32)│web├Deployment◆Deploymenttypes(19/32)│Customwebhook├Workflow◇Provisiontype(20/32)│Provisioningsetsupthesiteinanenvironmentusinganalreadyassembled│codebase.│○Importfromdatabasedump│Provisionsthesitebyimportingadatabasedump│typicallycopiedfromproductionintolower│environments.│○Installfromprofile│ProvisionsthesitebyinstallingafreshDrupal│sitefromaprofileeverytimeanenvironmentis│created.│❯●Importfromdatabasedump◆Provisiontype(20/32)│Importfromdatabasedump│◆Databasesource(20.1)│URLdownload│○Yes/●No◆Useaseconddatabaseformigrations?(21/32)│No├Notifications◆Notificationchannels(22/32)│Email├ContinuousIntegration│○None◆ContinuousIntegrationprovider(23/32)│GitHubActions◆VisualregressiontestingwithDiffy?(24/32)│●Yes/○No◆ScanforcommittedsecretswithGitleaks?(25/32)│Yes├Automations◆Dependencyupdatesprovider(26/32)│RenovateGitHubapp│◇Auto-mergedependencyupdates(26.1)│Pullrequestsintheselectedgroupsaremergedassoonastheymeetthe│branchprotectionrules.Pullrequestsinothergroupsneedamanual│merge.│Requires"Allowauto-merge"intherepositorysettingsandatleastone│requiredstatuscheckonthebasebranch.│❯◼PHPpackages,exceptDrupalcore(minorandpatch)│◼Drupalcore(minorandpatch)│◼JavaScriptpackages(minorandpatch)│◼Containerimages(major,minorandpatch)│◆Auto-mergedependencyupdates(26.1)│PHPpackages,exceptDrupalcore(minorandpatch),Drupalcore(minorand│patch),JavaScriptpackages(minorandpatch),Containerimages(major,│minorandpatch),CItools(major,minorandpatch),GitHubActions│(major,minorandpatch)◆Codecoverageprovider(27/32)◆Auto-assigntheauthortotheirPR?(28/32)◆Auto-addaCONFLICTlabeltoaPRwhenconflictsoccur?(29/32)├Documentation◆Preserveprojectdocumentation?(30/32)├AI◆ProvideAIagentinstructions?(31/32)◆ConfigureAIcodereviewwithCodeRabbit?(32/32)●Installationsummary││Generalinformation││├──────────────────────────────────┬────────────────────────────────────────┤││Sitename│StarWars│││Sitemachinename│star_wars│││Organizationname│Rebellion│││Organizationmachinename│rebellion│││Publicdomain│star-wars.com││├──────────────────────────────────┴────────────────────────────────────────┤││Drupal│││Starter│load_demodb│││Modules│coffee,config_split,config_update,││││devel,diff,drupal_helpers,││││entity_usage,environment_indicator,││││fast_404,field_group,││││generated_content,gin,linkit,││││menu_trail_by_path,metatag,││││navigation_extra_tools,pathauto,││││redirect,reroute_email,robotstxt,││││scheduled_transitions,schema_metatag,││││sdc_devel,seckit,shield,││││stage_file_proxy,testmode,││││views_bulk_operations,xmlsitemap│││Webroot│web│││Profile│standard│││Moduleprefix│sw│││Custommodules│base,search,demo││Custommodules│base,search,demo│││Thememachinename│star_wars│││Buildfront-endincontainer│Yes│││Storybookcomponentlibrary│No│││Coderepository│││Codeprovider│github│││Versionscheme│calver│││Environment│││Timezone│UTC│││Services│clamav,redis,solr│││Tools│behat,dclint,eslint,hadolint,jest,││││phpcs,phpstan,phpunit,rector,││││stylelint,twig_cs_fixer│││Hosting│││Hostingprovider│none│││Deployment│││Deploymenttypes│webhook│││Workflow│││Provisiontype│database│││Databasesource│url│││Migrationdatabase│No│││Notifications│││Channels│email│││ContinuousIntegration│││CIprovider│gha│││Visualregressiontesting│No│││SecretscanningwithGitleaks│Yes│││Automations││Automations│││Dependencyupdatesprovider│renovatebot_app│││Auto-mergedependencyupdates│php,drupal_core,js,││││container_images,ci_tools,││││github_actions│││Codecoverageprovider│none│││Auto-assignPRauthor│Yes│││Auto-addaCONFLICTlabeltoPRs│Yes│││Documentation│││Preserveprojectdocumentation│Yes│││AI│││AIagentinstructions│Yes│││AIcodereview│No│││Locations│││Currentdirectory│/home/user/vortex/.artifa││││cts/tmp/videos-workspace│││Destinationdirectory│/home/user/vortex/.artifa││││cts/tmp/videos-workspace/star_wars│││Vortexrepository│/home/user/www/drevops/vortex2│││Vortexreference│HEAD││└──────────────────────────────────┴────────────────────────────────────────┘Vortexwillbeinstalledintoyourproject'sdirectory"/home/user/demo/star_wars"◆ProceedwithinstallingVortex?●Startingprojectinstallation◇DownloadingVortex│Downloadingfrom"/home/user/vortex"repositoryatref"HEAD"│✓Vortexdownloaded(develop)◇CustomizingVortexforyourproject│✓Vortexwascustomizedforyourproject◇Preparingdestinationdirectory│Createddirectory│"/home/user/demo/star_wars".│InitializinganewGitrepositoryindirectory│✓Destinationdirectoryisready◇Copyingfilestothedestinationdirectory│✓Filescopiedtodestinationdirectory◇Preparingdemocontent│Createddatadirectory│"/home/user/demo/star_wars/.│data".│Nodatabasedumpfilewasfoundin│data"directory.│Fetcheddemodatabasefrom│https://github.com/drevops/vortex/releases/download/1.40.0/db.demo.sql.│✓Democontentprepared│┌────────────────────────────────────────────────┐││FinishedinstallingVortex│││──────────────────────────│││Addandcommitallfiles:│││gitadd-A│││gitcommit-m"Initialcommit."││││││Files:402added│││Statusanddiffofeveryfilearerecordedin:│││.logs/vortex-install-2026-11-11-040935.md││└────────────────────────────────────────────────┘◆Runthesitebuildnow?││Readytobuild│││──────────────│││Buildthesite:│││ahoybuild│╚████╔╝╚██████╔╝██║██║██║╚████╔╝╚██████╔╝██║██║██║█││Youwillbeaskedafewquestionstotailorthec││Youwillbeaskedafewquestionstotailortheconfigu◇Pressanykeytocontinue...│starwars█│Wewilluse│Wewillusethisnameintheprojectan│We│Wewillu│S█│St█│Star█│Star█│StarW█│StarWa█│StarWars█◇Sitemachinename(2/32)│star_wars█│Wewillusethisnamefortheprojectdirectoryandinthecode.│StarWarsOrg█│StarWar│Wewilluseth◇Or◇Organizationmachinename◇Organizationmachinename(4/32)│rebellion█│Wewillusethisnameinthecode.│○Drupal│○DrupalCMS,installedfromprofile│fromtheDrupalCMSrecipe.│○Drupal,loadedfromthedemodatabase│Createsasitebyloadinganexistingdemodatabase│providedwiththeinstaller.│○Drupal,installedfromprofile│○DrupalCMS,installedfromprofile│❯●Drupal,loadedfromthedemodatabase│Use⬆and⬇.Appliesonlyonthefirstrunoftheinstaller.│◼│◼Fast404│◼Fieldgroup│↓19more│Use⬆,⬇andSpacebartoselectoneormoremodules.│◼Demo││star_wars█││Wewillusethisnameasacustomthemename│thesamemarkupthesite│Adevelopmentserverrunsondemandwith`ahoystorybook`.Astaticbuild│isproducedduringprovisioningandservedat`/storybook`inlocal,CI│anddevelopmentenvironments.│○Yes/●No│AddsStorybookpackagestothethemeandasteptoprovisioning.│○SemanticVersioning(SemVer)│major.minor.patch(E.g.,1.0.0)│https://semver.org│○Other│Customversioningschemeofyourchoice.│❯●CalendarVersioning(CalVer)│○SemanticVersioning(SemVer)│Use⬆and⬇toselectyourversionscheme.◆Releaseversioningscheme(13/32)│CalendarVersioning(CalVer)◇Services(15/32)│❯◼ClamAV│◼Solr│◼Redis│Use⬆,⬇andSpacebartoselectoneormoreservices.◇Developmenttools(16/32)│❯◼PHPCodeSniffer│◼PHPStan│◼Rector│◼ESLint│◼Stylelint│◼Jest│◼PHPUnit│◼Behat│◼TwigCSFixer│◼DCLint│↓1more│Use⬆,⬇andSpacebartoselectoneormoretools.◇Hostingprovider(17/32)│○AcquiaCloud│○Lagoon│Use⬆,⬇andSpacebartoselectyourhostingprovider.◇Customwebrootdirectory(18/32)│web█│Customdirectorywherethewebserverservesthesite.◇Deploymenttypes(19/32)│❯◻Codeartifact│◻Lagoonwebhook│◼Customwebhook│Use⬆,⬇andSpacebartoselectoneormoredeploymenttypes.│○│○Installfromprofile│Use⬆and⬇toselecttheprovisiontype.│◇Databasesource(20.1)│❯●URLdownload│○FTPdownload│○Acquiabackup│○Lagoonenvironment│○Containerregistry│○S3bucket│○None│Use⬆and⬇toselectthedatabasefetchsource.◇Useaseconddatabaseformigrations?(21/32)│AddsaseconddatabaseserviceforDrupalmigrations.◇Notificationchannels(22/32)│❯◼Email│◻GitHub│◻JIRA│◻NewRelic│◻Slack│◻Webhook│Use⬆,⬇andSpacebartoselectoneormorenotificationchannels.◇ContinuousIntegrationprovider(23/32)│❯●GitHubActions│○CircleCI│Use⬆and⬇toselecttheCIprovider.◇VisualregressiontestingwithDiffy?(24/32)│Diffy-poweredvisualregressionworkflowtocomparedeployedenvironments.│Automaticallytriggerscomparisonsfordependency-updatepullrequests│matchingtheconfiguredbranchpattern(`deps/*`bydefault).│Runscomparisonsforpullrequeststaggedwiththe`VR`labelandpostsa│stickycomment.│AlsosupportsmanualrunsagainstanyURL.│RequiresaDiffyaccount.◇ScanforcommittedsecretswithGitleaks?(25/32)│RunsinCItodetecthardcodedpasswords,APIkeysandtokens.◇Dependencyupdatesprovider(26/32)│❯●RenovateGitHubapp│○Renovateself-hostedinCI│Use⬆and⬇toselectthedependencyupdatesprovider.│◼CI│◼CItools(major,mi│◼CItools(major,minorandpatch)│◼GitHubActions(major,minorandpatch)│Use⬆,⬇andSpacebartoselectoneormoregroups.◇Codecoverageprovider(27/32)│○Codecov│Use⬆and⬇toselectthecodecoverageprovider.◇Auto-assigntheauthortotheirPR?(28/32)│HelpstokeepthePRsorganized.◇Auto-addaCONFLICTlabeltoaPRwhenconflictsoccur?(29/32)│HelpstokeepquicklyidentifyPRsthatneedattention.◇Preserveprojectdocumentation?(30/32)│Helpstomaintaintheprojectdocumentationwithintherepository.◇ProvideAIagentinstructions?(31/32)│ProvidesAIcodingagentswithbettercontextabouttheproject.◇ConfigureAIcodereviewwithCodeRabbit?(32/32)│RequirestheCodeRabbitappontherepository.││Organizationname││Organizationname│││Starter│load││Starter│load_demod│││redirect,reroute_│││redirect,reroute_email,r│├──────────────────────────────────┬──────│├──────────────────────────────────┬────────│├─│├───│├────│├───────││ContinuousInt││ContinuousIntegrati││Auto-assignPRauthor│││Auto-assignPRauthor│Yes│├────────────────────│├──────────────────────│├──────────────────────────────────┴───────────────────────────────│├──────────────────────────────────┴────────────────────────────────││Vortexrepository│/home/user/www/drevops/vorte││Vortexrepository│/home/user/www/drevops/vortex2◇Preparin││.logs/vortex-install-2026-11-11-040935││.logs/vortex-install-2026-11-11-040935.md◇Runthesitebuildnow?│Takes~5-10min;outputwillbestreamed.Youcanskipandrunlaterwith:│ahoybuild││SetupGitHubAction││SetupGitHubActions:││SetupGitHubActions:│││https://www.vortextemplate.com/docs/continuous-integration/github-actio│││ns#onboarding│ \ No newline at end of file From d6e4547a973d5dc0a6ef5fd5ef5e5ca7d3f98358 Mon Sep 17 00:00:00 2001 From: Alex Skrypnyk Date: Wed, 11 Nov 2026 17:05:07 +1100 Subject: [PATCH 12/14] Declared the installer prompt flow as 1 'Prompty::flow()' chain with each handler as a Prompty step. --- .vortex/installer/CLAUDE.md | 19 +- .vortex/installer/composer.lock | 8 +- .../src/Prompts/Handlers/AbstractHandler.php | 97 ++++ .../src/Prompts/Handlers/HandlerInterface.php | 15 +- .../installer/src/Prompts/PromptManager.php | 436 ++++-------------- .vortex/installer/src/Prompts/PromptType.php | 17 +- .../CustomModulesHandlerDiscoveryTest.php | 5 +- .../tests/Unit/Prompts/PromptTypeTest.php | 18 - 8 files changed, 217 insertions(+), 398 deletions(-) diff --git a/.vortex/installer/CLAUDE.md b/.vortex/installer/CLAUDE.md index e1c9974d24..e639f43d58 100644 --- a/.vortex/installer/CLAUDE.md +++ b/.vortex/installer/CLAUDE.md @@ -65,8 +65,8 @@ permission before running. Triggers that require re-recording: - New `Handlers/*.php` class or handler removal. - Wording change to `label()` or `hint()` of any existing handler. -- Adding, removing or reordering prompts inside `PromptManager::steps()`, - which also changes the step count in each label. +- Adding, removing or reordering prompts in the `PromptManager::runPrompts()` + chain, which also changes the step count in each label. ## Conditional Token System @@ -133,13 +133,14 @@ Content removed if feature not selected ### Ordering -`PromptManager::steps()` is the catalogue of prompts: it lists every prompt, -in order, under its section heading. `runPrompts()` runs them as 1 -`Prompty::flow()`, with each handler's `shouldRun()` as the step's -condition. Add a new prompt to `steps()`, and the step count follows -automatically. A prompt whose `shouldRun()` reads another prompt's answer -also goes in `PromptManager::children()` under that prompt, so it is asked -as a nested step. +`PromptManager::runPrompts()` declares the whole prompt flow as 1 +`Prompty::flow()` chain: each `->section()` heading, then its handlers in +order with `->add()`. A prompt whose `shouldRun()` reads another prompt's +answer goes between `->children()` and `->end()` under that prompt, so it is +asked as a nested step. The chain holds structure only: each handler is a +Prompty step, so its `shouldRun()` decides whether it is asked and its +label, options and default decide what it shows. Add a new prompt to the +chain, and the step count follows automatically. Processing runs in a different order, so each handler declares its own `processWeight()` - lowest first, broadly the reverse of the prompt order so diff --git a/.vortex/installer/composer.lock b/.vortex/installer/composer.lock index a17e3c926c..8b4f4ae3b9 100644 --- a/.vortex/installer/composer.lock +++ b/.vortex/installer/composer.lock @@ -82,12 +82,12 @@ "source": { "type": "git", "url": "https://github.com/AlexSkrypnyk/prompty.git", - "reference": "85fce83c74db8cdd6327cf636f6ed361d3c9ae23" + "reference": "2d752ef89f6264b8ad60d900f69fdf8113d59807" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/AlexSkrypnyk/prompty/zipball/85fce83c74db8cdd6327cf636f6ed361d3c9ae23", - "reference": "85fce83c74db8cdd6327cf636f6ed361d3c9ae23", + "url": "https://api.github.com/repos/AlexSkrypnyk/prompty/zipball/2d752ef89f6264b8ad60d900f69fdf8113d59807", + "reference": "2d752ef89f6264b8ad60d900f69fdf8113d59807", "shasum": "" }, "require": { @@ -166,7 +166,7 @@ "url": "https://www.patreon.com/alexskrypnyk" } ], - "time": "2026-11-11T03:26:24+00:00" + "time": "2026-11-11T05:49:04+00:00" }, { "name": "alexskrypnyk/str2name", diff --git a/.vortex/installer/src/Prompts/Handlers/AbstractHandler.php b/.vortex/installer/src/Prompts/Handlers/AbstractHandler.php index a5493c3a2b..e329d596b4 100644 --- a/.vortex/installer/src/Prompts/Handlers/AbstractHandler.php +++ b/.vortex/installer/src/Prompts/Handlers/AbstractHandler.php @@ -7,6 +7,7 @@ use DrevOps\VortexInstaller\Prompts\PromptType; use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\Converter; +use DrevOps\VortexInstaller\Utils\Tui; abstract class AbstractHandler implements HandlerInterface { @@ -37,6 +38,11 @@ abstract class AbstractHandler implements HandlerInterface { */ protected array $responses; + /** + * The answer supplied with the --prompts option. + */ + protected null|string|bool|array $override = NULL; + /** * Constructor. */ @@ -182,6 +188,97 @@ public function resolvedMessage(array $responses, mixed $resolved): ?string { return NULL; } + /** + * {@inheritdoc} + */ + public function setOverride(null|string|bool|array $override): static { + $this->override = $override; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function key(): string { + return static::id(); + } + + /** + * {@inheritdoc} + */ + public function widget(): string { + return $this->type()->value; + } + + /** + * {@inheritdoc} + */ + public function condition(array $results): bool { + return $this->shouldRun($results); + } + + /** + * {@inheritdoc} + */ + public function arguments(array $results): array { + $type = $this->type(); + $options = $this->options($results); + + $arguments = [ + 'label' => $this->label(), + 'help' => $this->hint($results), + 'placeholder' => $this->placeholder($results), + 'transform' => $this->transform(), + 'validate' => $this->validate(), + 'description' => static::description($results), + 'required' => $this->isRequired() ?: NULL, + 'options' => $options, + 'scroll' => is_array($options) ? 10 : NULL, + // A discovered list keeps the order the project already has it in. + 'order' => $type === PromptType::MultiSelect ? 'default' : NULL, + ]; + + // A value read from the destination answers the step without asking, and + // may name a profile or theme outside the options. + $resolved = $this->resolvedValue($results); + + if (is_string($resolved)) { + $message = $this->resolvedMessage($results, $resolved); + + if ($message) { + Tui::success($message); + } + + if (is_array($options) && !array_key_exists($resolved, $options)) { + $arguments['options'] = $options + [$resolved => $resolved]; + } + + $arguments['discovered'] = $resolved; + + return array_filter($arguments, fn(mixed $value): bool => $value !== NULL); + } + + $default = $this->override ?? $this->discover() ?? $this->default($results); + + // The widgets reject a default outside the options, so a default that no + // longer matches one is dropped and the widget starts from its first + // option. + if (is_array($options) && $type === PromptType::Select && (!is_string($default) || !array_key_exists($default, $options))) { + $default = NULL; + } + + if (is_array($options) && $type === PromptType::MultiSelect && is_array($default)) { + $default = array_values(array_filter($default, fn($value): bool => array_key_exists($value, $options))); + } + + if ($default !== NULL && $default !== '') { + $arguments['default'] = $default; + } + + return array_filter($arguments, fn(mixed $value): bool => $value !== NULL); + } + /** * {@inheritdoc} */ diff --git a/.vortex/installer/src/Prompts/Handlers/HandlerInterface.php b/.vortex/installer/src/Prompts/Handlers/HandlerInterface.php index 1c25b4651c..b50dccd964 100644 --- a/.vortex/installer/src/Prompts/Handlers/HandlerInterface.php +++ b/.vortex/installer/src/Prompts/Handlers/HandlerInterface.php @@ -4,12 +4,16 @@ namespace DrevOps\VortexInstaller\Prompts\Handlers; +use AlexSkrypnyk\Prompty\PromptyStepInterface; use DrevOps\VortexInstaller\Prompts\PromptType; /** * The interface for the prompt handlers. + * + * Each handler is a Prompty flow step: it decides whether it is asked and what + * its widget shows. */ -interface HandlerInterface { +interface HandlerInterface extends PromptyStepInterface { /** * Reserved dependency key for system-state conditions. @@ -201,6 +205,15 @@ public function resolvedValue(array $responses): null|string|bool|array; */ public function resolvedMessage(array $responses, mixed $resolved): ?string; + /** + * Set the answer supplied with the --prompts option. + * + * @param string|bool|array|null $override + * The supplied answer, which pre-fills the prompt ahead of discovery and + * the handler default. + */ + public function setOverride(null|string|bool|array $override): static; + /** * Set the responses. * diff --git a/.vortex/installer/src/Prompts/PromptManager.php b/.vortex/installer/src/Prompts/PromptManager.php index 9650d1fa39..a0d60e1939 100644 --- a/.vortex/installer/src/Prompts/PromptManager.php +++ b/.vortex/installer/src/Prompts/PromptManager.php @@ -68,9 +68,6 @@ class PromptManager { /** * Responses describing the destination as the handlers found it. - * - * Collected while the prompts run, so each value is the one discovery - * produced with the same preceding responses in context. */ protected array $discoveredResponses = []; @@ -81,15 +78,6 @@ class PromptManager { */ protected array $handlers = []; - /** - * Prompt overrides from --prompts CLI option. - * - * Keyed by handler ID with validated values. - * - * @var array - */ - protected array $promptOverrides = []; - /** * PromptManager constructor. * @@ -120,7 +108,84 @@ public function runPrompts(): bool { Tui::output()->setVerbosity(OutputInterface::VERBOSITY_QUIET); } - $responses = Prompty::flow($this->flowSteps(...), numbering: 'total', env_prefix: 'VORTEX_INSTALLER_PROMPT_'); + // Each handler decides whether its step is asked and what it shows, so + // the chain declares only the order, the sections and the nesting. + $h = $this->handlers; + + // phpcs:disable Drupal.WhiteSpace.ObjectOperatorIndent -- Indentation follows the nesting of the steps. + $responses = Prompty::flow() + ->section('General information') + ->add($h[Name::id()]) + ->add($h[MachineName::id()]) + ->add($h[Org::id()]) + ->add($h[OrgMachineName::id()]) + ->add($h[Domain::id()]) + ->section('Drupal') + ->add($h[Starter::id()]) + ->add($h[Profile::id()]) + ->children() + ->add($h[ProfileCustom::id()]) + ->end() + ->add($h[Modules::id()]) + ->add($h[ModulePrefix::id()]) + ->add($h[CustomModules::id()]) + ->add($h[Theme::id()]) + ->children() + ->add($h[ThemeCustom::id()]) + ->add($h[FrontendBuild::id()]) + ->add($h[Storybook::id()]) + ->end() + ->section('Code repository') + ->add($h[CodeProvider::id()]) + ->add($h[VersionScheme::id()]) + ->section('Environment') + ->add($h[Timezone::id()]) + ->add($h[Services::id()]) + ->add($h[Tools::id()]) + ->section('Hosting') + ->add($h[HostingProvider::id()]) + ->children() + ->add($h[HostingProjectName::id()]) + ->end() + ->add($h[Webroot::id()]) + ->section('Deployment') + ->add($h[DeployTypes::id()]) + ->section('Workflow') + ->add($h[ProvisionType::id()]) + ->children() + ->add($h[DatabaseFetchSource::id()]) + ->children() + ->add($h[DatabaseImage::id()]) + ->end() + ->end() + ->add($h[Migration::id()]) + ->children() + ->add($h[MigrationFetchSource::id()]) + ->children() + ->add($h[MigrationImage::id()]) + ->end() + ->end() + ->section('Notifications') + ->add($h[NotificationChannels::id()]) + ->section('Continuous Integration') + ->add($h[CiProvider::id()]) + ->add($h[VisualRegression::id()]) + ->add($h[Gitleaks::id()]) + ->section('Automations') + ->add($h[DependencyUpdatesProvider::id()]) + ->children() + ->add($h[DependencyUpdatesAutomerge::id()]) + ->end() + ->add($h[CodeCoverageProvider::id()]) + ->add($h[AssignAuthorPr::id()]) + ->add($h[LabelMergeConflictsPr::id()]) + ->section('Documentation') + ->add($h[PreserveDocsProject::id()]) + ->section('AI') + ->add($h[AiCodeInstructions::id()]) + ->add($h[AiCodeReview::id()]) + ->run(numbering: 'total', env_prefix: 'VORTEX_INSTALLER_PROMPT_'); + // phpcs:enable Drupal.WhiteSpace.ObjectOperatorIndent Tui::output()->setVerbosity($original_verbosity); @@ -129,198 +194,26 @@ public function runPrompts(): bool { return FALSE; } - // A step skipped by its condition is absent from the flow's answers. - $responses += array_fill_keys(array_keys(array_merge(...array_values($this->steps()))), NULL); - $this->responses = $this->normalizeResponses($responses); - // A conditional prompt this run skips never reaches args(), so its handler - // is asked directly. Otherwise the answer describing the destination would - // be replaced by the one describing this run. + // A value read from the destination describes the project as installed, + // so it replaces the answer this run collected. + $discovered = []; + foreach ($this->handlers as $id => $handler) { - if (!isset($this->discoveredResponses[$id])) { - $discovered = $handler->discover(); + $resolved = $handler->resolvedValue($responses); + $value = is_string($resolved) ? $resolved : $handler->discover(); - if ($discovered !== NULL) { - $this->discoveredResponses[$id] = $discovered; - } + if ($value !== NULL) { + $discovered[$id] = $value; } } - // Discovery covers only the handlers that read the destination, so the - // collected answers fill the rest. - $this->discoveredResponses = $this->normalizeResponses(array_replace($responses, $this->discoveredResponses)); + $this->discoveredResponses = $this->normalizeResponses(array_replace($responses, $discovered)); return TRUE; } - /** - * Build the flow from the prompt catalogue. - * - * Each step and its condition receive every earlier step's answer, with NULL - * for a step its condition skipped. - * - * @return array - * A section heading for each group, followed by its top-level steps keyed - * by handler ID. A step runs only when its handler's shouldRun() accepts - * the answers collected so far. - */ - protected function flowSteps(): array { - $builders = []; - $skipped = []; - $earlier = []; - - foreach ($this->steps() as $steps) { - foreach ($steps as $id => $step) { - $builders[$id] = $step; - $skipped[$id] = $earlier; - $earlier[$id] = NULL; - } - } - - $children = $this->children(); - $nested = array_merge(...array_values($children)); - - $flow = []; - - foreach ($this->steps() as $section => $steps) { - $flow[] = Prompty::section($section); - - foreach (array_keys($steps) as $id) { - if (!in_array($id, $nested, TRUE)) { - $flow[$id] = $this->flowStep($id, $builders, $skipped, $children); - } - } - } - - return $flow; - } - - /** - * Build a flow step and the steps nested under it. - * - * @param string $id - * The handler ID. - * @param array $builders - * Step builders keyed by handler ID. - * @param array> $skipped - * For each handler ID, the earlier step IDs with NULL values. - * @param array> $children - * Child handler IDs keyed by their parent handler ID. - * - * @return array - * The Prompty step. - */ - protected function flowStep(string $id, array $builders, array $skipped, array $children): array { - $step = $builders[$id]; - $earlier = $skipped[$id]; - - $nested = []; - foreach ($children[$id] ?? [] as $child_id) { - $nested[$child_id] = $this->flowStep($child_id, $builders, $skipped, $children); - } - - return Prompty::step(fn(array $r): mixed => $step($r + $earlier), condition: fn(array $r): bool => $this->handler($id)->shouldRun($r + $earlier), children: $nested); - } - - /** - * Define which prompts are asked under the answer they depend on. - * - * @return array> - * Child handler IDs keyed by the handler ID whose answer decides whether - * they are asked. - */ - protected function children(): array { - return [ - Profile::id() => [ProfileCustom::id()], - Theme::id() => [ThemeCustom::id(), FrontendBuild::id(), Storybook::id()], - HostingProvider::id() => [HostingProjectName::id()], - ProvisionType::id() => [DatabaseFetchSource::id()], - DatabaseFetchSource::id() => [DatabaseImage::id()], - Migration::id() => [MigrationFetchSource::id()], - MigrationFetchSource::id() => [MigrationImage::id()], - DependencyUpdatesProvider::id() => [DependencyUpdatesAutomerge::id()], - ]; - } - - /** - * Define the prompts in the order they are asked, grouped by section. - * - * @return array> - * Steps keyed by handler ID, grouped under their section heading. Each step - * receives the answers collected so far and returns the widget to ask. - */ - protected function steps(): array { - return [ - 'General information' => [ - Name::id() => fn(array $r): mixed => $this->prompt(Name::class), - MachineName::id() => fn(array $r): mixed => $this->prompt(MachineName::class, $r), - Org::id() => fn(array $r): mixed => $this->prompt(Org::class, $r), - OrgMachineName::id() => fn(array $r): mixed => $this->prompt(OrgMachineName::class, $r), - Domain::id() => fn(array $r): mixed => $this->prompt(Domain::class, $r), - ], - 'Drupal' => [ - Starter::id() => fn(array $r): mixed => $this->prompt(Starter::class, $r), - Profile::id() => fn(array $r): mixed => $this->resolveOrPrompt(Profile::id(), $r, fn(): mixed => $this->prompt(Profile::class)), - ProfileCustom::id() => fn(array $r): mixed => $this->prompt(ProfileCustom::class), - Modules::id() => fn(array $r): mixed => $this->prompt(Modules::class, $r), - ModulePrefix::id() => fn(array $r): mixed => $this->prompt(ModulePrefix::class, $r), - CustomModules::id() => fn(array $r): mixed => $this->prompt(CustomModules::class, $r), - Theme::id() => fn(array $r): mixed => $this->resolveOrPrompt(Theme::id(), $r, fn(): mixed => $this->prompt(Theme::class)), - ThemeCustom::id() => fn(array $r): mixed => $this->prompt(ThemeCustom::class, $r), - FrontendBuild::id() => fn(array $r): mixed => $this->prompt(FrontendBuild::class, $r), - Storybook::id() => fn(array $r): mixed => $this->prompt(Storybook::class, $r), - ], - 'Code repository' => [ - CodeProvider::id() => fn(array $r): mixed => $this->prompt(CodeProvider::class), - VersionScheme::id() => fn(array $r): mixed => $this->prompt(VersionScheme::class), - ], - 'Environment' => [ - Timezone::id() => fn(array $r): mixed => $this->prompt(Timezone::class), - Services::id() => fn(array $r): mixed => $this->prompt(Services::class), - Tools::id() => fn(array $r): mixed => $this->prompt(Tools::class), - ], - 'Hosting' => [ - HostingProvider::id() => fn(array $r): mixed => $this->prompt(HostingProvider::class), - HostingProjectName::id() => fn(array $r): mixed => $this->prompt(HostingProjectName::class, $r), - Webroot::id() => fn(array $r): mixed => $this->resolveOrPrompt(Webroot::id(), $r, fn(): mixed => $this->prompt(Webroot::class, $r)), - ], - 'Deployment' => [ - DeployTypes::id() => fn(array $r): mixed => $this->prompt(DeployTypes::class, $r), - ], - 'Workflow' => [ - ProvisionType::id() => fn(array $r): mixed => $this->prompt(ProvisionType::class), - DatabaseFetchSource::id() => fn(array $r): mixed => $this->prompt(DatabaseFetchSource::class, $r), - DatabaseImage::id() => fn(array $r): mixed => $this->prompt(DatabaseImage::class, $r), - Migration::id() => fn(array $r): mixed => $this->prompt(Migration::class), - MigrationFetchSource::id() => fn(array $r): mixed => $this->prompt(MigrationFetchSource::class, $r), - MigrationImage::id() => fn(array $r): mixed => $this->prompt(MigrationImage::class, $r), - ], - 'Notifications' => [ - NotificationChannels::id() => fn(array $r): mixed => $this->prompt(NotificationChannels::class), - ], - 'Continuous Integration' => [ - CiProvider::id() => fn(array $r): mixed => $this->prompt(CiProvider::class, $r), - VisualRegression::id() => fn(array $r): mixed => $this->prompt(VisualRegression::class), - Gitleaks::id() => fn(array $r): mixed => $this->prompt(Gitleaks::class), - ], - 'Automations' => [ - DependencyUpdatesProvider::id() => fn(array $r): mixed => $this->prompt(DependencyUpdatesProvider::class), - DependencyUpdatesAutomerge::id() => fn(array $r): mixed => $this->prompt(DependencyUpdatesAutomerge::class, $r), - CodeCoverageProvider::id() => fn(array $r): mixed => $this->prompt(CodeCoverageProvider::class), - AssignAuthorPr::id() => fn(array $r): mixed => $this->prompt(AssignAuthorPr::class), - LabelMergeConflictsPr::id() => fn(array $r): mixed => $this->prompt(LabelMergeConflictsPr::class), - ], - 'Documentation' => [ - PreserveDocsProject::id() => fn(array $r): mixed => $this->prompt(PreserveDocsProject::class), - ], - 'AI' => [ - AiCodeInstructions::id() => fn(array $r): mixed => $this->prompt(AiCodeInstructions::class), - AiCodeReview::id() => fn(array $r): mixed => $this->prompt(AiCodeReview::class), - ], - ]; - } - /** * Fold internal answers into the responses they qualify. * @@ -642,162 +535,9 @@ protected function resolvePromptOverrides(): void { foreach ($raw as $key => $value) { if (isset($this->handlers[$key])) { - $this->promptOverrides[$key] = $value; - } - } - } - - /** - * Dispatch a prompt using the handler's type enum. - * - * @param string $handler_class - * The handler class name. - * @param array $responses - * Current form responses for context-aware methods. - * - * @return mixed - * The widget call for the flow step. - */ - protected function prompt(string $handler_class, array $responses = []): mixed { - $fn = $this->handler($handler_class::id())->type()->promptFunction(); - - return $fn(...$this->args($handler_class, NULL, $responses)); - } - - /** - * Convert handler properties to Prompty widget arguments. - * - * Kept deliberately unoptimized to ease debugging and future changes. - * - * @param string $handler_class - * The handler class name. - * @param mixed $default_override - * Optional override for the default value (for response dependencies). - * @param array $responses - * Current form responses for context-aware methods. - * - * @return array - * Array of named arguments for the handler's Prompty widget. - */ - protected function args(string $handler_class, mixed $default_override = NULL, array $responses = []): array { - $id = $handler_class::id(); - $handler = $this->handler($id); - - $args = [ - 'label' => $handler->label(), - 'help' => $handler->hint($responses), - 'placeholder' => $handler->placeholder($responses), - 'transform' => $handler->transform(), - 'validate' => $handler->validate(), - 'description' => $handler::description($responses), - 'required' => $handler->isRequired() ?: NULL, - ]; - - $options = $handler->options($responses); - if (is_array($options)) { - $args['options'] = $options; - $args['scroll'] = 10; - } - - // A discovered list keeps the order the project already has it in. - if ($handler->type() === PromptType::MultiSelect) { - $args['order'] = 'default'; - } - - $default_from_handler = $handler->default($responses); - $default_from_prompts = $this->promptOverrides[$id] ?? NULL; - $default_from_discovery = $handler->discover(); - - if ($default_from_discovery !== NULL) { - $this->discoveredResponses[$id] = $default_from_discovery; - } - - if ($default_from_prompts !== NULL) { - $default = $default_from_prompts; - } - elseif ($default_from_discovery !== NULL) { - $default = $default_from_discovery; - } - elseif ($default_override !== NULL) { - $default = $default_override; - } - else { - $default = $default_from_handler; - } - - // The widgets reject a default outside the options, so a default that no - // longer matches one is dropped and the widget starts from its first - // option. - if (is_array($options) && $handler->type() === PromptType::Select && !array_key_exists((string) $default, $options)) { - $default = NULL; - } - - if (is_array($options) && $handler->type() === PromptType::MultiSelect && is_array($default)) { - $default = array_values(array_filter($default, fn($value): bool => array_key_exists($value, $options))); - } - - if ($default !== NULL && $default !== '') { - $args['default'] = $default; - } - - return array_filter($args, fn($value): bool => $value !== NULL); - } - - /** - * Resolve a value via handler or prompt the user. - * - * @param string $handler_id - * The handler ID. - * @param array $r - * Current form responses for context-aware methods. - * @param callable $prompt - * The prompt callable to use if the value is not resolved. - * - * @return mixed - * The widget call for the flow step. A resolved value answers the step - * without asking. - */ - protected function resolveOrPrompt(string $handler_id, array $r, callable $prompt): mixed { - $handler = $this->handler($handler_id); - $resolved = $handler->resolvedValue($r); - - if (is_string($resolved)) { - $message = $handler->resolvedMessage($r, $resolved); - - if ($message) { - Tui::success($message); + $this->handlers[$key]->setOverride($value); } - - // A resolved value is read from the destination, so it stands in for - // discovery for handlers that never reach a prompt. - $this->discoveredResponses[$handler_id] = $resolved; - - // A text widget accepts any value, including a name outside the - // handler's options. - return Prompty::text($handler->label(), discovered: $resolved); - } - - return $prompt(); - } - - /** - * Get a registered handler. - * - * @param string $id - * The handler ID. - * - * @return \DrevOps\VortexInstaller\Prompts\Handlers\HandlerInterface - * The handler instance. - * - * @throws \RuntimeException - * If no handler is registered for the ID. - */ - protected function handler(string $id): HandlerInterface { - if (!array_key_exists($id, $this->handlers)) { - throw new \RuntimeException(sprintf('Handler for "%s" not found.', $id)); } - - return $this->handlers[$id]; } } diff --git a/.vortex/installer/src/Prompts/PromptType.php b/.vortex/installer/src/Prompts/PromptType.php index 7d38332542..47a27b06dc 100644 --- a/.vortex/installer/src/Prompts/PromptType.php +++ b/.vortex/installer/src/Prompts/PromptType.php @@ -4,10 +4,8 @@ namespace DrevOps\VortexInstaller\Prompts; -use AlexSkrypnyk\Prompty\Prompty; - /** - * Prompt input types covering all Prompty widgets. + * Prompt input types, valued as the Prompty widget names. */ enum PromptType: string { @@ -21,17 +19,4 @@ enum PromptType: string { case Suggest = 'suggest'; - /** - * Get the Prompty widget for this type. - */ - public function promptFunction(): \Closure { - return match ($this) { - self::Text => Prompty::text(...), - self::Select => Prompty::select(...), - self::MultiSelect => Prompty::multiselect(...), - self::Confirm => Prompty::confirm(...), - self::Suggest => Prompty::suggest(...), - }; - } - } diff --git a/.vortex/installer/tests/Unit/Prompts/Handlers/CustomModulesHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Prompts/Handlers/CustomModulesHandlerDiscoveryTest.php index 06d492c55a..c828efb5a7 100644 --- a/.vortex/installer/tests/Unit/Prompts/Handlers/CustomModulesHandlerDiscoveryTest.php +++ b/.vortex/installer/tests/Unit/Prompts/Handlers/CustomModulesHandlerDiscoveryTest.php @@ -5,6 +5,7 @@ namespace DrevOps\VortexInstaller\Tests\Unit\Prompts\Handlers; use DrevOps\VortexInstaller\Prompts\Handlers\CustomModules; +use DrevOps\VortexInstaller\Prompts\Handlers\Services; use DrevOps\VortexInstaller\Utils\Config; use DrevOps\VortexInstaller\Utils\File; use PHPUnit\Framework\Attributes\CoversClass; @@ -31,7 +32,7 @@ function (AbstractHandlerDiscoveryTestCase $test, Config $config): void { ]; yield 'custom_modules - discovery - base only' => [ [], - [CustomModules::id() => [CustomModules::BASE]] + $expected_installed, + [CustomModules::id() => [CustomModules::BASE], Services::id() => [Services::CLAMAV, Services::REDIS]] + $expected_installed, function (AbstractHandlerDiscoveryTestCase $test, Config $config): void { $test->stubVortexProject($config); File::mkdir(static::$sut . '/web/modules/custom/mypr_base'); @@ -39,7 +40,7 @@ function (AbstractHandlerDiscoveryTestCase $test, Config $config): void { ]; yield 'custom_modules - discovery - base and demo' => [ [], - [CustomModules::id() => [CustomModules::BASE, CustomModules::DEMO]] + $expected_installed, + [CustomModules::id() => [CustomModules::BASE, CustomModules::DEMO], Services::id() => [Services::CLAMAV, Services::REDIS]] + $expected_installed, function (AbstractHandlerDiscoveryTestCase $test, Config $config): void { $test->stubVortexProject($config); File::mkdir(static::$sut . '/web/modules/custom/mypr_base'); diff --git a/.vortex/installer/tests/Unit/Prompts/PromptTypeTest.php b/.vortex/installer/tests/Unit/Prompts/PromptTypeTest.php index e3e038a859..9bd24ae5e0 100644 --- a/.vortex/installer/tests/Unit/Prompts/PromptTypeTest.php +++ b/.vortex/installer/tests/Unit/Prompts/PromptTypeTest.php @@ -4,7 +4,6 @@ namespace DrevOps\VortexInstaller\Tests\Unit\Prompts; -use AlexSkrypnyk\Prompty\Prompty; use DrevOps\VortexInstaller\Prompts\PromptType; use DrevOps\VortexInstaller\Tests\Unit\UnitTestCase; use PHPUnit\Framework\Attributes\CoversClass; @@ -16,23 +15,6 @@ #[CoversClass(PromptType::class)] class PromptTypeTest extends UnitTestCase { - #[DataProvider('dataProviderPromptFunctionResolvesToWidget')] - public function testPromptFunctionResolvesToWidget(PromptType $case): void { - $reflection = new \ReflectionFunction($case->promptFunction()); - - $this->assertSame(Prompty::class, $reflection->getClosureScopeClass()?->getName()); - $this->assertSame($case->value, $reflection->getName()); - } - - /** - * Data provider for testPromptFunctionResolvesToWidget. - */ - public static function dataProviderPromptFunctionResolvesToWidget(): \Iterator { - foreach (PromptType::cases() as $case) { - yield $case->name => [$case]; - } - } - #[DataProvider('dataProviderFromValidString')] public function testFromValidString(string $value, PromptType $expected): void { $this->assertSame($expected, PromptType::from($value)); From c979c6e5065e9fd8917208402a47a7de7b6c60ed Mon Sep 17 00:00:00 2001 From: Alex Skrypnyk Date: Wed, 11 Nov 2026 17:07:13 +1100 Subject: [PATCH 13/14] Updated snapshots. --- .../custom_modules_no_search/.ahoy.yml | 8 ++++ .../.docker/-solr.dockerfile | 0 .../config/solr/config-set/-accents_ar.txt | 0 .../config/solr/config-set/-accents_bg.txt | 0 .../config/solr/config-set/-accents_ca.txt | 0 .../config/solr/config-set/-accents_cs.txt | 0 .../config/solr/config-set/-accents_cy.txt | 0 .../config/solr/config-set/-accents_da.txt | 0 .../config/solr/config-set/-accents_de.txt | 0 .../config/solr/config-set/-accents_el.txt | 0 .../config/solr/config-set/-accents_en.txt | 0 .../config/solr/config-set/-accents_es.txt | 0 .../config/solr/config-set/-accents_et.txt | 0 .../config/solr/config-set/-accents_fa.txt | 0 .../config/solr/config-set/-accents_fi.txt | 0 .../config/solr/config-set/-accents_fr.txt | 0 .../config/solr/config-set/-accents_ga.txt | 0 .../config/solr/config-set/-accents_hi.txt | 0 .../config/solr/config-set/-accents_hr.txt | 0 .../config/solr/config-set/-accents_hu.txt | 0 .../config/solr/config-set/-accents_id.txt | 0 .../config/solr/config-set/-accents_it.txt | 0 .../config/solr/config-set/-accents_lv.txt | 0 .../config/solr/config-set/-accents_nb.txt | 0 .../config/solr/config-set/-accents_nl.txt | 0 .../config/solr/config-set/-accents_nn.txt | 0 .../config/solr/config-set/-accents_pl.txt | 0 .../config/solr/config-set/-accents_pt_br.txt | 0 .../config/solr/config-set/-accents_pt_pt.txt | 0 .../config/solr/config-set/-accents_ro.txt | 0 .../config/solr/config-set/-accents_ru.txt | 0 .../config/solr/config-set/-accents_sk.txt | 0 .../config/solr/config-set/-accents_sr.txt | 0 .../config/solr/config-set/-accents_sv.txt | 0 .../config/solr/config-set/-accents_th.txt | 0 .../config/solr/config-set/-accents_tr.txt | 0 .../config/solr/config-set/-accents_uk.txt | 0 .../config/solr/config-set/-accents_und.txt | 0 .../config/solr/config-set/-elevate.xml | 0 .../config/solr/config-set/-nouns_ar.txt | 0 .../config/solr/config-set/-nouns_bg.txt | 0 .../config/solr/config-set/-nouns_ca.txt | 0 .../config/solr/config-set/-nouns_cy.txt | 0 .../config/solr/config-set/-nouns_da.txt | 0 .../config/solr/config-set/-nouns_de.txt | 0 .../config/solr/config-set/-nouns_el.txt | 0 .../config/solr/config-set/-nouns_es.txt | 0 .../config/solr/config-set/-nouns_et.txt | 0 .../config/solr/config-set/-nouns_fa.txt | 0 .../config/solr/config-set/-nouns_fi.txt | 0 .../config/solr/config-set/-nouns_fr.txt | 0 .../config/solr/config-set/-nouns_hi.txt | 0 .../config/solr/config-set/-nouns_it.txt | 0 .../config/solr/config-set/-nouns_nb.txt | 0 .../config/solr/config-set/-nouns_nl.txt | 0 .../config/solr/config-set/-nouns_nn.txt | 0 .../config/solr/config-set/-nouns_pl.txt | 0 .../config/solr/config-set/-nouns_pt_br.txt | 0 .../config/solr/config-set/-nouns_pt_pt.txt | 0 .../config/solr/config-set/-nouns_ro.txt | 0 .../config/solr/config-set/-nouns_ru.txt | 0 .../config/solr/config-set/-nouns_sv.txt | 0 .../config/solr/config-set/-nouns_th.txt | 0 .../config/solr/config-set/-nouns_tr.txt | 0 .../config/solr/config-set/-nouns_uk.txt | 0 .../config/solr/config-set/-protwords_ar.txt | 0 .../config/solr/config-set/-protwords_bg.txt | 0 .../config/solr/config-set/-protwords_ca.txt | 0 .../config/solr/config-set/-protwords_cs.txt | 0 .../config/solr/config-set/-protwords_cy.txt | 0 .../config/solr/config-set/-protwords_da.txt | 0 .../config/solr/config-set/-protwords_de.txt | 0 .../config/solr/config-set/-protwords_el.txt | 0 .../config/solr/config-set/-protwords_en.txt | 0 .../config/solr/config-set/-protwords_es.txt | 0 .../config/solr/config-set/-protwords_et.txt | 0 .../config/solr/config-set/-protwords_fa.txt | 0 .../config/solr/config-set/-protwords_fi.txt | 0 .../config/solr/config-set/-protwords_fr.txt | 0 .../config/solr/config-set/-protwords_ga.txt | 0 .../config/solr/config-set/-protwords_hi.txt | 0 .../config/solr/config-set/-protwords_hr.txt | 0 .../config/solr/config-set/-protwords_hu.txt | 0 .../config/solr/config-set/-protwords_id.txt | 0 .../config/solr/config-set/-protwords_it.txt | 0 .../config/solr/config-set/-protwords_lv.txt | 0 .../config/solr/config-set/-protwords_nb.txt | 0 .../config/solr/config-set/-protwords_nl.txt | 0 .../config/solr/config-set/-protwords_nn.txt | 0 .../config/solr/config-set/-protwords_pl.txt | 0 .../solr/config-set/-protwords_pt_br.txt | 0 .../solr/config-set/-protwords_pt_pt.txt | 0 .../config/solr/config-set/-protwords_ro.txt | 0 .../config/solr/config-set/-protwords_ru.txt | 0 .../config/solr/config-set/-protwords_sk.txt | 0 .../config/solr/config-set/-protwords_sr.txt | 0 .../config/solr/config-set/-protwords_sv.txt | 0 .../config/solr/config-set/-protwords_th.txt | 0 .../config/solr/config-set/-protwords_tr.txt | 0 .../config/solr/config-set/-protwords_uk.txt | 0 .../config/solr/config-set/-protwords_und.txt | 0 .../config/solr/config-set/-schema.xml | 0 .../solr/config-set/-schema_extra_fields.xml | 0 .../solr/config-set/-schema_extra_types.xml | 0 .../config/solr/config-set/-solrconfig.xml | 0 .../solr/config-set/-solrconfig_extra.xml | 0 .../solr/config-set/-solrconfig_index.xml | 0 .../solr/config-set/-solrconfig_query.xml | 0 .../-solrconfig_requestdispatcher.xml | 0 .../solr/config-set/-solrcore.properties | 0 .../config/solr/config-set/-stoptags_ja.txt | 0 .../config/solr/config-set/-stopwords_ar.txt | 0 .../config/solr/config-set/-stopwords_bg.txt | 0 .../config/solr/config-set/-stopwords_ca.txt | 0 .../config/solr/config-set/-stopwords_cs.txt | 0 .../config/solr/config-set/-stopwords_cy.txt | 0 .../config/solr/config-set/-stopwords_da.txt | 0 .../config/solr/config-set/-stopwords_de.txt | 0 .../config/solr/config-set/-stopwords_el.txt | 0 .../config/solr/config-set/-stopwords_en.txt | 0 .../config/solr/config-set/-stopwords_es.txt | 0 .../config/solr/config-set/-stopwords_et.txt | 0 .../config/solr/config-set/-stopwords_fa.txt | 0 .../config/solr/config-set/-stopwords_fi.txt | 0 .../config/solr/config-set/-stopwords_fr.txt | 0 .../config/solr/config-set/-stopwords_ga.txt | 0 .../config/solr/config-set/-stopwords_hi.txt | 0 .../config/solr/config-set/-stopwords_hr.txt | 0 .../config/solr/config-set/-stopwords_hu.txt | 0 .../config/solr/config-set/-stopwords_id.txt | 0 .../config/solr/config-set/-stopwords_it.txt | 0 .../config/solr/config-set/-stopwords_ja.txt | 0 .../config/solr/config-set/-stopwords_ko.txt | 0 .../config/solr/config-set/-stopwords_lv.txt | 0 .../config/solr/config-set/-stopwords_nb.txt | 0 .../config/solr/config-set/-stopwords_nl.txt | 0 .../config/solr/config-set/-stopwords_nn.txt | 0 .../config/solr/config-set/-stopwords_pl.txt | 0 .../solr/config-set/-stopwords_pt_br.txt | 0 .../solr/config-set/-stopwords_pt_pt.txt | 0 .../config/solr/config-set/-stopwords_ro.txt | 0 .../config/solr/config-set/-stopwords_ru.txt | 0 .../config/solr/config-set/-stopwords_sk.txt | 0 .../config/solr/config-set/-stopwords_sr.txt | 0 .../config/solr/config-set/-stopwords_sv.txt | 0 .../config/solr/config-set/-stopwords_th.txt | 0 .../config/solr/config-set/-stopwords_tr.txt | 0 .../config/solr/config-set/-stopwords_uk.txt | 0 .../config/solr/config-set/-stopwords_und.txt | 0 .../config/solr/config-set/-synonyms_ar.txt | 0 .../config/solr/config-set/-synonyms_bg.txt | 0 .../config/solr/config-set/-synonyms_ca.txt | 0 .../config/solr/config-set/-synonyms_cs.txt | 0 .../config/solr/config-set/-synonyms_cy.txt | 0 .../config/solr/config-set/-synonyms_da.txt | 0 .../config/solr/config-set/-synonyms_de.txt | 0 .../config/solr/config-set/-synonyms_el.txt | 0 .../config/solr/config-set/-synonyms_en.txt | 0 .../config/solr/config-set/-synonyms_es.txt | 0 .../config/solr/config-set/-synonyms_et.txt | 0 .../config/solr/config-set/-synonyms_fa.txt | 0 .../config/solr/config-set/-synonyms_fi.txt | 0 .../config/solr/config-set/-synonyms_fr.txt | 0 .../config/solr/config-set/-synonyms_ga.txt | 0 .../config/solr/config-set/-synonyms_hi.txt | 0 .../config/solr/config-set/-synonyms_hr.txt | 0 .../config/solr/config-set/-synonyms_hu.txt | 0 .../config/solr/config-set/-synonyms_id.txt | 0 .../config/solr/config-set/-synonyms_it.txt | 0 .../config/solr/config-set/-synonyms_lv.txt | 0 .../config/solr/config-set/-synonyms_nb.txt | 0 .../config/solr/config-set/-synonyms_nl.txt | 0 .../config/solr/config-set/-synonyms_nn.txt | 0 .../config/solr/config-set/-synonyms_pl.txt | 0 .../solr/config-set/-synonyms_pt_br.txt | 0 .../solr/config-set/-synonyms_pt_pt.txt | 0 .../config/solr/config-set/-synonyms_ro.txt | 0 .../config/solr/config-set/-synonyms_ru.txt | 0 .../config/solr/config-set/-synonyms_sk.txt | 0 .../config/solr/config-set/-synonyms_sr.txt | 0 .../config/solr/config-set/-synonyms_sv.txt | 0 .../config/solr/config-set/-synonyms_th.txt | 0 .../config/solr/config-set/-synonyms_tr.txt | 0 .../config/solr/config-set/-synonyms_uk.txt | 0 .../config/solr/config-set/-synonyms_und.txt | 0 .../custom_modules_no_search/composer.json | 8 ++++ .../docker-compose.yml | 40 +++++++++++++++++++ .../scripts/-provision-30-search-index.sh | 0 .../provision-00-enable-demo-modules.sh | 19 +++++++-- .../custom_modules_none/.ahoy.yml | 8 ++++ .../.docker/-solr.dockerfile | 0 .../config/solr/config-set/-accents_ar.txt | 0 .../config/solr/config-set/-accents_bg.txt | 0 .../config/solr/config-set/-accents_ca.txt | 0 .../config/solr/config-set/-accents_cs.txt | 0 .../config/solr/config-set/-accents_cy.txt | 0 .../config/solr/config-set/-accents_da.txt | 0 .../config/solr/config-set/-accents_de.txt | 0 .../config/solr/config-set/-accents_el.txt | 0 .../config/solr/config-set/-accents_en.txt | 0 .../config/solr/config-set/-accents_es.txt | 0 .../config/solr/config-set/-accents_et.txt | 0 .../config/solr/config-set/-accents_fa.txt | 0 .../config/solr/config-set/-accents_fi.txt | 0 .../config/solr/config-set/-accents_fr.txt | 0 .../config/solr/config-set/-accents_ga.txt | 0 .../config/solr/config-set/-accents_hi.txt | 0 .../config/solr/config-set/-accents_hr.txt | 0 .../config/solr/config-set/-accents_hu.txt | 0 .../config/solr/config-set/-accents_id.txt | 0 .../config/solr/config-set/-accents_it.txt | 0 .../config/solr/config-set/-accents_lv.txt | 0 .../config/solr/config-set/-accents_nb.txt | 0 .../config/solr/config-set/-accents_nl.txt | 0 .../config/solr/config-set/-accents_nn.txt | 0 .../config/solr/config-set/-accents_pl.txt | 0 .../config/solr/config-set/-accents_pt_br.txt | 0 .../config/solr/config-set/-accents_pt_pt.txt | 0 .../config/solr/config-set/-accents_ro.txt | 0 .../config/solr/config-set/-accents_ru.txt | 0 .../config/solr/config-set/-accents_sk.txt | 0 .../config/solr/config-set/-accents_sr.txt | 0 .../config/solr/config-set/-accents_sv.txt | 0 .../config/solr/config-set/-accents_th.txt | 0 .../config/solr/config-set/-accents_tr.txt | 0 .../config/solr/config-set/-accents_uk.txt | 0 .../config/solr/config-set/-accents_und.txt | 0 .../config/solr/config-set/-elevate.xml | 0 .../config/solr/config-set/-nouns_ar.txt | 0 .../config/solr/config-set/-nouns_bg.txt | 0 .../config/solr/config-set/-nouns_ca.txt | 0 .../config/solr/config-set/-nouns_cy.txt | 0 .../config/solr/config-set/-nouns_da.txt | 0 .../config/solr/config-set/-nouns_de.txt | 0 .../config/solr/config-set/-nouns_el.txt | 0 .../config/solr/config-set/-nouns_es.txt | 0 .../config/solr/config-set/-nouns_et.txt | 0 .../config/solr/config-set/-nouns_fa.txt | 0 .../config/solr/config-set/-nouns_fi.txt | 0 .../config/solr/config-set/-nouns_fr.txt | 0 .../config/solr/config-set/-nouns_hi.txt | 0 .../config/solr/config-set/-nouns_it.txt | 0 .../config/solr/config-set/-nouns_nb.txt | 0 .../config/solr/config-set/-nouns_nl.txt | 0 .../config/solr/config-set/-nouns_nn.txt | 0 .../config/solr/config-set/-nouns_pl.txt | 0 .../config/solr/config-set/-nouns_pt_br.txt | 0 .../config/solr/config-set/-nouns_pt_pt.txt | 0 .../config/solr/config-set/-nouns_ro.txt | 0 .../config/solr/config-set/-nouns_ru.txt | 0 .../config/solr/config-set/-nouns_sv.txt | 0 .../config/solr/config-set/-nouns_th.txt | 0 .../config/solr/config-set/-nouns_tr.txt | 0 .../config/solr/config-set/-nouns_uk.txt | 0 .../config/solr/config-set/-protwords_ar.txt | 0 .../config/solr/config-set/-protwords_bg.txt | 0 .../config/solr/config-set/-protwords_ca.txt | 0 .../config/solr/config-set/-protwords_cs.txt | 0 .../config/solr/config-set/-protwords_cy.txt | 0 .../config/solr/config-set/-protwords_da.txt | 0 .../config/solr/config-set/-protwords_de.txt | 0 .../config/solr/config-set/-protwords_el.txt | 0 .../config/solr/config-set/-protwords_en.txt | 0 .../config/solr/config-set/-protwords_es.txt | 0 .../config/solr/config-set/-protwords_et.txt | 0 .../config/solr/config-set/-protwords_fa.txt | 0 .../config/solr/config-set/-protwords_fi.txt | 0 .../config/solr/config-set/-protwords_fr.txt | 0 .../config/solr/config-set/-protwords_ga.txt | 0 .../config/solr/config-set/-protwords_hi.txt | 0 .../config/solr/config-set/-protwords_hr.txt | 0 .../config/solr/config-set/-protwords_hu.txt | 0 .../config/solr/config-set/-protwords_id.txt | 0 .../config/solr/config-set/-protwords_it.txt | 0 .../config/solr/config-set/-protwords_lv.txt | 0 .../config/solr/config-set/-protwords_nb.txt | 0 .../config/solr/config-set/-protwords_nl.txt | 0 .../config/solr/config-set/-protwords_nn.txt | 0 .../config/solr/config-set/-protwords_pl.txt | 0 .../solr/config-set/-protwords_pt_br.txt | 0 .../solr/config-set/-protwords_pt_pt.txt | 0 .../config/solr/config-set/-protwords_ro.txt | 0 .../config/solr/config-set/-protwords_ru.txt | 0 .../config/solr/config-set/-protwords_sk.txt | 0 .../config/solr/config-set/-protwords_sr.txt | 0 .../config/solr/config-set/-protwords_sv.txt | 0 .../config/solr/config-set/-protwords_th.txt | 0 .../config/solr/config-set/-protwords_tr.txt | 0 .../config/solr/config-set/-protwords_uk.txt | 0 .../config/solr/config-set/-protwords_und.txt | 0 .../config/solr/config-set/-schema.xml | 0 .../solr/config-set/-schema_extra_fields.xml | 0 .../solr/config-set/-schema_extra_types.xml | 0 .../config/solr/config-set/-solrconfig.xml | 0 .../solr/config-set/-solrconfig_extra.xml | 0 .../solr/config-set/-solrconfig_index.xml | 0 .../solr/config-set/-solrconfig_query.xml | 0 .../-solrconfig_requestdispatcher.xml | 0 .../solr/config-set/-solrcore.properties | 0 .../config/solr/config-set/-stoptags_ja.txt | 0 .../config/solr/config-set/-stopwords_ar.txt | 0 .../config/solr/config-set/-stopwords_bg.txt | 0 .../config/solr/config-set/-stopwords_ca.txt | 0 .../config/solr/config-set/-stopwords_cs.txt | 0 .../config/solr/config-set/-stopwords_cy.txt | 0 .../config/solr/config-set/-stopwords_da.txt | 0 .../config/solr/config-set/-stopwords_de.txt | 0 .../config/solr/config-set/-stopwords_el.txt | 0 .../config/solr/config-set/-stopwords_en.txt | 0 .../config/solr/config-set/-stopwords_es.txt | 0 .../config/solr/config-set/-stopwords_et.txt | 0 .../config/solr/config-set/-stopwords_fa.txt | 0 .../config/solr/config-set/-stopwords_fi.txt | 0 .../config/solr/config-set/-stopwords_fr.txt | 0 .../config/solr/config-set/-stopwords_ga.txt | 0 .../config/solr/config-set/-stopwords_hi.txt | 0 .../config/solr/config-set/-stopwords_hr.txt | 0 .../config/solr/config-set/-stopwords_hu.txt | 0 .../config/solr/config-set/-stopwords_id.txt | 0 .../config/solr/config-set/-stopwords_it.txt | 0 .../config/solr/config-set/-stopwords_ja.txt | 0 .../config/solr/config-set/-stopwords_ko.txt | 0 .../config/solr/config-set/-stopwords_lv.txt | 0 .../config/solr/config-set/-stopwords_nb.txt | 0 .../config/solr/config-set/-stopwords_nl.txt | 0 .../config/solr/config-set/-stopwords_nn.txt | 0 .../config/solr/config-set/-stopwords_pl.txt | 0 .../solr/config-set/-stopwords_pt_br.txt | 0 .../solr/config-set/-stopwords_pt_pt.txt | 0 .../config/solr/config-set/-stopwords_ro.txt | 0 .../config/solr/config-set/-stopwords_ru.txt | 0 .../config/solr/config-set/-stopwords_sk.txt | 0 .../config/solr/config-set/-stopwords_sr.txt | 0 .../config/solr/config-set/-stopwords_sv.txt | 0 .../config/solr/config-set/-stopwords_th.txt | 0 .../config/solr/config-set/-stopwords_tr.txt | 0 .../config/solr/config-set/-stopwords_uk.txt | 0 .../config/solr/config-set/-stopwords_und.txt | 0 .../config/solr/config-set/-synonyms_ar.txt | 0 .../config/solr/config-set/-synonyms_bg.txt | 0 .../config/solr/config-set/-synonyms_ca.txt | 0 .../config/solr/config-set/-synonyms_cs.txt | 0 .../config/solr/config-set/-synonyms_cy.txt | 0 .../config/solr/config-set/-synonyms_da.txt | 0 .../config/solr/config-set/-synonyms_de.txt | 0 .../config/solr/config-set/-synonyms_el.txt | 0 .../config/solr/config-set/-synonyms_en.txt | 0 .../config/solr/config-set/-synonyms_es.txt | 0 .../config/solr/config-set/-synonyms_et.txt | 0 .../config/solr/config-set/-synonyms_fa.txt | 0 .../config/solr/config-set/-synonyms_fi.txt | 0 .../config/solr/config-set/-synonyms_fr.txt | 0 .../config/solr/config-set/-synonyms_ga.txt | 0 .../config/solr/config-set/-synonyms_hi.txt | 0 .../config/solr/config-set/-synonyms_hr.txt | 0 .../config/solr/config-set/-synonyms_hu.txt | 0 .../config/solr/config-set/-synonyms_id.txt | 0 .../config/solr/config-set/-synonyms_it.txt | 0 .../config/solr/config-set/-synonyms_lv.txt | 0 .../config/solr/config-set/-synonyms_nb.txt | 0 .../config/solr/config-set/-synonyms_nl.txt | 0 .../config/solr/config-set/-synonyms_nn.txt | 0 .../config/solr/config-set/-synonyms_pl.txt | 0 .../solr/config-set/-synonyms_pt_br.txt | 0 .../solr/config-set/-synonyms_pt_pt.txt | 0 .../config/solr/config-set/-synonyms_ro.txt | 0 .../config/solr/config-set/-synonyms_ru.txt | 0 .../config/solr/config-set/-synonyms_sk.txt | 0 .../config/solr/config-set/-synonyms_sr.txt | 0 .../config/solr/config-set/-synonyms_sv.txt | 0 .../config/solr/config-set/-synonyms_th.txt | 0 .../config/solr/config-set/-synonyms_tr.txt | 0 .../config/solr/config-set/-synonyms_uk.txt | 0 .../config/solr/config-set/-synonyms_und.txt | 0 .../custom_modules_none/composer.json | 8 ++++ .../custom_modules_none/docker-compose.yml | 40 +++++++++++++++++++ .../scripts/-provision-30-search-index.sh | 0 .../provision-00-enable-demo-modules.sh | 11 ++++- 378 files changed, 137 insertions(+), 5 deletions(-) create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.ahoy.yml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/-solr.dockerfile create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_ar.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_bg.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_ca.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_cs.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_cy.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_da.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_de.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_el.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_en.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_es.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_et.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_fa.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_fi.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_fr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_ga.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_hi.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_hr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_hu.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_id.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_it.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_lv.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_nb.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_nl.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_nn.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_pl.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_pt_br.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_pt_pt.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_ro.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_ru.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_sk.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_sr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_sv.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_th.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_tr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_uk.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_und.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-elevate.xml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_ar.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_bg.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_ca.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_cy.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_da.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_de.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_el.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_es.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_et.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_fa.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_fi.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_fr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_hi.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_it.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_nb.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_nl.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_nn.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_pl.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_pt_br.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_pt_pt.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_ro.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_ru.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_sv.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_th.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_tr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_uk.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_ar.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_bg.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_ca.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_cs.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_cy.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_da.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_de.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_el.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_en.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_es.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_et.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_fa.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_fi.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_fr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_ga.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_hi.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_hr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_hu.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_id.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_it.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_lv.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_nb.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_nl.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_nn.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_pl.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_pt_br.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_pt_pt.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_ro.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_ru.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_sk.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_sr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_sv.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_th.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_tr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_uk.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_und.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-schema.xml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-schema_extra_fields.xml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-schema_extra_types.xml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-solrconfig.xml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-solrconfig_extra.xml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-solrconfig_index.xml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-solrconfig_query.xml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-solrconfig_requestdispatcher.xml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-solrcore.properties create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stoptags_ja.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_ar.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_bg.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_ca.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_cs.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_cy.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_da.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_de.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_el.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_en.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_es.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_et.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_fa.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_fi.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_fr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_ga.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_hi.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_hr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_hu.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_id.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_it.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_ja.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_ko.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_lv.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_nb.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_nl.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_nn.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_pl.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_pt_br.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_pt_pt.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_ro.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_ru.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_sk.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_sr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_sv.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_th.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_tr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_uk.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_und.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_ar.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_bg.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_ca.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_cs.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_cy.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_da.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_de.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_el.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_en.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_es.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_et.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_fa.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_fi.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_fr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_ga.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_hi.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_hr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_hu.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_id.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_it.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_lv.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_nb.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_nl.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_nn.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_pl.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_pt_br.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_pt_pt.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_ro.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_ru.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_sk.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_sr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_sv.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_th.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_tr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_uk.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_und.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/composer.json create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/docker-compose.yml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/scripts/-provision-30-search-index.sh create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.ahoy.yml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/-solr.dockerfile create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_ar.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_bg.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_ca.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_cs.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_cy.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_da.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_de.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_el.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_en.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_es.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_et.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_fa.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_fi.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_fr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_ga.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_hi.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_hr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_hu.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_id.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_it.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_lv.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_nb.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_nl.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_nn.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_pl.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_pt_br.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_pt_pt.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_ro.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_ru.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_sk.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_sr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_sv.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_th.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_tr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_uk.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_und.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-elevate.xml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_ar.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_bg.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_ca.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_cy.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_da.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_de.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_el.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_es.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_et.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_fa.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_fi.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_fr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_hi.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_it.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_nb.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_nl.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_nn.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_pl.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_pt_br.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_pt_pt.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_ro.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_ru.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_sv.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_th.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_tr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_uk.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_ar.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_bg.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_ca.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_cs.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_cy.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_da.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_de.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_el.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_en.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_es.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_et.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_fa.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_fi.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_fr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_ga.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_hi.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_hr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_hu.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_id.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_it.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_lv.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_nb.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_nl.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_nn.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_pl.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_pt_br.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_pt_pt.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_ro.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_ru.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_sk.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_sr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_sv.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_th.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_tr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_uk.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_und.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-schema.xml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-schema_extra_fields.xml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-schema_extra_types.xml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-solrconfig.xml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-solrconfig_extra.xml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-solrconfig_index.xml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-solrconfig_query.xml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-solrconfig_requestdispatcher.xml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-solrcore.properties create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stoptags_ja.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_ar.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_bg.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_ca.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_cs.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_cy.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_da.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_de.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_el.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_en.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_es.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_et.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_fa.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_fi.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_fr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_ga.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_hi.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_hr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_hu.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_id.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_it.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_ja.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_ko.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_lv.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_nb.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_nl.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_nn.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_pl.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_pt_br.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_pt_pt.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_ro.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_ru.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_sk.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_sr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_sv.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_th.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_tr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_uk.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_und.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_ar.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_bg.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_ca.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_cs.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_cy.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_da.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_de.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_el.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_en.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_es.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_et.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_fa.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_fi.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_fr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_ga.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_hi.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_hr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_hu.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_id.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_it.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_lv.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_nb.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_nl.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_nn.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_pl.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_pt_br.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_pt_pt.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_ro.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_ru.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_sk.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_sr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_sv.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_th.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_tr.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_uk.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_und.txt create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/composer.json create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/docker-compose.yml create mode 100644 .vortex/installer/tests/Fixtures/handler_process/custom_modules_none/scripts/-provision-30-search-index.sh diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.ahoy.yml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.ahoy.yml new file mode 100644 index 0000000000..f13bb20aef --- /dev/null +++ b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.ahoy.yml @@ -0,0 +1,8 @@ +@@ -32,7 +32,6 @@ + cmd: | + export COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME:-${PWD##*/}} + export VORTEX_HOST_DB_PORT=$(docker compose port database 3306 2>/dev/null | cut -d : -f 2) +- export VORTEX_HOST_SOLR_PORT=$(docker compose port solr 8983 2>/dev/null | cut -d : -f 2) + export VORTEX_HOST_SELENIUM_VNC_PORT=$(docker compose port chrome 7900 2>/dev/null | cut -d : -f 2) + export VORTEX_HOST_HAS_SEQUELACE=$(uname -a | grep -i -q darwin && mdfind -name 'Sequel Ace' 2>/dev/null | grep -q "Ace" && echo 1 || true) + ahoy cli ./vendor/bin/vortex-info "$@" diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/-solr.dockerfile b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/-solr.dockerfile new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_ar.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_ar.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_bg.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_bg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_ca.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_ca.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_cs.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_cs.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_cy.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_cy.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_da.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_da.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_de.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_de.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_el.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_el.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_en.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_en.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_es.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_es.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_et.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_et.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_fa.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_fa.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_fi.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_fi.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_fr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_fr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_ga.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_ga.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_hi.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_hi.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_hr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_hr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_hu.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_hu.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_id.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_id.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_it.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_it.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_lv.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_lv.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_nb.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_nb.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_nl.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_nl.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_nn.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_nn.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_pl.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_pl.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_pt_br.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_pt_br.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_pt_pt.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_pt_pt.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_ro.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_ro.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_ru.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_ru.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_sk.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_sk.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_sr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_sr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_sv.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_sv.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_th.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_th.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_tr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_tr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_uk.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_uk.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_und.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-accents_und.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-elevate.xml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-elevate.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_ar.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_ar.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_bg.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_bg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_ca.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_ca.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_cy.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_cy.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_da.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_da.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_de.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_de.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_el.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_el.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_es.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_es.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_et.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_et.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_fa.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_fa.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_fi.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_fi.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_fr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_fr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_hi.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_hi.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_it.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_it.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_nb.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_nb.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_nl.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_nl.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_nn.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_nn.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_pl.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_pl.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_pt_br.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_pt_br.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_pt_pt.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_pt_pt.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_ro.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_ro.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_ru.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_ru.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_sv.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_sv.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_th.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_th.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_tr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_tr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_uk.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-nouns_uk.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_ar.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_ar.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_bg.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_bg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_ca.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_ca.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_cs.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_cs.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_cy.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_cy.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_da.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_da.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_de.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_de.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_el.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_el.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_en.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_en.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_es.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_es.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_et.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_et.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_fa.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_fa.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_fi.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_fi.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_fr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_fr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_ga.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_ga.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_hi.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_hi.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_hr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_hr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_hu.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_hu.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_id.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_id.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_it.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_it.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_lv.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_lv.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_nb.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_nb.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_nl.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_nl.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_nn.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_nn.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_pl.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_pl.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_pt_br.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_pt_br.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_pt_pt.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_pt_pt.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_ro.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_ro.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_ru.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_ru.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_sk.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_sk.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_sr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_sr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_sv.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_sv.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_th.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_th.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_tr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_tr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_uk.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_uk.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_und.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-protwords_und.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-schema.xml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-schema.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-schema_extra_fields.xml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-schema_extra_fields.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-schema_extra_types.xml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-schema_extra_types.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-solrconfig.xml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-solrconfig.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-solrconfig_extra.xml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-solrconfig_extra.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-solrconfig_index.xml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-solrconfig_index.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-solrconfig_query.xml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-solrconfig_query.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-solrconfig_requestdispatcher.xml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-solrconfig_requestdispatcher.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-solrcore.properties b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-solrcore.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stoptags_ja.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stoptags_ja.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_ar.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_ar.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_bg.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_bg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_ca.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_ca.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_cs.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_cs.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_cy.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_cy.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_da.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_da.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_de.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_de.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_el.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_el.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_en.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_en.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_es.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_es.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_et.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_et.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_fa.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_fa.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_fi.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_fi.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_fr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_fr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_ga.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_ga.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_hi.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_hi.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_hr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_hr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_hu.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_hu.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_id.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_id.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_it.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_it.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_ja.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_ja.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_ko.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_ko.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_lv.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_lv.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_nb.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_nb.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_nl.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_nl.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_nn.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_nn.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_pl.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_pl.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_pt_br.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_pt_br.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_pt_pt.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_pt_pt.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_ro.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_ro.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_ru.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_ru.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_sk.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_sk.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_sr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_sr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_sv.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_sv.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_th.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_th.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_tr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_tr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_uk.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_uk.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_und.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-stopwords_und.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_ar.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_ar.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_bg.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_bg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_ca.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_ca.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_cs.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_cs.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_cy.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_cy.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_da.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_da.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_de.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_de.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_el.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_el.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_en.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_en.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_es.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_es.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_et.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_et.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_fa.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_fa.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_fi.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_fi.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_fr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_fr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_ga.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_ga.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_hi.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_hi.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_hr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_hr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_hu.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_hu.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_id.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_id.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_it.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_it.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_lv.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_lv.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_nb.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_nb.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_nl.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_nl.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_nn.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_nn.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_pl.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_pl.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_pt_br.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_pt_br.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_pt_pt.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_pt_pt.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_ro.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_ro.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_ru.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_ru.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_sk.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_sk.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_sr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_sr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_sv.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_sv.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_th.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_th.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_tr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_tr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_uk.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_uk.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_und.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/.docker/config/solr/config-set/-synonyms_und.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/composer.json b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/composer.json new file mode 100644 index 0000000000..0e1663ac53 --- /dev/null +++ b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/composer.json @@ -0,0 +1,8 @@ +@@ -36,7 +36,6 @@ + "drupal/schema_metatag": "__VERSION__", + "drupal/sdc_devel": "__VERSION__", + "drupal/search_api": "__VERSION__", +- "drupal/search_api_solr": "__VERSION__", + "drupal/seckit": "__VERSION__", + "drupal/shield": "__VERSION__", + "drupal/stage_file_proxy": "__VERSION__", diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/docker-compose.yml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/docker-compose.yml new file mode 100644 index 0000000000..b3bc3a1726 --- /dev/null +++ b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/docker-compose.yml @@ -0,0 +1,40 @@ +@@ -158,17 +158,6 @@ + redis: + image: uselagoon/valkey-8:__VERSION__ + +- solr: +- build: +- context: . +- dockerfile: .docker/solr.dockerfile +- environment: +- <<: *default-environment +- volumes: +- - solr:/var/solr +- ports: +- - '8983' # Solr port in a container. Find port on host with `ahoy info` or `docker compose port solr 8983`. +- + clamav: + build: + context: . +@@ -199,13 +188,10 @@ + - clamav + - database + - redis +- - solr + command: + - clamav:3310 + - database:3306 + - redis:6379 +- - solr:8983 +- - curl -s "http://solr:8983/solr/drupal/select?q=*:*&rows=0&wt=json" | grep response + + networks: ### Use external networks locally. Automatically removed in CI. + amazeeio-network: ### Automatically removed in CI. +@@ -214,7 +200,6 @@ + volumes: + app: {} + files: {} +- solr: {} + + secrets: + package_token: diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/scripts/-provision-30-search-index.sh b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/scripts/-provision-30-search-index.sh new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/scripts/provision-00-enable-demo-modules.sh b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/scripts/provision-00-enable-demo-modules.sh index a24af01174..0eda6f28f1 100644 --- a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/scripts/provision-00-enable-demo-modules.sh +++ b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_no_search/scripts/provision-00-enable-demo-modules.sh @@ -1,9 +1,20 @@ -@@ -91,8 +91,6 @@ +@@ -80,10 +80,6 @@ + drush config:set clamav.settings mode_daemon_tcpip.hostname clamav + pass "Installed and configured ClamAV." + +-task "Installing Solr search modules." +-drush pm:install search_api search_api_solr +-pass "Installed Solr search modules." +- + # Enable custom site module and run its deployment hooks. + # + # Note that deployment hooks for already enabled modules have run in the +@@ -90,8 +86,6 @@ + # parent "vortex-provision" script. task "Installing custom site modules." drush pm:install sw_base - --drush pm:install sw_search - +-drush pm:install sw_search + drush pm:install sw_demo pass "Installed custom site modules." - diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.ahoy.yml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.ahoy.yml new file mode 100644 index 0000000000..f13bb20aef --- /dev/null +++ b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.ahoy.yml @@ -0,0 +1,8 @@ +@@ -32,7 +32,6 @@ + cmd: | + export COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME:-${PWD##*/}} + export VORTEX_HOST_DB_PORT=$(docker compose port database 3306 2>/dev/null | cut -d : -f 2) +- export VORTEX_HOST_SOLR_PORT=$(docker compose port solr 8983 2>/dev/null | cut -d : -f 2) + export VORTEX_HOST_SELENIUM_VNC_PORT=$(docker compose port chrome 7900 2>/dev/null | cut -d : -f 2) + export VORTEX_HOST_HAS_SEQUELACE=$(uname -a | grep -i -q darwin && mdfind -name 'Sequel Ace' 2>/dev/null | grep -q "Ace" && echo 1 || true) + ahoy cli ./vendor/bin/vortex-info "$@" diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/-solr.dockerfile b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/-solr.dockerfile new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_ar.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_ar.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_bg.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_bg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_ca.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_ca.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_cs.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_cs.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_cy.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_cy.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_da.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_da.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_de.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_de.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_el.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_el.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_en.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_en.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_es.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_es.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_et.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_et.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_fa.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_fa.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_fi.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_fi.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_fr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_fr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_ga.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_ga.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_hi.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_hi.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_hr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_hr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_hu.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_hu.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_id.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_id.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_it.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_it.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_lv.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_lv.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_nb.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_nb.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_nl.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_nl.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_nn.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_nn.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_pl.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_pl.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_pt_br.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_pt_br.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_pt_pt.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_pt_pt.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_ro.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_ro.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_ru.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_ru.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_sk.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_sk.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_sr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_sr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_sv.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_sv.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_th.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_th.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_tr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_tr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_uk.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_uk.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_und.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-accents_und.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-elevate.xml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-elevate.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_ar.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_ar.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_bg.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_bg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_ca.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_ca.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_cy.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_cy.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_da.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_da.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_de.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_de.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_el.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_el.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_es.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_es.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_et.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_et.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_fa.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_fa.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_fi.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_fi.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_fr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_fr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_hi.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_hi.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_it.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_it.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_nb.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_nb.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_nl.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_nl.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_nn.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_nn.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_pl.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_pl.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_pt_br.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_pt_br.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_pt_pt.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_pt_pt.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_ro.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_ro.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_ru.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_ru.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_sv.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_sv.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_th.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_th.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_tr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_tr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_uk.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-nouns_uk.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_ar.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_ar.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_bg.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_bg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_ca.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_ca.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_cs.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_cs.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_cy.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_cy.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_da.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_da.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_de.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_de.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_el.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_el.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_en.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_en.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_es.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_es.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_et.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_et.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_fa.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_fa.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_fi.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_fi.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_fr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_fr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_ga.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_ga.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_hi.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_hi.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_hr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_hr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_hu.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_hu.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_id.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_id.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_it.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_it.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_lv.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_lv.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_nb.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_nb.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_nl.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_nl.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_nn.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_nn.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_pl.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_pl.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_pt_br.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_pt_br.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_pt_pt.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_pt_pt.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_ro.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_ro.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_ru.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_ru.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_sk.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_sk.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_sr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_sr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_sv.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_sv.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_th.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_th.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_tr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_tr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_uk.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_uk.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_und.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-protwords_und.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-schema.xml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-schema.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-schema_extra_fields.xml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-schema_extra_fields.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-schema_extra_types.xml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-schema_extra_types.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-solrconfig.xml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-solrconfig.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-solrconfig_extra.xml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-solrconfig_extra.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-solrconfig_index.xml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-solrconfig_index.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-solrconfig_query.xml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-solrconfig_query.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-solrconfig_requestdispatcher.xml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-solrconfig_requestdispatcher.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-solrcore.properties b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-solrcore.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stoptags_ja.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stoptags_ja.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_ar.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_ar.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_bg.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_bg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_ca.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_ca.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_cs.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_cs.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_cy.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_cy.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_da.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_da.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_de.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_de.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_el.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_el.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_en.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_en.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_es.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_es.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_et.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_et.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_fa.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_fa.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_fi.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_fi.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_fr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_fr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_ga.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_ga.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_hi.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_hi.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_hr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_hr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_hu.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_hu.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_id.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_id.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_it.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_it.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_ja.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_ja.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_ko.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_ko.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_lv.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_lv.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_nb.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_nb.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_nl.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_nl.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_nn.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_nn.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_pl.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_pl.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_pt_br.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_pt_br.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_pt_pt.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_pt_pt.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_ro.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_ro.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_ru.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_ru.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_sk.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_sk.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_sr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_sr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_sv.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_sv.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_th.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_th.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_tr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_tr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_uk.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_uk.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_und.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-stopwords_und.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_ar.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_ar.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_bg.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_bg.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_ca.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_ca.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_cs.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_cs.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_cy.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_cy.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_da.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_da.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_de.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_de.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_el.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_el.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_en.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_en.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_es.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_es.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_et.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_et.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_fa.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_fa.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_fi.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_fi.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_fr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_fr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_ga.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_ga.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_hi.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_hi.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_hr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_hr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_hu.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_hu.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_id.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_id.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_it.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_it.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_lv.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_lv.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_nb.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_nb.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_nl.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_nl.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_nn.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_nn.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_pl.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_pl.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_pt_br.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_pt_br.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_pt_pt.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_pt_pt.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_ro.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_ro.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_ru.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_ru.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_sk.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_sk.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_sr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_sr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_sv.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_sv.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_th.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_th.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_tr.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_tr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_uk.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_uk.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_und.txt b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/.docker/config/solr/config-set/-synonyms_und.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/composer.json b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/composer.json new file mode 100644 index 0000000000..0e1663ac53 --- /dev/null +++ b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/composer.json @@ -0,0 +1,8 @@ +@@ -36,7 +36,6 @@ + "drupal/schema_metatag": "__VERSION__", + "drupal/sdc_devel": "__VERSION__", + "drupal/search_api": "__VERSION__", +- "drupal/search_api_solr": "__VERSION__", + "drupal/seckit": "__VERSION__", + "drupal/shield": "__VERSION__", + "drupal/stage_file_proxy": "__VERSION__", diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/docker-compose.yml b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/docker-compose.yml new file mode 100644 index 0000000000..b3bc3a1726 --- /dev/null +++ b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/docker-compose.yml @@ -0,0 +1,40 @@ +@@ -158,17 +158,6 @@ + redis: + image: uselagoon/valkey-8:__VERSION__ + +- solr: +- build: +- context: . +- dockerfile: .docker/solr.dockerfile +- environment: +- <<: *default-environment +- volumes: +- - solr:/var/solr +- ports: +- - '8983' # Solr port in a container. Find port on host with `ahoy info` or `docker compose port solr 8983`. +- + clamav: + build: + context: . +@@ -199,13 +188,10 @@ + - clamav + - database + - redis +- - solr + command: + - clamav:3310 + - database:3306 + - redis:6379 +- - solr:8983 +- - curl -s "http://solr:8983/solr/drupal/select?q=*:*&rows=0&wt=json" | grep response + + networks: ### Use external networks locally. Automatically removed in CI. + amazeeio-network: ### Automatically removed in CI. +@@ -214,7 +200,6 @@ + volumes: + app: {} + files: {} +- solr: {} + + secrets: + package_token: diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/scripts/-provision-30-search-index.sh b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/scripts/-provision-30-search-index.sh new file mode 100644 index 0000000000..e69de29bb2 diff --git a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/scripts/provision-00-enable-demo-modules.sh b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/scripts/provision-00-enable-demo-modules.sh index 907c132c57..55f5270368 100644 --- a/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/scripts/provision-00-enable-demo-modules.sh +++ b/.vortex/installer/tests/Fixtures/handler_process/custom_modules_none/scripts/provision-00-enable-demo-modules.sh @@ -16,7 +16,16 @@ task "Setting site name." drush php:eval "\Drupal::service('config.factory')->getEditable('system.site')->set('name', 'star wars')->save();" pass "Set site name." -@@ -89,11 +78,7 @@ +@@ -80,20 +69,12 @@ + drush config:set clamav.settings mode_daemon_tcpip.hostname clamav + pass "Installed and configured ClamAV." + +-task "Installing Solr search modules." +-drush pm:install search_api search_api_solr +-pass "Installed Solr search modules." +- + # Enable custom site module and run its deployment hooks. + # # Note that deployment hooks for already enabled modules have run in the # parent "vortex-provision" script. task "Installing custom site modules." From 8347b7c29fe726395e75df8d98890412641767de Mon Sep 17 00:00:00 2001 From: Alex Skrypnyk Date: Wed, 11 Nov 2026 17:08:47 +1100 Subject: [PATCH 14/14] Re-recorded the installer video with the 'Prompty::flow()' chain. --- .vortex/docs/static/img/installer.json | 391 ++++++++++++------------- .vortex/docs/static/img/installer.svg | 2 +- 2 files changed, 194 insertions(+), 199 deletions(-) diff --git a/.vortex/docs/static/img/installer.json b/.vortex/docs/static/img/installer.json index 0cd14b2068..8e45399c11 100644 --- a/.vortex/docs/static/img/installer.json +++ b/.vortex/docs/static/img/installer.json @@ -1,198 +1,193 @@ -{"version":2,"width":80,"height":27,"timestamp":1794370130,"command":"/home/user/demo/installer.exp","title":"Vortex Installer Demo","env":{"SHELL":"/opt/homebrew/opt/bash/bin/bash"}} -[0.572558, "o", "\u001b[36m──────────────────────────────────────────────────────────────────────────────\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m ██╗ ██╗ ██████╗ ██████╗ ████████╗ ███████╗ ██╗ ██╗\u001b[39m\r\r\n\u001b[36m ██║ ██║ ██╔═══██╗ ██╔══██╗ ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝\u001b[39m\r\r\n\u001b[36m ██║ ██║ ██║ ██║ ██████╔╝ ██║ █████╗ ╚███╔╝\u001b[39m\r\r\n\u001b[36m ╚██╗ ██╔╝ ██║ ██║ ██╔══██╗ ██║ ██╔══╝ ██╔██╗\u001b[39m\r\r\n\u001b[36m ╚████╔╝ ╚██████╔╝ ██║ ██║ ██║ "] -[0.572569, "o", " █"] -[0.572647, "o", "██████╗ ██╔╝ ██╗\u001b[39m\r\r\n\u001b[36m ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝ ╚═╝ ╚═╝\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m Drupal project template\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m by DrevOps\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m──────────────────────────────────────────────────────────────────────────────\u001b[39m\r\r\n\u001b[2m Installer version: development\u001b[22m\r\r\n"] -[0.573964, "o", "\u001b[90m│\u001b[0m \u001b[90m┌───────────────────────────────────────────────────────────────────────────┐\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mWelcome to the Vortex interactive installer\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m───────────────────────────────────────────\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m This tool will guide you through installing the latest \u001b[4mdevelopment\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m version of Vortex into your project. \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m You will be asked a few questions to tailor the c"] -[0.574011, "o", "onfigu"] -[0.574051, "o", "ration to your \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m site. \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m No changes will be made until you confirm everything at the end. \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Press \u001b[33mCtrl+C\u001b[39m at any time to exit the installer.\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Press \u001b[33mCtrl+U\u001b[39m at any time to go back to the previous step.\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m└───────────────────────────────────────────────────────────────────────────┘\u001b[0m\r\r\n\u001b[90m│\u001b"] -[0.574077, "o", "[0m\r\r\n"] -[0.574699, "o", "\u001b[36m◇\u001b[0m Validating repository and reference\r\r\n"] -[0.580922, "o", "\u001b[90m│\u001b[0m \u001b[2mChecking repository \"/home/user/vortex\" and reference \"HEAD\"\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Repository and reference validated successfully\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[0.598426, "o", "\u001b[?25l"] -[0.598487, "o", "\u001b[36m◇\u001b[0m Press any key to continue...\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[3.599062, "o", "\u001b[2A\r\u001b[J"] -[3.607435, "o", "\u001b[?25h"] -[3.625752, "o", "\u001b[?25l"] -[3.62576, "o", "\r\r\n\u001b[90m┌\u001b[0m \u001b[1mGeneral information\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[3.626209, "o", "\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[3.781591, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar war\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar wa\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar w\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar \u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use"] -[3.781647, "o", " this name in the project an"] -[5.075415, "o", "d documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37msta\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mst\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37ms\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] -[5.075422, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe "] -[5.0755, "o", "will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.078222, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r"] -[6.078231, "o", "\r\n\u001b[90m│\u001b[0m \u001b[2mWe will u"] -[6.07832, "o", "se this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.078421, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.078533, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.078626, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.078726, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.078833, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.078926, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.079019, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.079121, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.07922, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.079323, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.079412, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.079508, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.079615, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.079736, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.079832, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.079935, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.07999, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.080105, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.080272, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.080355, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.080495, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.08054, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.080702, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.080804, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.080894, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.080991, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.08109, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.081201, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.081271, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.081412, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.081475, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.081582, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.081677, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.081784, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.081895, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.082011, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mS\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.082121, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mSt\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.082216, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mSta\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.082307, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.082402, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar \u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.082501, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar W\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.082623, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wa\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.082682, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar War\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.082831, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.082934, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Site name (1/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mStar Wars\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[6.083309, "o", "\u001b[36m◇\u001b[0m Site machine name \u001b[2m(2/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar_wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name for the project directory and in the code.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[7.083742, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Site machine name (2/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mstar_wars\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[7.083999, "o", "\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[7.234605, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars Or\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars O\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars \u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar War\u001b[0"] -[7.234618, "o", "m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0"] -[8.086723, "o", "m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wa\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar W\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar \u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m O"] -[8.086748, "o", "rganization name \u001b[2m(3/32)"] -[8.086828, "o", "\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mSta\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[9.090803, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mSt\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mS\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r"] -[9.090811, "o", "\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0"] -[9.090957, "o", "m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[10.098977, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] -[10.102382, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] -[10.102569, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b["] -[10.104128, "o", "0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m O"] -[11.107729, "o", "rganization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b["] -[11.107815, "o", "90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b"] -[11.107952, "o", "[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[12.112257, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] -[12.112263, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] -[12.112371, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[13.116517, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] -[13.116562, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] -[13.116657, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[14.116896, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] -[14.116904, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] -[14.117056, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[15.117645, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] -[15.117653, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] -[15.117752, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[16.118161, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mR\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRe\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mReb\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebe\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebel\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90"] -[16.118169, "o", "m│\u001b[0m \u001b[2mWe will use th"] -[16.118315, "o", "is name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[17.118904, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebell\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebelli\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebellio\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebellion\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Organization name (3/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mRebellion\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Or"] -[17.118911, "o", "ganization machine name \u001b[2"] -[17.119059, "o", "m(4/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mrebellion\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the code.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[18.124014, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Organization machine name (4/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mrebellion\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Public domain \u001b[2m(5/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar-wars.com\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mDomain name without protocol and trailing slash.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Public domain (5/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mstar-wars.com\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mDrupal\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m How would you like your site to be created on the first run? \u001b[2m(6/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mChoose how your site will be created the first time after this installer\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mfinishes:\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mDrupal, installed from profile\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Creates a new site by \u001b[4mpopulating a fresh database\u001b[0m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m from one of the standard Drupal installation profiles.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b["] -[18.124036, "o", "2;3m ○ \u001b[1mDrupal"] -[18.124135, "o", " CMS, installed from profile\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Creates a new site by \u001b[4mpopulating a fresh database\u001b[0m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m from the Drupal CMS recipe.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mDrupal, loaded from the demo database\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Creates a site by \u001b[4mloading an existing demo database\u001b[0m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m provided with the installer.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mDrupal, installed from profile\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mDrupal CMS, installed from profile\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Drupal, loaded from the demo database\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇. Applies only on the first run of the installer.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[19.127962, "o", "\u001b[22A\r\u001b[J\u001b[36m◆\u001b[0m How would you like your site to be created on the first run? (6/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mDrupal, loaded from the demo database\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Profile \u001b[2m(7/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Standard\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mMinimal\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mDemo Umami\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mCustom (next prompt)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select which Drupal profile to use.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[9A\r\u001b[J\u001b[36m◆\u001b[0m Profile (7/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mStandard\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Modules \u001b[2m(8/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m Coffee\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Config split\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Config update\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Devel\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Diff\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Drupal helpers\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Entity usage\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Environment indicator\r\r\n"] -[19.128008, "o", "\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m"] -[19.128077, "o", " Fast 404\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Field group\r\r\n\u001b[90m│\u001b[0m \u001b[2m↓ 19 more\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more modules.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[20.133044, "o", "\u001b[17A\r\u001b[J\u001b[36m◆\u001b[0m Modules (8/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mCoffee, Config split, Config update, Devel, Diff, Drupal helpers, Entity\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2musage, Environment indicator, Fast 404, Field group, Generated content, Gin\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2madmin theme, Linkit, Menu trail by path, Metatag, Navigation extra tools,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mPathauto, Redirect, Reroute email, Robots.txt, Scheduled transitions,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mSchema.org Metatag, SDC Devel, Seckit, Shield, Stage file proxy, Testmode,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mViews bulk operations, XML Sitemap\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Custom modules prefix \u001b[2m(9/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37msw\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in custom modules\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Custom modules prefix (9/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2msw\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Custom modules \u001b[2m(10/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mSelect which custom modules to include in your project:\u001b[0"] -[20.133053, "o", "m\r\r\n\u001b[90m│\u001b[0m \u001b"] -[20.133189, "o", "[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mBase\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Starter module with deploy hooks and test scaffolding for\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Unit, Kernel, Functional, and FunctionalJavascript tests.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mSearch\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Custom Solr search integration module. Requires the Solr\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m service to be selected.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mDemo\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Demonstrates how Vortex tooling works: includes a counter\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m block with CSS/JS, PHPUnit example tests across all test\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m types, and a Behat feature. Safe to remove on real projects.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m Base - starter module with utilities and test scaffolding\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Search - custom Solr search integration\r\r\n\u001b[90m│\u001b[0m \u001b"] -[20.133222, "o", "[32m◼\u001b[0m Demo"] -[21.134199, "o", " - counter block and example tests to demonstrate tooling\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more modules.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[22A\r\u001b[J\u001b[36m◆\u001b[0m Custom modules (10/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mBase - starter module with utilities and test scaffolding, Search - custom\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mSolr search integration, Demo - counter block and example tests to\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mdemonstrate tooling\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Theme \u001b[2m(11/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mOlivero\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mClaro\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mStark\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Custom (next prompt)\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select which Drupal theme to use.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[9A\r\u001b[J\u001b[36m◆\u001b[0m Theme (11/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mCustom (next prompt)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[36m◇\u001b[0m Custom theme machine name \u001b[2m(11.1)\u001b[0m\r\r\n\u001b[90m│"] -[21.13428, "o", "\u001b[0m \u001b[90m│\u001b[0m \r\r\n\u001b"] -[21.134339, "o", "[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[37mstar_wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[2mWe will use this name as a custom theme name\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \r\r\n"] -[22.134593, "o", "\u001b[6A\r\u001b[J\u001b[90m│\u001b[0m \u001b[36m◆\u001b[0m Custom theme machine name (11.1)\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[2mstar_wars\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[36m◇\u001b[0m Build front-end assets in the container? \u001b[2m(11.2)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[2mDisable to build theme assets on the host or as part of deployment.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \r\r\n\u001b[6A\r\u001b[J\u001b[90m│\u001b[0m \u001b[36m◆\u001b[0m Build front-end assets in the container? (11.2)\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[36m◇\u001b[0m Storybook component library? \u001b[2m(11.3)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mComponent library for the custom theme, rendered by Drupal itself.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mStories are authored in Twig next to each component, so the library shows\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mthe same markup the site"] -[22.134599, "o", " renders.\u001b[0m\r\r\n\u001b"] -[22.134747, "o", "[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mA development server runs on demand with `ahoy storybook`. A static build\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mis produced during provisioning and served at `/storybook` in local, CI\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mand development environments.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[2mAdds Storybook packages to the theme and a step to provisioning.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n"] -[23.136427, "o", "\u001b[14A\r\u001b[J\u001b[90m│\u001b[0m \u001b[36m◆\u001b[0m Storybook component library? (11.3)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[90m├\u001b[0m \u001b[1mCode repository\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Repository provider \u001b[2m(12/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mVortex offers full automation with GitHub, while support for other providers\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mis limited.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m GitHub\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mOther\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select your code repository provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[9A\r\u001b[J\u001b[36m◆\u001b[0m Repository provider (12/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mGitHub\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Release versioning scheme \u001b[2m(13/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mChoose your versioning scheme:\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mCalendar Versioning (CalVer)\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m \u001b[4myear.month.patch\u001b[0m\u001b[2;3m (E.g., \u001b[4m24.1.0\u001b[0m\u001b[2;3m)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m "] -[23.136439, "o", "https://calver.org\u001b[0m"] -[23.136572, "o", "\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mSemantic Versioning (SemVer)\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m \u001b[4mmajor.minor.patch\u001b[0m\u001b[2;3m (E.g., \u001b[4m1.0.0\u001b[0m\u001b[2;3m)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m https://semver.org\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mOther\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Custom versioning scheme of your choice.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Calendar Versioning (CalVer)\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mSemantic Versioning (SemVer)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mOther\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select your version scheme.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[24.136956, "o", "\u001b[20A\r\u001b[J\u001b[36m◆\u001b[0m Release versioning scheme (13/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mCalendar Versioning (CalVer)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mEnvironment\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Timezone \u001b[2m(14/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mUTC\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mEtc/UTC\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUTC\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇, or start typing to select the timezone for your project.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Timezone (14/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mUTC\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Services \u001b[2m(15/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m ClamAV\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Solr\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Redis\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more services.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[25.141153, "o", "\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Services (15/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mClamAV, Redis, Solr\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Development tools \u001b[2m(16/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m PHP CodeSniffer\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m PHPStan\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Rector\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m ESLint\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Stylelint\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Jest\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m PHPUnit\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Behat\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Twig CS Fixer\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m DCLint\r\r\n\u001b[90m│\u001b[0m \u001b[2m↓ 1 more\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more tools.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[26.145696, "o", "\u001b[17A\r\u001b[J\u001b[36m◆\u001b[0m Development tools (16/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mBehat, DCLint, ESLint, Hadolint, Jest, PHP CodeSniffer, PHPStan, PHPUnit,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRector, Stylelint, Twig CS Fixer\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mHosting\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Hosting provider \u001b[2m(17/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mAcquia Cloud\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mLagoon\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mOther\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m None\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select your hosting provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[27.150709, "o", "\u001b[9A\r\u001b[J\u001b[36m◆\u001b[0m Hosting provider (17/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Custom web root directory \u001b[2m(18/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mweb\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mCustom directory where the web server serves the site.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[28.151355, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Custom web root directory (18/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mweb\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mDeployment\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Deployment types \u001b[2m(19/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◻\u001b[0m Code artifact\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mLagoon webhook\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Custom webhook\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more deployment types.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[29.151993, "o", "\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Deployment types (19/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mCustom webhook\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mWorkflow\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Provision type \u001b[2m(20/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mProvisioning sets up the site in an environment using an already assembled\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mcodebase.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mImport from database dump\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Provisions the site by importing a database dump\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m typically copied from production into lower\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m environments.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mInstall from profile\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Provisions the site by installing a fresh Drupal\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m site from a profile every time an environment is\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m created.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Import from database dump\r\r\n\u001b[9"] -[29.152046, "o", "0m│\u001b[0m \u001b[2m○\u001b["] -[29.152101, "o", "0m \u001b[2mInstall from profile\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the provision type.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[30.152426, "o", "\u001b[19A\r\u001b[J\u001b[36m◆\u001b[0m Provision type (20/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mImport from database dump\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[36m◇\u001b[0m Database source \u001b[2m(20.1)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m URL download\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mFTP download\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mAcquia backup\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mLagoon environment\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mContainer registry\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mS3 bucket\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the database fetch source.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n"] -[30.152546, "o", "\u001b[12A\r\u001b[J\u001b[90m│\u001b[0m \u001b[36m◆\u001b[0m Database source (20.1)\r\r\n\u001b[90m│\u001b[0m \u001b[2mURL download\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n"] -[31.153013, "o", "\u001b[36m◇\u001b[0m Use a second database for migrations? \u001b[2m(21/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mAdds a second database service for Drupal migrations.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[32.153782, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Use a second database for migrations? (21/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mNotifications\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Notification channels \u001b[2m(22/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m Email\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mGitHub\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mJIRA\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mNew Relic\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mSlack\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mWebhook\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more notification channels.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[32.153869, "o", "\u001b[11A\r\u001b[J\u001b[36m◆\u001b[0m Notification channels (22/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mEmail\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[33.158692, "o", "\u001b[90m├\u001b[0m \u001b[1mContinuous Integration\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Continuous Integration provider \u001b[2m(23/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m GitHub Actions\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mCircleCI\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the CI provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[34.16232, "o", "\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Continuous Integration provider (23/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mGitHub Actions\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Visual regression testing with Diffy? \u001b[2m(24/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mDiffy-powered visual regression workflow to compare deployed environments.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mAutomatically triggers comparisons for dependency-update pull requests\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mmatching the configured branch pattern (`deps/*` by default).\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mRuns comparisons for pull requests tagged with the `VR` label and posts a\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3msticky comment.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mAlso supports manual runs against any URL.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRequires a Diffy account.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[35.167441, "o", "\u001b[15A\r\u001b[J\u001b[36m◆\u001b[0m Visual regression testing with Diffy? (24/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Scan for committed secrets with Gitleaks? \u001b[2m(25/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRuns in CI to detect hardcoded passwords, API keys and tokens.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[36.167857, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Scan for committed secrets with Gitleaks? (25/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mAutomations\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Dependency updates provider \u001b[2m(26/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Renovate GitHub app\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mRenovate self-hosted in CI\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the dependency updates provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[37.168388, "o", "\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Dependency updates provider (26/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mRenovate GitHub app\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[36m◇\u001b[0m Auto-merge dependency updates \u001b[2m(26.1)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mPull requests in the selected groups are merged as soon as they meet the\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mbranch protection rules. Pull requests in other groups need a manual\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mmerge.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mRequires \"Allow auto-merge\" in the repository settings and at least one\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mrequired status check on the base branch.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m PHP packages, except Drupal core (minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Drupal core (minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m JavaScript packages (minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Container images (major, minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m CI "] -[37.168395, "o", "tools (major, mi"] -[37.168513, "o", "nor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m GitHub Actions (major, minor and patch)\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more groups.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n"] -[38.168828, "o", "\u001b[17A\r\u001b[J\u001b[90m│\u001b[0m \u001b[36m◆\u001b[0m Auto-merge dependency updates (26.1)\r\r\n\u001b[90m│\u001b[0m \u001b[2mPHP packages, except Drupal core (minor and patch), Drupal core (minor and\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mpatch), JavaScript packages (minor and patch), Container images (major,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mminor and patch), CI tools (major, minor and patch), GitHub Actions\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m(major, minor and patch)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[36m◇\u001b[0m Code coverage provider \u001b[2m(27/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mCodecov\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m None\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the code coverage provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[39.169409, "o", "\u001b[7A\r\u001b[J\u001b[36m◆\u001b[0m Code coverage provider (27/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Auto-assign the author to their PR? \u001b[2m(28/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mHelps to keep the PRs organized.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[40.169825, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Auto-assign the author to their PR? (28/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Auto-add a CONFLICT label to a PR when conflicts occur? \u001b[2m(29/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mHelps to keep quickly identify PRs that need attention.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[41.170635, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Auto-add a CONFLICT label to a PR when conflicts occur? (29/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mDocumentation\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Preserve project documentation? \u001b[2m(30/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mHelps to maintain the project documentation within the repository.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[42.17152, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Preserve project documentation? (30/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mAI\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Provide AI agent instructions? \u001b[2m(31/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mProvides AI coding agents with better context about the project.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[43.175771, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Provide AI agent instructions? (31/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Configure AI code review with CodeRabbit? \u001b[2m(32/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRequires the CodeRabbit app on the repository.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[43.175855, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Configure AI code review with CodeRabbit? (32/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[44.18058, "o", "\u001b[?25h\u001b[34m●\u001b[0m \u001b[34mInstallation summary\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m┌───────────────────────────────────────────────────────────────────────────┐\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mGeneral information\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Site name \u001b[90m│\u001b[0m Star Wars \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Site machine name \u001b[90m│\u001b[0m star_wars \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Organization name \u001b[90m"] -[44.18059, "o", "│\u001b[0m"] -[44.180694, "o", " Rebellion \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Organization machine name \u001b[90m│\u001b[0m rebellion \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Public domain \u001b[90m│\u001b[0m star-wars.com \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mDrupal\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Starter \u001b[90m│\u001b[0m load"] -[44.180725, "o", "_demod"] -[44.180796, "o", "b \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Modules \u001b[90m│\u001b[0m coffee, config_split, config_update, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m devel, diff, drupal_helpers, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m entity_usage, environment_indicator, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m fast_404, field_group, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m generated_content, gin, linkit, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m menu_trail_by_path, metatag, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m navigation_extra_tools, pathauto, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m redirect, reroute_"] -[44.180819, "o", "email, r"] -[44.180921, "o", "obotstxt, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m scheduled_transitions, schema_metatag, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m sdc_devel, seckit, shield, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m stage_file_proxy, testmode, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m views_bulk_operations, xmlsitemap \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Webroot \u001b[90m│\u001b[0m web \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Profile \u001b[90m│\u001b[0m standard \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Module prefix \u001b[90m│\u001b[0m sw \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Custom modules \u001b[90m│\u001b[0m base, search, demo "] -[44.180944, "o", " \u001b[9"] -[44.181035, "o", "0m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Theme machine name \u001b[90m│\u001b[0m star_wars \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Build front-end in container \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Storybook component library \u001b[90m│\u001b[0m No \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mCode repository\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤"] -[44.181085, "o", "\u001b[0m\r\r\n"] -[44.181172, "o", "\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Code provider \u001b[90m│\u001b[0m github \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Version scheme \u001b[90m│\u001b[0m calver \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mEnvironment\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Timezone \u001b[90m│\u001b[0m UTC \u001b[90m│\u001b[0m\r\r\n\u001b[90m"] -[44.181217, "o", "│\u001b[0"] -[44.181313, "o", "m \u001b[90m│\u001b[0m Services \u001b[90m│\u001b[0m clamav, redis, solr \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Tools \u001b[90m│\u001b[0m behat, dclint, eslint, hadolint, jest, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m phpcs, phpstan, phpunit, rector, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m stylelint, twig_cs_fixer \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mHosting\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬──────"] -[44.181364, "o", "──"] -[44.181409, "o", "────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Hosting provider \u001b[90m│\u001b[0m none \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mDeployment\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Deployment types \u001b[90m│\u001b[0m webhook \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├─"] -[44.181445, "o", "──"] -[44.181532, "o", "───────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mWorkflow\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Provision type \u001b[90m│\u001b[0m database \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Database source \u001b[90m│\u001b[0m url \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Migration database \u001b[90m│\u001b[0m No \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├────"] -[44.181568, "o", "───"] -[44.181641, "o", "───────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mNotifications\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Channels \u001b[90m│\u001b[0m email \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mContinuous Int"] -[44.181675, "o", "egrati"] -[44.181748, "o", "on\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m CI provider \u001b[90m│\u001b[0m gha \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Visual regression testing \u001b[90m│\u001b[0m No \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Secret scanning with Gitleaks \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mAutomations\u001b[0m "] -[44.181752, "o", " "] -[44.181866, "o", " \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Dependency updates provider \u001b[90m│\u001b[0m renovatebot_app \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Auto-merge dependency updates \u001b[90m│\u001b[0m php, drupal_core, js, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m container_images, ci_tools, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m github_actions \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Code coverage provider \u001b[90m│\u001b[0m none \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Auto-assign PR author \u001b[90m│\u001b["] -[44.181912, "o", "0m Yes "] -[44.181988, "o", " \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Auto-add a CONFLICT label to PRs \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mDocumentation\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Preserve project documentation \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├────────────────────"] -[44.182036, "o", "──"] -[44.182081, "o", "────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mAI\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m AI agent instructions \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m AI code review \u001b[90m│\u001b[0m No \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴───────────────────────────────"] -[44.182108, "o", "─"] -[44.182184, "o", "────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mLocations\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Current directory \u001b[90m│\u001b[0m /home/user/vortex/.artifa \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m cts/tmp/videos-workspace \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Destination directory \u001b[90m│\u001b[0m /home/user/vortex/.artifa \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m cts/tmp/videos-workspace/star_wars \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Vortex repository \u001b[90m│\u001b[0m /home/user/www/drevops/vorte"] -[44.182189, "o", "x2 "] -[44.182273, "o", " \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Vortex reference \u001b[90m│\u001b[0m HEAD \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m└──────────────────────────────────┴────────────────────────────────────────┘\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[44.185464, "o", " Vortex will be installed into your project's directory \"/home/user/demo/star_wars\"\r\r\n"] -[44.202083, "o", "\u001b[?25l"] -[44.202205, "o", "\u001b[36m◇\u001b[0m Proceed with installing Vortex?\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[4A\r\u001b[J\u001b[36m◆\u001b[0m Proceed with installing Vortex?\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[46.203479, "o", "\u001b[?25h\u001b[34m●\u001b[0m \u001b[34mStarting project installation\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Downloading Vortex\r\r\n\u001b[90m│\u001b[0m \u001b[2mDownloading from \"/home/user/vortex\" repository at ref \"HEAD\"\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Vortex downloaded (develop)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Customizing Vortex for your project\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Vortex was customized for your project\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Preparing destination directory\r\r\n\u001b[90m│\u001b[0m \u001b[2mCreated directory\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m\"/home/user/demo/star_wars\".\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mInitializing a new Git repository in directory\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m\"/home/user/demo/star_wars\".\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Destination directory is ready\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Copying files to the destination directory\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Files copied to destination directory\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Preparin"] -[46.203519, "o", "g demo content\r\r\n\r\r\n"] -[46.211486, "o", "\u001b[90m│\u001b[0m \u001b[2mCreated data directory\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m\"/home/user/demo/star_wars/.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mdata\".\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo database dump file was found in\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m\"/home/user/demo/star_wars/.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mdata\" directory.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mFetched demo database from\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mhttps://github.com/drevops/vortex/releases/download/1.40.0/db.demo.sql.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Demo content prepared\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[46.212136, "o", "\u001b[90m│\u001b[0m \u001b[90m┌────────────────────────────────────────────────┐\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mFinished installing Vortex\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m──────────────────────────\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Add and commit all files: \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m git add -A \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m git commit -m \"Initial commit.\" \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Files: 402 added \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Status and diff of every file are recorded in: \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m .logs/vortex-install-2026-11-11-040935"] -[46.212153, "o", ".md \u001b["] -[46.212247, "o", "90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m└────────────────────────────────────────────────┘\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[46.227358, "o", "\u001b[?25l"] -[46.227549, "o", "\u001b[36m◇\u001b[0m Run the site build now?\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mTakes ~5-10 min; output will be streamed. You can skip and run later with:\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mahoy build\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[48.230485, "o", "\u001b[7A\r\u001b[J\u001b[36m◆\u001b[0m Run the site build now?\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[?25h\u001b[90m│\u001b[0m \u001b[90m┌───────────────────────────────────────────────────────────────────────────┐\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mReady to build\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m──────────────\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Build the site: \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m ahoy build \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Setup GitHub Action"] -[48.230507, "o", "s: "] -[48.230686, "o", " \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m https://www.vortextemplate.com/docs/continuous-integration/github-actio \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m ns#onboarding \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m└───────────────────────────────────────────────────────────────────────────┘\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] -[48.239818, "x", "0"] +{"version":2,"width":80,"height":27,"timestamp":1794377261,"command":"/home/user/demo/installer.exp","title":"Vortex Installer Demo","env":{"SHELL":"/opt/homebrew/opt/bash/bin/bash"}} +[0.513183, "o", "\u001b[36m──────────────────────────────────────────────────────────────────────────────\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m ██╗ ██╗ ██████╗ ██████╗ ████████╗ ███████╗ ██╗ ██╗\u001b[39m\r\r\n\u001b[36m ██║ ██║ ██╔═══██╗ ██╔══██╗ ╚══██╔══╝ ██╔════╝ ╚██╗██╔╝\u001b[39m\r\r\n\u001b[36m ██║ ██║ ██║ ██║ ██████╔╝ ██║ █████╗ ╚███╔╝\u001b[39m\r\r\n\u001b[36m ╚██╗ ██╔╝ ██║ ██║ ██╔══██╗ ██║ ██╔══╝ ██╔██╗\u001b[39m\r\r\n\u001b[36m ╚████╔╝ ╚██████╔╝ ██║ ██║ ██║ "] +[0.513224, "o", " █"] +[0.513294, "o", "██████╗ ██╔╝ ██╗\u001b[39m\r\r\n\u001b[36m ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝ ╚═╝ ╚═╝\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m Drupal project template\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m by DrevOps\u001b[39m\r\r\n\u001b[36m\u001b[39m\r\r\n\u001b[36m──────────────────────────────────────────────────────────────────────────────\u001b[39m\r\r\n\u001b[2m Installer version: development\u001b[22m\r\r\n"] +[0.514513, "o", "\u001b[90m│\u001b[0m \u001b[90m┌───────────────────────────────────────────────────────────────────────────┐\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mWelcome to the Vortex interactive installer\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m───────────────────────────────────────────\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m This tool will guide you through installing the latest \u001b[4mdevelopment\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m version of Vortex into your project. \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m You will be asked a few questions to tailor the c"] +[0.514517, "o", "onfigu"] +[0.51459, "o", "ration to your \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m site. \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m No changes will be made until you confirm everything at the end. \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Press \u001b[33mCtrl+C\u001b[39m at any time to exit the installer.\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Press \u001b[33mCtrl+U\u001b[39m at any time to go back to the previous step.\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m└───────────────────────────────────────────────────────────────────────────┘\u001b[0m\r\r\n\u001b[90m│\u001b"] +[0.514594, "o", "[0m\r\r\n"] +[0.515221, "o", "\u001b[36m◇\u001b[0m Validating repository and reference\r\r\n"] +[0.521313, "o", "\u001b[90m│\u001b[0m \u001b[2mChecking repository \"/home/user/vortex\" and reference \"HEAD\"\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Repository and reference validated successfully\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[0.5346, "o", "\u001b[?25l\u001b[36m◇\u001b[0m Press any key to continue...\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[3.539737, "o", "\u001b[2A\r\u001b[J"] +[3.550914, "o", "\u001b[?25h"] +[3.567294, "o", "\u001b[?25l"] +[3.567362, "o", "\r\r\n\u001b[90m┌\u001b[0m \u001b[1mGeneral information\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[3.567628, "o", "\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mstar wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[3.72272, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar war\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar wa\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar w\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar \u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mstar\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use"] +[3.722727, "o", " this name in the project an"] +[4.49924, "o", "d documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37msta\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mst\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37ms\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] +[4.499259, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe "] +[4.499363, "o", "will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.502853, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r"] +[5.503115, "o", "\r\n\u001b[90m│\u001b[0m \u001b[2mWe will u"] +[5.504792, "o", "se this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.505193, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r"] +[5.506029, "o", "\r\n\u001b[90m│\u001b[0m \u001b[2mWe will u"] +[5.506121, "o", "se this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.506194, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.506325, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.506437, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.506558, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.506625, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.506744, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.506848, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.506935, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.507049, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.507189, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.507237, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.50735, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.50742, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.507516, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.507629, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.507752, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.50782, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.507921, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.508032, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.508108, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.508221, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.508322, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.508452, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.50851, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.508663, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.508699, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.508824, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Site\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.508915, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mS\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.509017, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mSt\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.509122, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mSta\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.509217, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.509291, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar \u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.509393, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar W\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.509513, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wa\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.509587, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar War\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.509695, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Site name \u001b[2m(1/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.509784, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Site name (1/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mStar Wars\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[5.510167, "o", "\u001b[36m◇\u001b[0m Site machine name \u001b[2m(2/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mstar_wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name for the project directory and in the code.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.515201, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Site machine name (2/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mstar_wars\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.51592, "o", "\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mStar Wars Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[6.668715, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars Or\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars O\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars \u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar War\u001b[0"] +[6.668944, "o", "m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0"] +[7.81266, "o", "m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar Wa\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar W\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar \u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mStar\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m O"] +[7.813011, "o", "rganization name \u001b[2m(3/32)"] +[7.814077, "o", "\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mSta\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mSt\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mS\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name i"] +[7.814157, "o", "n the project and documentat"] +[8.821805, "o", "ion.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b["] +[8.823027, "o", "90m│\u001b[0m \u001b[90mE.g. My Org"] +[8.823117, "o", "\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[9.827727, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] +[9.827739, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] +[9.827985, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[10.833155, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] +[10.833494, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] +[10.833604, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b["] +[10.833794, "o", "0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m O"] +[11.835524, "o", "rganization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b["] +[11.835536, "o", "90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b"] +[11.835665, "o", "[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[12.840987, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] +[12.841462, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] +[12.84161, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[13.845364, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My Org\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90mE.g. My O"] +[13.845372, "o", "rg\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m"] +[13.845491, "o", "│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[14.847879, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mR\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRe\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mReb\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebe\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebel\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90"] +[14.8482, "o", "m│\u001b[0m \u001b[2mWe will use th"] +[14.848343, "o", "is name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebell\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[15.852422, "o", "\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebelli\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebellio\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◇\u001b[0m Organization name \u001b[2m(3/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[37mRebellion\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the project and documentation.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Organization name (3/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mRebellion\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Organization machine name \u001b[2m(4/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mrebellion\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in the code.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Organization "] +[15.856824, "o", "machine name (4/32)\r\r\n\u001b[90m"] +[15.857769, "o", "│\u001b[0m \u001b[2mrebellion\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Public domain \u001b[2m(5/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mstar-wars.com\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mDomain name without protocol and trailing slash.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[16.860407, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Public domain (5/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mstar-wars.com\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mDrupal\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m How would you like your site to be created on the first run? \u001b[2m(6/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mChoose how your site will be created the first time after this installer\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mfinishes:\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mDrupal, installed from profile\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Creates a new site by \u001b[4mpopulating a fresh database\u001b[0m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m from one of the standard Drupal installation profiles.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mDrupal CMS, installed from profile\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Creates a new site by \u001b[4mpopulating a fresh database\u001b[0m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m from the Drupal CMS recipe.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mDrupal, loaded from the demo database"] +[16.860422, "o", "\u001b[22m\u001b[2;3m\u001b[0m\r\r\n"] +[16.86057, "o", "\u001b[90m│\u001b[0m \u001b[2;3m Creates a site by \u001b[4mloading an existing demo database\u001b[0m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m provided with the installer.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mDrupal, installed from profile\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mDrupal CMS, installed from profile\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Drupal, loaded from the demo database\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇. Applies only on the first run of the installer.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[17.864365, "o", "\u001b[22A\r\u001b[J\u001b[36m◆\u001b[0m How would you like your site to be created on the first run? (6/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mDrupal, loaded from the demo database\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Profile \u001b[2m(7/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Standard\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mMinimal\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mDemo Umami\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mCustom (next prompt)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select which Drupal profile to use.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[9A\r\u001b[J\u001b[36m◆\u001b[0m Profile (7/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mStandard\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Modules \u001b[2m(8/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m Coffee\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Config split\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Config update\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Devel\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Diff\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Drupal helpers\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Entity usage\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Environment indicator\r\r\n"] +[17.864376, "o", "\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m"] +[17.864478, "o", " Fast 404\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Field group\r\r\n\u001b[90m│\u001b[0m \u001b[2m↓ 19 more\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more modules.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[18.868827, "o", "\u001b[17A\r\u001b[J\u001b[36m◆\u001b[0m Modules (8/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mCoffee, Config split, Config update, Devel, Diff, Drupal helpers, Entity\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2musage, Environment indicator, Fast 404, Field group, Generated content, Gin\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2madmin theme, Linkit, Menu trail by path, Metatag, Navigation extra tools,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mPathauto, Redirect, Reroute email, Robots.txt, Scheduled transitions,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mSchema.org Metatag, SDC Devel, Seckit, Shield, Stage file proxy, Testmode,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mViews bulk operations, XML Sitemap\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Custom modules prefix \u001b[2m(9/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2msw\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mWe will use this name in custom modules\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Custom modules prefix (9/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2msw\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Custom modules \u001b[2m(10/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mSelect which custom modules to include in your project:\u001b[0m"] +[18.868864, "o", "\r\r\n\u001b[90m│\u001b[0m \u001b["] +[18.868944, "o", "2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mBase\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Starter module with deploy hooks and test scaffolding for\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Unit, Kernel, Functional, and FunctionalJavascript tests.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mSearch\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Custom Solr search integration module. Requires the Solr\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m service to be selected.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mDemo\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Demonstrates how Vortex tooling works: includes a counter\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m block with CSS/JS, PHPUnit example tests across all test\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m types, and a Behat feature. Safe to remove on real projects.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m Base - starter module with utilities and test scaffolding\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Search - custom Solr search integration\r\r\n\u001b[90m│\u001b[0m \u001b["] +[18.868947, "o", "32m◼\u001b[0m Demo "] +[19.872962, "o", "- counter block and example tests to demonstrate tooling\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more modules.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[22A\r\u001b[J\u001b[36m◆\u001b[0m Custom modules (10/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mBase - starter module with utilities and test scaffolding, Search - custom\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mSolr search integration, Demo - counter block and example tests to\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mdemonstrate tooling\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Theme \u001b[2m(11/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mOlivero\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mClaro\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mStark\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Custom (next prompt)\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select which Drupal theme to use.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[9A\r\u001b[J\u001b[36m◆\u001b[0m Theme (11/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mCustom (next prompt)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[36m◇\u001b[0m Custom theme machine name \u001b[2m(11.1)\u001b[0m\r\r\n\u001b[90m│\u001b"] +[19.873008, "o", "[0m \u001b[90m│\u001b[0m \r\r\n\u001b["] +[19.87308, "o", "90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[2mstar_wars\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[2mWe will use this name as a custom theme name\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \r\r\n"] +[20.876865, "o", "\u001b[6A\r\u001b[J\u001b[90m│\u001b[0m \u001b[36m◆\u001b[0m Custom theme machine name (11.1)\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[2mstar_wars\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[36m◇\u001b[0m Build front-end assets in the container? \u001b[2m(11.2)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[2mDisable to build theme assets on the host or as part of deployment.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \r\r\n\u001b[6A\r\u001b[J\u001b[90m│\u001b[0m \u001b[36m◆\u001b[0m Build front-end assets in the container? (11.2)\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[36m◇\u001b[0m Storybook component library? \u001b[2m(11.3)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mComponent library for the custom theme, rendered by Drupal itself.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mStories are authored in Twig next to each component, so the library shows\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mthe same markup the site"] +[20.87691, "o", " renders.\u001b[0m\r\r\n\u001b"] +[20.876975, "o", "[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mA development server runs on demand with `ahoy storybook`. A static build\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mis produced during provisioning and served at `/storybook` in local, CI\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mand development environments.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[2mAdds Storybook packages to the theme and a step to provisioning.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n"] +[21.881079, "o", "\u001b[14A\r\u001b[J\u001b[90m│\u001b[0m \u001b[36m◆\u001b[0m Storybook component library? (11.3)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[90m├\u001b[0m \u001b[1mCode repository\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Repository provider \u001b[2m(12/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mVortex offers full automation with GitHub, while support for other providers\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mis limited.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m GitHub\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mOther\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select your code repository provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[9A\r\u001b[J\u001b[36m◆\u001b[0m Repository provider (12/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mGitHub\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Release versioning scheme \u001b[2m(13/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mChoose your versioning scheme:\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mCalendar Versioning (CalVer)\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m \u001b[4myear.month.patch\u001b[0m\u001b[2;3m (E.g., \u001b[4m24.1.0\u001b[0m\u001b[2;3m)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m "] +[21.881092, "o", "https://calver.org\u001b[0m"] +[21.881192, "o", "\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mSemantic Versioning (SemVer)\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m \u001b[4mmajor.minor.patch\u001b[0m\u001b[2;3m (E.g., \u001b[4m1.0.0\u001b[0m\u001b[2;3m)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m https://semver.org\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mOther\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Custom versioning scheme of your choice.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Calendar Versioning (CalVer)\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mSemantic Versioning (SemVer)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mOther\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select your version scheme.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[22.885316, "o", "\u001b[20A\r\u001b[J\u001b[36m◆\u001b[0m Release versioning scheme (13/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mCalendar Versioning (CalVer)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mEnvironment\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Timezone \u001b[2m(14/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUTC\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mEtc/UTC\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUTC\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇, or start typing to select the timezone for your project.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[22.885435, "o", "\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Timezone (14/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mUTC\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[23.890858, "o", "\u001b[36m◇\u001b[0m Services \u001b[2m(15/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m ClamAV\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Solr\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Redis\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more services.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[24.8944, "o", "\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Services (15/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mClamAV, Redis, Solr\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Development tools \u001b[2m(16/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m PHP CodeSniffer\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m PHPStan\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Rector\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m ESLint\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Stylelint\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Jest\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m PHPUnit\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Behat\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Twig CS Fixer\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m DCLint\r\r\n\u001b[90m│\u001b[0m \u001b[2m↓ 1 more\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more tools.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[25.898851, "o", "\u001b[17A\r\u001b[J\u001b[36m◆\u001b[0m Development tools (16/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mBehat, DCLint, ESLint, Hadolint, Jest, PHP CodeSniffer, PHPStan, PHPUnit,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRector, Stylelint, Twig CS Fixer\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mHosting\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Hosting provider \u001b[2m(17/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mAcquia Cloud\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mLagoon\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mOther\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m None\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select your hosting provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[26.902311, "o", "\u001b[9A\r\u001b[J\u001b[36m◆\u001b[0m Hosting provider (17/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Custom web root directory \u001b[2m(18/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mweb\u001b[0m\u001b[36m█\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mCustom directory where the web server serves the site.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[27.906089, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Custom web root directory (18/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mweb\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mDeployment\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Deployment types \u001b[2m(19/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◻\u001b[0m Code artifact\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mLagoon webhook\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Custom webhook\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more deployment types.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[28.910773, "o", "\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Deployment types (19/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mCustom webhook\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mWorkflow\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Provision type \u001b[2m(20/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mProvisioning sets up the site in an environment using an already assembled\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mcodebase.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mImport from database dump\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Provisions the site by importing a database dump\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m typically copied from production into lower\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m environments.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m ○ \u001b[1mInstall from profile\u001b[22m\u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m Provisions the site by installing a fresh Drupal\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m site from a profile every time an environment is\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m created.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Import from database dump\r\r\n\u001b[9"] +[28.910802, "o", "0m│\u001b[0m \u001b[2m○\u001b["] +[28.910931, "o", "0m \u001b[2mInstall from profile\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the provision type.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[29.914567, "o", "\u001b[19A\r\u001b[J\u001b[36m◆\u001b[0m Provision type (20/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mImport from database dump\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[36m◇\u001b[0m Database source \u001b[2m(20.1)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m URL download\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mFTP download\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mAcquia backup\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mLagoon environment\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mContainer registry\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mS3 bucket\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the database fetch source.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n"] +[30.918629, "o", "\u001b[12A\r\u001b[J\u001b[90m│\u001b[0m \u001b[36m◆\u001b[0m Database source (20.1)\r\r\n\u001b[90m│\u001b[0m \u001b[2mURL download\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[36m◇\u001b[0m Use a second database for migrations? \u001b[2m(21/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mAdds a second database service for Drupal migrations.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[31.923539, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Use a second database for migrations? (21/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mNotifications\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Notification channels \u001b[2m(22/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m Email\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mGitHub\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mJIRA\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mNew Relic\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mSlack\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m◻\u001b[0m \u001b[2mWebhook\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more notification channels.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[32.926586, "o", "\u001b[11A\r\u001b[J\u001b[36m◆\u001b[0m Notification channels (22/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mEmail\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mContinuous Integration\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Continuous Integration provider \u001b[2m(23/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m GitHub Actions\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mCircleCI\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the CI provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[33.933241, "o", "\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Continuous Integration provider (23/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mGitHub Actions\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Visual regression testing with Diffy? \u001b[2m(24/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mDiffy-powered visual regression workflow to compare deployed environments.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mAutomatically triggers comparisons for dependency-update pull requests\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mmatching the configured branch pattern (`deps/*` by default).\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mRuns comparisons for pull requests tagged with the `VR` label and posts a\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3msticky comment.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mAlso supports manual runs against any URL.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRequires a Diffy account.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[33.933343, "o", "\u001b[15A\r\u001b[J\u001b[36m◆\u001b[0m Visual regression testing with Diffy? (24/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[34.937999, "o", "\u001b[36m◇\u001b[0m Scan for committed secrets with Gitleaks? \u001b[2m(25/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRuns in CI to detect hardcoded passwords, API keys and tokens.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[35.940716, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Scan for committed secrets with Gitleaks? (25/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mAutomations\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Dependency updates provider \u001b[2m(26/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m Renovate GitHub app\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mRenovate self-hosted in CI\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the dependency updates provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[36.944127, "o", "\u001b[8A\r\u001b[J\u001b[36m◆\u001b[0m Dependency updates provider (26/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mRenovate GitHub app\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[36m◇\u001b[0m Auto-merge dependency updates \u001b[2m(26.1)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mPull requests in the selected groups are merged as soon as they meet the\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mbranch protection rules. Pull requests in other groups need a manual\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mmerge.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3m\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mRequires \"Allow auto-merge\" in the repository settings and at least one\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2;3mrequired status check on the base branch.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[36m❯\u001b[0m \u001b[32m◼\u001b[0m PHP packages, except Drupal core (minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Drupal core (minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m JavaScript packages (minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m Container images (major, minor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m CI "] +[36.944173, "o", "tools (major, mi"] +[36.94423, "o", "nor and patch)\r\r\n\u001b[90m│\u001b[0m \u001b[32m◼\u001b[0m GitHub Actions (major, minor and patch)\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆, ⬇ and Space bar to select one or more groups.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n"] +[37.948256, "o", "\u001b[17A\r\u001b[J\u001b[90m│\u001b[0m \u001b[36m◆\u001b[0m Auto-merge dependency updates (26.1)\r\r\n\u001b[90m│\u001b[0m \u001b[2mPHP packages, except Drupal core (minor and patch), Drupal core (minor and\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mpatch), JavaScript packages (minor and patch), Container images (major,\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mminor and patch), CI tools (major, minor and patch), GitHub Actions\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m(major, minor and patch)\u001b[0m\r\r\n\u001b[90m│\u001b[0m \r\r\n\u001b[36m◇\u001b[0m Code coverage provider \u001b[2m(27/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mCodecov\u001b[0m\r\r\n\u001b[90m│\u001b[0m\u001b[36m❯\u001b[0m \u001b[32m●\u001b[0m None\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mUse ⬆ and ⬇ to select the code coverage provider.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[38.952398, "o", "\u001b[7A\r\u001b[J\u001b[36m◆\u001b[0m Code coverage provider (27/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNone\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Auto-assign the author to their PR? \u001b[2m(28/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mHelps to keep the PRs organized.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[39.956459, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Auto-assign the author to their PR? (28/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Auto-add a CONFLICT label to a PR when conflicts occur? \u001b[2m(29/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mHelps to keep quickly identify PRs that need attention.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[40.960517, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Auto-add a CONFLICT label to a PR when conflicts occur? (29/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m├\u001b[0m \u001b[1mDocumentation\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Preserve project documentation? \u001b[2m(30/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mHelps to maintain the project documentation within the repository.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[40.960739, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Preserve project documentation? (30/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[41.964993, "o", "\u001b[90m├\u001b[0m \u001b[1mAI\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Provide AI agent instructions? \u001b[2m(31/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mProvides AI coding agents with better context about the project.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[41.96519, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Provide AI agent instructions? (31/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[42.969564, "o", "\u001b[36m◇\u001b[0m Configure AI code review with CodeRabbit? \u001b[2m(32/32)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mRequires the CodeRabbit app on the repository.\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[43.973082, "o", "\u001b[6A\r\u001b[J\u001b[36m◆\u001b[0m Configure AI code review with CodeRabbit? (32/32)\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[?25h\u001b[34m●\u001b[0m \u001b[34mInstallation summary\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m┌───────────────────────────────────────────────────────────────────────────┐\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mGeneral information\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Site name \u001b[90m│\u001b[0m Star Wars \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Site machine name \u001b[90m│\u001b[0m sta"] +[43.973341, "o", "r_wars "] +[43.973619, "o", " \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Organization name \u001b[90m│\u001b[0m Rebellion \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Organization machine name \u001b[90m│\u001b[0m rebellion \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Public domain \u001b[90m│\u001b[0m star-wars.com \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mDrupal\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬───────────────────────────────"] +[43.973829, "o", "──"] +[43.974057, "o", "───────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Starter \u001b[90m│\u001b[0m load_demodb \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Modules \u001b[90m│\u001b[0m coffee, config_split, config_update, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m devel, diff, drupal_helpers, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m entity_usage, environment_indicator, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m fast_404, field_group, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m generated_content, gin, linkit, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m menu_trail_by_path, metatag, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m navigation_extra_tools, pathaut"] +[43.974317, "o", "o, "] +[43.974476, "o", "\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m redirect, reroute_email, robotstxt, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m scheduled_transitions, schema_metatag, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m sdc_devel, seckit, shield, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m stage_file_proxy, testmode, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m views_bulk_operations, xmlsitemap \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Webroot \u001b[90m│\u001b[0m web \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Profile \u001b[90m│\u001b[0m standard \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Module prefix \u001b[90m│\u001b[0m sw \u001b[90m│"] +[43.974996, "o", "\u001b[0m\r\r\n\u001b["] +[43.975988, "o", "90m│\u001b[0m \u001b[90m│\u001b[0m Custom modules \u001b[90m│\u001b[0m base, search, demo \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Theme machine name \u001b[90m│\u001b[0m star_wars \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Build front-end in container \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Storybook component library \u001b[90m│\u001b[0m No \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mCode repository\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬───"] +[43.976249, "o", "──"] +[43.976415, "o", "───────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Code provider \u001b[90m│\u001b[0m github \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Version scheme \u001b[90m│\u001b[0m calver \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mEnvironment\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[9"] +[43.976728, "o", "0m│\u001b["] +[43.976893, "o", "0m Timezone \u001b[90m│\u001b[0m UTC \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Services \u001b[90m│\u001b[0m clamav, redis, solr \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Tools \u001b[90m│\u001b[0m behat, dclint, eslint, hadolint, jest, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m phpcs, phpstan, phpunit, rector, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m stylelint, twig_cs_fixer \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mHosting\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├───"] +[43.977123, "o", "──"] +[43.977417, "o", "─────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Hosting provider \u001b[90m│\u001b[0m none \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mDeployment\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Deployment t"] +[43.977423, "o", "ypes "] +[43.977558, "o", " \u001b[90m│\u001b[0m webhook \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mWorkflow\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Provision type \u001b[90m│\u001b[0m database \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Database source \u001b[90m│\u001b[0m url \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Migration database "] +[43.977564, "o", " "] +[43.977684, "o", " \u001b[90m│\u001b[0m No \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mNotifications\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Channels \u001b[90m│\u001b[0m email \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────"] +[43.977718, "o", "──"] +[43.977844, "o", "──────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mContinuous Integration\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m CI provider \u001b[90m│\u001b[0m gha \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Visual regression testing \u001b[90m│\u001b[0m No \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Secret scanning with Gitleaks \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴───────────────────────"] +[43.97787, "o", "───"] +[43.977972, "o", "──────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mAutomations\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Dependency updates provider \u001b[90m│\u001b[0m renovatebot_app \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Auto-merge dependency updates \u001b[90m│\u001b[0m php, drupal_core, js, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m container_images, ci_tools, \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m github_actions \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Code coverage provider \u001b[90m│\u001b[0m none "] +[43.977984, "o", " "] +[43.978096, "o", " \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Auto-assign PR author \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Auto-add a CONFLICT label to PRs \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mDocumentation\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Preserve project documentation \u001b[90m│\u001b[0m Yes "] +[43.978112, "o", " "] +[43.978211, "o", " \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mAI\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m AI agent instructions \u001b[90m│\u001b[0m Yes \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m AI code review \u001b[90m│\u001b[0m No \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├────────────────────────────"] +[43.978218, "o", "──"] +[43.978322, "o", "────┴────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mLocations\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m├──────────────────────────────────┬────────────────────────────────────────┤\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Current directory \u001b[90m│\u001b[0m /home/user/vortex/.artifa \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m cts/tmp/videos-workspace \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Destination directory \u001b[90m│\u001b[0m /home/user/vortex/.artifa \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m cts/tmp/videos-workspace/star_wars \u001b[90m"] +[43.978351, "o", "│\u001b[0"] +[43.978416, "o", "m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Vortex repository \u001b[90m│\u001b[0m /home/user/vortex \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Vortex reference \u001b[90m│\u001b[0m HEAD \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m└──────────────────────────────────┴────────────────────────────────────────┘\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[43.981795, "o", " Vortex will be installed into your project's directory \"/home/user/demo/star_wars\"\r\r\n"] +[43.996492, "o", "\u001b[?25l"] +[43.996573, "o", "\u001b[36m◇\u001b[0m Proceed with installing Vortex?\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m●\u001b[0m Yes \u001b[2m/\u001b[0m \u001b[2m○\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[45.997971, "o", "\u001b[4A\r\u001b[J\u001b[36m◆\u001b[0m Proceed with installing Vortex?\r\r\n\u001b[90m│\u001b[0m \u001b[2mYes\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[?25h\u001b[34m●\u001b[0m \u001b[34mStarting project installation\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Downloading Vortex\r\r\n\u001b[90m│\u001b[0m \u001b[2mDownloading from \"/home/user/vortex\" repository at ref \"HEAD\"\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Vortex downloaded (develop)\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Customizing Vortex for your project\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Vortex was customized for your project\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Preparing destination directory\r\r\n\u001b[90m│\u001b[0m \u001b[2mCreated directory\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m\"/home/user/demo/star_wars\".\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mInitializing a new Git repository in directory\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m\"/home/user/demo/star_wars\".\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Destination directory is ready\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Copying files to the destination directory\r\r\n\u001b[90m"] +[45.99798, "o", "│\u001b[0m \u001b[32m✓ Fi"] +[45.998097, "o", "les copied to destination directory\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[36m◇\u001b[0m Preparing demo content\r\r\n"] +[46.699309, "o", "\u001b[90m│\u001b[0m \u001b[2mCreated data directory\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m\"/home/user/demo/star_wars/.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mdata\".\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo database dump file was found in\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m\"/home/user/demo/star_wars/.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mdata\" directory.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mFetched demo database from\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mhttps://github.com/drevops/vortex/releases/download/1.40.0/db.demo.sql.\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[32m✓ Demo content prepared\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[46.699997, "o", "\u001b[90m│\u001b[0m \u001b[90m┌────────────────────────────────────────────────┐\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mFinished installing Vortex\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m──────────────────────────\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Add and commit all files: \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m git add -A \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m git commit -m \"Initial commit.\" \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Files: 402 added \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Status and diff of every file are recorded in: \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m .logs/vortex-install-2026-11-11-060826"] +[46.700043, "o", ".md \u001b["] +[46.700134, "o", "90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m└────────────────────────────────────────────────┘\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[46.716138, "o", "\u001b[?25l"] +[46.716285, "o", "\u001b[36m◇\u001b[0m Run the site build now?\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2m○\u001b[0m \u001b[2mYes\u001b[0m \u001b[2m/\u001b[0m \u001b[32m●\u001b[0m No\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mTakes ~5-10 min; output will be streamed. You can skip and run later with:\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[2mahoy build\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[48.720564, "o", "\u001b[7A\r\u001b[J\u001b[36m◆\u001b[0m Run the site build now?\r\r\n\u001b[90m│\u001b[0m \u001b[2mNo\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n\u001b[?25h\u001b[90m│\u001b[0m \u001b[90m┌───────────────────────────────────────────────────────────────────────────┐\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[1mReady to build\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m──────────────\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Build the site: \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m ahoy build \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m Setup GitHub Action"] +[48.720571, "o", "s: "] +[48.720667, "o", " \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m https://www.vortextemplate.com/docs/continuous-integration/github-actio \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m ns#onboarding \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m│\u001b[0m \u001b[90m│\u001b[0m\r\r\n\u001b[90m│\u001b[0m \u001b[90m└───────────────────────────────────────────────────────────────────────────┘\u001b[0m\r\r\n\u001b[90m│\u001b[0m\r\r\n"] +[48.730226, "x", "0"] diff --git a/.vortex/docs/static/img/installer.svg b/.vortex/docs/static/img/installer.svg index 15880d6981..f7f1b9ff69 100644 --- a/.vortex/docs/static/img/installer.svg +++ b/.vortex/docs/static/img/installer.svg @@ -1 +1 @@ -──────────────────────────────────────────────────────────────────────────────██╗██╗██████╗██████╗████████╗███████╗██╗██╗██║██║██╔═══██╗██╔══██╗╚══██╔══╝██╔════╝╚██╗██╔╝██║██║██║██║██████╔╝██║█████╗╚███╔╝╚██╗██╔╝██║██║██╔══██╗██║██╔══╝██╔██╗╚████╔╝╚██████╔╝██║██║██║███████╗██╔╝██╗╚═══╝╚═════╝╚═╝╚═╝╚═╝╚══════╝╚═╝╚═╝DrupalprojecttemplatebyDrevOpsInstallerversion:development│┌───────────────────────────────────────────────────────────────────────────┐││WelcometotheVortexinteractiveinstaller│││───────────────────────────────────────────│││Thistoolwillguideyouthroughinstallingthelatestdevelopment│││versionofVortexintoyourproject.││││││Youwillbeaskedafewquestionstotailortheconfigurationtoyour│││site.│││Nochangeswillbemadeuntilyouconfirmeverythingattheend.│││PressCtrl+Catanytimetoexittheinstaller.│││PressCtrl+Uatanytimetogobacktothepreviousstep.││└───────────────────────────────────────────────────────────────────────────┘│◇Validatingrepositoryandreference│Checkingrepository"/home/user/vortex"andreference"HEAD"│✓Repositoryandreferencevalidatedsuccessfully┌Generalinformation◇Sitename(1/32)│Wewillusethisnameintheprojectanddocumentation.│star█│E.g.MySite█│Sta█│StarWar█◆Sitename(1/32)│StarWars◆Sitemachinename(2/32)│star_wars◇Organizationname(3/32)◇O│E.g.MyOrg█│E.g.MyO│Rebel█◆Organizationname(3/32)│Rebellion◆Organizationmachinename(4/32)│rebellion◆Publicdomain(5/32)│star-wars.com├Drupal◇Howwouldyoulikeyoursitetobecreatedonthefirstrun?(6/32)│Choosehowyoursitewillbecreatedthefirsttimeafterthisinstaller│finishes:│○Drupal,installedfromprofile│Createsanewsitebypopulatingafreshdatabase│fromoneofthestandardDrupalinstallationprofiles.◆Howwouldyoulikeyoursitetobecreatedonthefirstrun?(6/32)│Drupal,loadedfromthedemodatabase◆Profile(7/32)│Standard◇Modules(8/32)│❯◼Coffee│◼Configsplit│◼Configupdate│◼Devel│◼Diff│◼Drupalhelpers│◼Entityusage│◼Environmentindicator◆Modules(8/32)│Coffee,Configsplit,Configupdate,Devel,Diff,Drupalhelpers,Entity│usage,Environmentindicator,Fast404,Fieldgroup,Generatedcontent,Gin│admintheme,Linkit,Menutrailbypath,Metatag,Navigationextratools,│Pathauto,Redirect,Rerouteemail,Robots.txt,Scheduledtransitions,│Schema.orgMetatag,SDCDevel,Seckit,Shield,Stagefileproxy,Testmode,│Viewsbulkoperations,XMLSitemap◆Custommodulesprefix(9/32)│sw◇Custommodules(10/32)│Selectwhichcustommodulestoincludeinyourproject:│○Base│Startermodulewithdeployhooksandtestscaffoldingfor│Unit,Kernel,Functional,andFunctionalJavascripttests.│○Search│CustomSolrsearchintegrationmodule.RequirestheSolr│servicetobeselected.│○Demo│DemonstrateshowVortextoolingworks:includesacounter│blockwithCSS/JS,PHPUnitexampletestsacrossalltest│types,andaBehatfeature.Safetoremoveonrealprojects.│❯◼Base-startermodulewithutilitiesandtestscaffolding│◼Search-customSolrsearchintegration◆Custommodules(10/32)│Base-startermodulewithutilitiesandtestscaffolding,Search-custom│Solrsearchintegration,Demo-counterblockandexampleteststo│demonstratetooling◆Theme(11/32)│Custom(nextprompt)│││◇Customthememachinename(11.1)│◆Customthememachinename(11.1)││star_wars│◆Buildfront-endassetsinthecontainer?(11.2)││Yes│◇Storybookcomponentlibrary?(11.3)│Componentlibraryforthecustomtheme,renderedbyDrupalitself.│StoriesareauthoredinTwignexttoeachcomponent,sothelibraryshows│thesamemarkupthesiterenders.│◆Storybookcomponentlibrary?(11.3)│No├Coderepository◆Repositoryprovider(12/32)│GitHub◇Releaseversioningscheme(13/32)│Chooseyourversioningscheme:│○CalendarVersioning(CalVer)│year.month.patch(E.g.,24.1.0)│https://calver.org│○Other├Environment◆Timezone(14/32)│UTC◆Services(15/32)│ClamAV,Redis,Solr◆Developmenttools(16/32)│Behat,DCLint,ESLint,Hadolint,Jest,PHPCodeSniffer,PHPStan,PHPUnit,│Rector,Stylelint,TwigCSFixer├Hosting│❯●None◆Hostingprovider(17/32)│None◆Customwebrootdirectory(18/32)│web├Deployment◆Deploymenttypes(19/32)│Customwebhook├Workflow◇Provisiontype(20/32)│Provisioningsetsupthesiteinanenvironmentusinganalreadyassembled│codebase.│○Importfromdatabasedump│Provisionsthesitebyimportingadatabasedump│typicallycopiedfromproductionintolower│environments.│○Installfromprofile│ProvisionsthesitebyinstallingafreshDrupal│sitefromaprofileeverytimeanenvironmentis│created.│❯●Importfromdatabasedump◆Provisiontype(20/32)│Importfromdatabasedump│◆Databasesource(20.1)│URLdownload│○Yes/●No◆Useaseconddatabaseformigrations?(21/32)│No├Notifications◆Notificationchannels(22/32)│Email├ContinuousIntegration│○None◆ContinuousIntegrationprovider(23/32)│GitHubActions◆VisualregressiontestingwithDiffy?(24/32)│●Yes/○No◆ScanforcommittedsecretswithGitleaks?(25/32)│Yes├Automations◆Dependencyupdatesprovider(26/32)│RenovateGitHubapp│◇Auto-mergedependencyupdates(26.1)│Pullrequestsintheselectedgroupsaremergedassoonastheymeetthe│branchprotectionrules.Pullrequestsinothergroupsneedamanual│merge.│Requires"Allowauto-merge"intherepositorysettingsandatleastone│requiredstatuscheckonthebasebranch.│❯◼PHPpackages,exceptDrupalcore(minorandpatch)│◼Drupalcore(minorandpatch)│◼JavaScriptpackages(minorandpatch)│◼Containerimages(major,minorandpatch)│◆Auto-mergedependencyupdates(26.1)│PHPpackages,exceptDrupalcore(minorandpatch),Drupalcore(minorand│patch),JavaScriptpackages(minorandpatch),Containerimages(major,│minorandpatch),CItools(major,minorandpatch),GitHubActions│(major,minorandpatch)◆Codecoverageprovider(27/32)◆Auto-assigntheauthortotheirPR?(28/32)◆Auto-addaCONFLICTlabeltoaPRwhenconflictsoccur?(29/32)├Documentation◆Preserveprojectdocumentation?(30/32)├AI◆ProvideAIagentinstructions?(31/32)◆ConfigureAIcodereviewwithCodeRabbit?(32/32)●Installationsummary││Generalinformation││├──────────────────────────────────┬────────────────────────────────────────┤││Sitename│StarWars│││Sitemachinename│star_wars│││Organizationname│Rebellion│││Organizationmachinename│rebellion│││Publicdomain│star-wars.com││├──────────────────────────────────┴────────────────────────────────────────┤││Drupal│││Starter│load_demodb│││Modules│coffee,config_split,config_update,││││devel,diff,drupal_helpers,││││entity_usage,environment_indicator,││││fast_404,field_group,││││generated_content,gin,linkit,││││menu_trail_by_path,metatag,││││navigation_extra_tools,pathauto,││││redirect,reroute_email,robotstxt,││││scheduled_transitions,schema_metatag,││││sdc_devel,seckit,shield,││││stage_file_proxy,testmode,││││views_bulk_operations,xmlsitemap│││Webroot│web│││Profile│standard│││Moduleprefix│sw│││Custommodules│base,search,demo││Custommodules│base,search,demo│││Thememachinename│star_wars│││Buildfront-endincontainer│Yes│││Storybookcomponentlibrary│No│││Coderepository│││Codeprovider│github│││Versionscheme│calver│││Environment│││Timezone│UTC│││Services│clamav,redis,solr│││Tools│behat,dclint,eslint,hadolint,jest,││││phpcs,phpstan,phpunit,rector,││││stylelint,twig_cs_fixer│││Hosting│││Hostingprovider│none│││Deployment│││Deploymenttypes│webhook│││Workflow│││Provisiontype│database│││Databasesource│url│││Migrationdatabase│No│││Notifications│││Channels│email│││ContinuousIntegration│││CIprovider│gha│││Visualregressiontesting│No│││SecretscanningwithGitleaks│Yes│││Automations││Automations│││Dependencyupdatesprovider│renovatebot_app│││Auto-mergedependencyupdates│php,drupal_core,js,││││container_images,ci_tools,││││github_actions│││Codecoverageprovider│none│││Auto-assignPRauthor│Yes│││Auto-addaCONFLICTlabeltoPRs│Yes│││Documentation│││Preserveprojectdocumentation│Yes│││AI│││AIagentinstructions│Yes│││AIcodereview│No│││Locations│││Currentdirectory│/home/user/vortex/.artifa││││cts/tmp/videos-workspace│││Destinationdirectory│/home/user/vortex/.artifa││││cts/tmp/videos-workspace/star_wars│││Vortexrepository│/home/user/www/drevops/vortex2│││Vortexreference│HEAD││└──────────────────────────────────┴────────────────────────────────────────┘Vortexwillbeinstalledintoyourproject'sdirectory"/home/user/demo/star_wars"◆ProceedwithinstallingVortex?●Startingprojectinstallation◇DownloadingVortex│Downloadingfrom"/home/user/vortex"repositoryatref"HEAD"│✓Vortexdownloaded(develop)◇CustomizingVortexforyourproject│✓Vortexwascustomizedforyourproject◇Preparingdestinationdirectory│Createddirectory│"/home/user/demo/star_wars".│InitializinganewGitrepositoryindirectory│✓Destinationdirectoryisready◇Copyingfilestothedestinationdirectory│✓Filescopiedtodestinationdirectory◇Preparingdemocontent│Createddatadirectory│"/home/user/demo/star_wars/.│data".│Nodatabasedumpfilewasfoundin│data"directory.│Fetcheddemodatabasefrom│https://github.com/drevops/vortex/releases/download/1.40.0/db.demo.sql.│✓Democontentprepared│┌────────────────────────────────────────────────┐││FinishedinstallingVortex│││──────────────────────────│││Addandcommitallfiles:│││gitadd-A│││gitcommit-m"Initialcommit."││││││Files:402added│││Statusanddiffofeveryfilearerecordedin:│││.logs/vortex-install-2026-11-11-040935.md││└────────────────────────────────────────────────┘◆Runthesitebuildnow?││Readytobuild│││──────────────│││Buildthesite:│││ahoybuild│╚████╔╝╚██████╔╝██║██║██║╚████╔╝╚██████╔╝██║██║██║█││Youwillbeaskedafewquestionstotailorthec││Youwillbeaskedafewquestionstotailortheconfigu◇Pressanykeytocontinue...│starwars█│Wewilluse│Wewillusethisnameintheprojectan│We│Wewillu│S█│St█│Star█│Star█│StarW█│StarWa█│StarWars█◇Sitemachinename(2/32)│star_wars█│Wewillusethisnamefortheprojectdirectoryandinthecode.│StarWarsOrg█│StarWar│Wewilluseth◇Or◇Organizationmachinename◇Organizationmachinename(4/32)│rebellion█│Wewillusethisnameinthecode.│○Drupal│○DrupalCMS,installedfromprofile│fromtheDrupalCMSrecipe.│○Drupal,loadedfromthedemodatabase│Createsasitebyloadinganexistingdemodatabase│providedwiththeinstaller.│○Drupal,installedfromprofile│○DrupalCMS,installedfromprofile│❯●Drupal,loadedfromthedemodatabase│Use⬆and⬇.Appliesonlyonthefirstrunoftheinstaller.│◼│◼Fast404│◼Fieldgroup│↓19more│Use⬆,⬇andSpacebartoselectoneormoremodules.│◼Demo││star_wars█││Wewillusethisnameasacustomthemename│thesamemarkupthesite│Adevelopmentserverrunsondemandwith`ahoystorybook`.Astaticbuild│isproducedduringprovisioningandservedat`/storybook`inlocal,CI│anddevelopmentenvironments.│○Yes/●No│AddsStorybookpackagestothethemeandasteptoprovisioning.│○SemanticVersioning(SemVer)│major.minor.patch(E.g.,1.0.0)│https://semver.org│○Other│Customversioningschemeofyourchoice.│❯●CalendarVersioning(CalVer)│○SemanticVersioning(SemVer)│Use⬆and⬇toselectyourversionscheme.◆Releaseversioningscheme(13/32)│CalendarVersioning(CalVer)◇Services(15/32)│❯◼ClamAV│◼Solr│◼Redis│Use⬆,⬇andSpacebartoselectoneormoreservices.◇Developmenttools(16/32)│❯◼PHPCodeSniffer│◼PHPStan│◼Rector│◼ESLint│◼Stylelint│◼Jest│◼PHPUnit│◼Behat│◼TwigCSFixer│◼DCLint│↓1more│Use⬆,⬇andSpacebartoselectoneormoretools.◇Hostingprovider(17/32)│○AcquiaCloud│○Lagoon│Use⬆,⬇andSpacebartoselectyourhostingprovider.◇Customwebrootdirectory(18/32)│web█│Customdirectorywherethewebserverservesthesite.◇Deploymenttypes(19/32)│❯◻Codeartifact│◻Lagoonwebhook│◼Customwebhook│Use⬆,⬇andSpacebartoselectoneormoredeploymenttypes.│○│○Installfromprofile│Use⬆and⬇toselecttheprovisiontype.│◇Databasesource(20.1)│❯●URLdownload│○FTPdownload│○Acquiabackup│○Lagoonenvironment│○Containerregistry│○S3bucket│○None│Use⬆and⬇toselectthedatabasefetchsource.◇Useaseconddatabaseformigrations?(21/32)│AddsaseconddatabaseserviceforDrupalmigrations.◇Notificationchannels(22/32)│❯◼Email│◻GitHub│◻JIRA│◻NewRelic│◻Slack│◻Webhook│Use⬆,⬇andSpacebartoselectoneormorenotificationchannels.◇ContinuousIntegrationprovider(23/32)│❯●GitHubActions│○CircleCI│Use⬆and⬇toselecttheCIprovider.◇VisualregressiontestingwithDiffy?(24/32)│Diffy-poweredvisualregressionworkflowtocomparedeployedenvironments.│Automaticallytriggerscomparisonsfordependency-updatepullrequests│matchingtheconfiguredbranchpattern(`deps/*`bydefault).│Runscomparisonsforpullrequeststaggedwiththe`VR`labelandpostsa│stickycomment.│AlsosupportsmanualrunsagainstanyURL.│RequiresaDiffyaccount.◇ScanforcommittedsecretswithGitleaks?(25/32)│RunsinCItodetecthardcodedpasswords,APIkeysandtokens.◇Dependencyupdatesprovider(26/32)│❯●RenovateGitHubapp│○Renovateself-hostedinCI│Use⬆and⬇toselectthedependencyupdatesprovider.│◼CI│◼CItools(major,mi│◼CItools(major,minorandpatch)│◼GitHubActions(major,minorandpatch)│Use⬆,⬇andSpacebartoselectoneormoregroups.◇Codecoverageprovider(27/32)│○Codecov│Use⬆and⬇toselectthecodecoverageprovider.◇Auto-assigntheauthortotheirPR?(28/32)│HelpstokeepthePRsorganized.◇Auto-addaCONFLICTlabeltoaPRwhenconflictsoccur?(29/32)│HelpstokeepquicklyidentifyPRsthatneedattention.◇Preserveprojectdocumentation?(30/32)│Helpstomaintaintheprojectdocumentationwithintherepository.◇ProvideAIagentinstructions?(31/32)│ProvidesAIcodingagentswithbettercontextabouttheproject.◇ConfigureAIcodereviewwithCodeRabbit?(32/32)│RequirestheCodeRabbitappontherepository.││Organizationname││Organizationname│││Starter│load││Starter│load_demod│││redirect,reroute_│││redirect,reroute_email,r│├──────────────────────────────────┬──────│├──────────────────────────────────┬────────│├─│├───│├────│├───────││ContinuousInt││ContinuousIntegrati││Auto-assignPRauthor│││Auto-assignPRauthor│Yes│├────────────────────│├──────────────────────│├──────────────────────────────────┴───────────────────────────────│├──────────────────────────────────┴────────────────────────────────││Vortexrepository│/home/user/www/drevops/vorte││Vortexrepository│/home/user/www/drevops/vortex2◇Preparin││.logs/vortex-install-2026-11-11-040935││.logs/vortex-install-2026-11-11-040935.md◇Runthesitebuildnow?│Takes~5-10min;outputwillbestreamed.Youcanskipandrunlaterwith:│ahoybuild││SetupGitHubAction││SetupGitHubActions:││SetupGitHubActions:│││https://www.vortextemplate.com/docs/continuous-integration/github-actio│││ns#onboarding│ \ No newline at end of file +──────────────────────────────────────────────────────────────────────────────██╗██╗██████╗██████╗████████╗███████╗██╗██╗██║██║██╔═══██╗██╔══██╗╚══██╔══╝██╔════╝╚██╗██╔╝██║██║██║██║██████╔╝██║█████╗╚███╔╝╚██╗██╔╝██║██║██╔══██╗██║██╔══╝██╔██╗╚████╔╝╚██████╔╝██║██║██║███████╗██╔╝██╗╚═══╝╚═════╝╚═╝╚═╝╚═╝╚══════╝╚═╝╚═╝DrupalprojecttemplatebyDrevOpsInstallerversion:development│┌───────────────────────────────────────────────────────────────────────────┐││WelcometotheVortexinteractiveinstaller│││───────────────────────────────────────────│││Thistoolwillguideyouthroughinstallingthelatestdevelopment│││versionofVortexintoyourproject.││││││Youwillbeaskedafewquestionstotailortheconfigurationtoyour│││site.│││Nochangeswillbemadeuntilyouconfirmeverythingattheend.│││PressCtrl+Catanytimetoexittheinstaller.│││PressCtrl+Uatanytimetogobacktothepreviousstep.││└───────────────────────────────────────────────────────────────────────────┘│◇Validatingrepositoryandreference│Checkingrepository"/home/user/vortex"andreference"HEAD"│✓Repositoryandreferencevalidatedsuccessfully┌Generalinformation◇Sitename(1/32)│Wewillusethisnameintheprojectanddocumentation.│star█│E.g.MySite█│Wewillu│StarWar█◆Sitename(1/32)│StarWars◆Sitemachinename(2/32)│star_wars◇Organizationname(3/32)◇O│E.g.MyOrg█│E.g.MyO│Rebel█◆Organizationname(3/32)│Rebellion◆Organizationmachinename(4/32)│rebellion◆Publicdomain(5/32)│star-wars.com├Drupal◇Howwouldyoulikeyoursitetobecreatedonthefirstrun?(6/32)│Choosehowyoursitewillbecreatedthefirsttimeafterthisinstaller│finishes:│○Drupal,installedfromprofile│Createsanewsitebypopulatingafreshdatabase│fromoneofthestandardDrupalinstallationprofiles.│○DrupalCMS,installedfromprofile│fromtheDrupalCMSrecipe.│○Drupal,loadedfromthedemodatabase◆Howwouldyoulikeyoursitetobecreatedonthefirstrun?(6/32)│Drupal,loadedfromthedemodatabase◆Profile(7/32)│Standard◇Modules(8/32)│❯◼Coffee│◼Configsplit│◼Configupdate│◼Devel│◼Diff│◼Drupalhelpers│◼Entityusage│◼Environmentindicator◆Modules(8/32)│Coffee,Configsplit,Configupdate,Devel,Diff,Drupalhelpers,Entity│usage,Environmentindicator,Fast404,Fieldgroup,Generatedcontent,Gin│admintheme,Linkit,Menutrailbypath,Metatag,Navigationextratools,│Pathauto,Redirect,Rerouteemail,Robots.txt,Scheduledtransitions,│Schema.orgMetatag,SDCDevel,Seckit,Shield,Stagefileproxy,Testmode,│Viewsbulkoperations,XMLSitemap◆Custommodulesprefix(9/32)│sw◇Custommodules(10/32)│Selectwhichcustommodulestoincludeinyourproject:│○Base│Startermodulewithdeployhooksandtestscaffoldingfor│Unit,Kernel,Functional,andFunctionalJavascripttests.│○Search│CustomSolrsearchintegrationmodule.RequirestheSolr│servicetobeselected.│○Demo│DemonstrateshowVortextoolingworks:includesacounter│blockwithCSS/JS,PHPUnitexampletestsacrossalltest│types,andaBehatfeature.Safetoremoveonrealprojects.│❯◼Base-startermodulewithutilitiesandtestscaffolding│◼Search-customSolrsearchintegration◆Custommodules(10/32)│Base-startermodulewithutilitiesandtestscaffolding,Search-custom│Solrsearchintegration,Demo-counterblockandexampleteststo│demonstratetooling◆Theme(11/32)│Custom(nextprompt)│││◇Customthememachinename(11.1)│◆Customthememachinename(11.1)││star_wars│◆Buildfront-endassetsinthecontainer?(11.2)││Yes│◇Storybookcomponentlibrary?(11.3)│Componentlibraryforthecustomtheme,renderedbyDrupalitself.│StoriesareauthoredinTwignexttoeachcomponent,sothelibraryshows│thesamemarkupthesiterenders.│◆Storybookcomponentlibrary?(11.3)│No├Coderepository◆Repositoryprovider(12/32)│GitHub◇Releaseversioningscheme(13/32)│Chooseyourversioningscheme:│○CalendarVersioning(CalVer)│year.month.patch(E.g.,24.1.0)│https://calver.org│○Other◆Releaseversioningscheme(13/32)│CalendarVersioning(CalVer)├Environment│UTC◆Timezone(14/32)◆Services(15/32)│ClamAV,Redis,Solr◆Developmenttools(16/32)│Behat,DCLint,ESLint,Hadolint,Jest,PHPCodeSniffer,PHPStan,PHPUnit,│Rector,Stylelint,TwigCSFixer├Hosting│❯●None◆Hostingprovider(17/32)│None◆Customwebrootdirectory(18/32)│web├Deployment◆Deploymenttypes(19/32)│Customwebhook├Workflow◇Provisiontype(20/32)│Provisioningsetsupthesiteinanenvironmentusinganalreadyassembled│codebase.│○Importfromdatabasedump│Provisionsthesitebyimportingadatabasedump│typicallycopiedfromproductionintolower│environments.│○Installfromprofile│ProvisionsthesitebyinstallingafreshDrupal│sitefromaprofileeverytimeanenvironmentis│created.│❯●Importfromdatabasedump◆Provisiontype(20/32)│Importfromdatabasedump│◆Databasesource(20.1)│URLdownload│○Yes/●No◆Useaseconddatabaseformigrations?(21/32)│No├Notifications◆Notificationchannels(22/32)│Email├ContinuousIntegration│○None◆ContinuousIntegrationprovider(23/32)│GitHubActions◆VisualregressiontestingwithDiffy?(24/32)│●Yes/○No◆ScanforcommittedsecretswithGitleaks?(25/32)│Yes├Automations◆Dependencyupdatesprovider(26/32)│RenovateGitHubapp│◇Auto-mergedependencyupdates(26.1)│Pullrequestsintheselectedgroupsaremergedassoonastheymeetthe│branchprotectionrules.Pullrequestsinothergroupsneedamanual│merge.│Requires"Allowauto-merge"intherepositorysettingsandatleastone│requiredstatuscheckonthebasebranch.│❯◼PHPpackages,exceptDrupalcore(minorandpatch)│◼Drupalcore(minorandpatch)│◼JavaScriptpackages(minorandpatch)│◼Containerimages(major,minorandpatch)│◆Auto-mergedependencyupdates(26.1)│PHPpackages,exceptDrupalcore(minorandpatch),Drupalcore(minorand│patch),JavaScriptpackages(minorandpatch),Containerimages(major,│minorandpatch),CItools(major,minorandpatch),GitHubActions│(major,minorandpatch)◆Codecoverageprovider(27/32)◆Auto-assigntheauthortotheirPR?(28/32)◆Auto-addaCONFLICTlabeltoaPRwhenconflictsoccur?(29/32)├Documentation◆Preserveprojectdocumentation?(30/32)├AI◆ProvideAIagentinstructions?(31/32)◆ConfigureAIcodereviewwithCodeRabbit?(32/32)●Installationsummary││Generalinformation││├──────────────────────────────────┬────────────────────────────────────────┤││Sitename│StarWars│││Sitemachinename│star_wars│││Organizationname│Rebellion│││Organizationmachinename│rebellion│││Publicdomain│star-wars.com││├──────────────────────────────────┴────────────────────────────────────────┤││Drupal│││Starter│load_demodb│││Modules│coffee,config_split,config_update,││││devel,diff,drupal_helpers,││││entity_usage,environment_indicator,││││fast_404,field_group,││││generated_content,gin,linkit,││││menu_trail_by_path,metatag,││││navigation_extra_tools,pathauto,││││redirect,reroute_email,robotstxt,││││scheduled_transitions,schema_metatag,││││sdc_devel,seckit,shield,││││stage_file_proxy,testmode,││││views_bulk_operations,xmlsitemap│││Webroot│web│││Profile│standard│││Moduleprefix│sw│││Custommodules│base,search,demo│││Thememachinename│star_wars│││Buildfront-endincontainer│Yes│││Storybookcomponentlibrary│No│││Coderepository│││Codeprovider│github│││Versionscheme│calver│││Environment│││Timezone│UTC│││Services│clamav,redis,solr│││Tools│behat,dclint,eslint,hadolint,jest,││││phpcs,phpstan,phpunit,rector,││││stylelint,twig_cs_fixer│││Hosting│││Hostingprovider│none│││Deployment│││Deploymenttypes│webhook│││Workflow│││Provisiontype│database│││Databasesource│url│││Migrationdatabase││Migrationdatabase│No│││Notifications│││Channels│email│││ContinuousIntegration│││CIprovider│gha│││Visualregressiontesting│No│││SecretscanningwithGitleaks│Yes│││Automations│││Dependencyupdatesprovider│renovatebot_app│││Auto-mergedependencyupdates│php,drupal_core,js,││││container_images,ci_tools,││││github_actions│││Codecoverageprovider│none││Codecoverageprovider│none│││Auto-assignPRauthor│Yes│││Auto-addaCONFLICTlabeltoPRs│Yes│││Documentation│││Preserveprojectdocumentation│Yes││Preserveprojectdocumentation│Yes│││AI│││AIagentinstructions│Yes│││AIcodereview│No│││Locations│││Currentdirectory│/home/user/vortex/.artifa││││cts/tmp/videos-workspace│││Destinationdirectory│/home/user/vortex/.artifa││││cts/tmp/videos-workspace/star_wars│││Vortexrepository│/home/user/vortex│││Vortexreference│HEAD││└──────────────────────────────────┴────────────────────────────────────────┘Vortexwillbeinstalledintoyourproject'sdirectory"/home/user/demo/star_wars"◆ProceedwithinstallingVortex?●Startingprojectinstallation◇DownloadingVortex│Downloadingfrom"/home/user/vortex"repositoryatref"HEAD"│✓Vortexdownloaded(develop)◇CustomizingVortexforyourproject│✓Vortexwascustomizedforyourproject◇Preparingdestinationdirectory│Createddirectory│"/home/user/demo/star_wars".│InitializinganewGitrepositoryindirectory│✓Destinationdirectoryisready◇Copyingfilestothedestinationdirectory│✓Filescopiedtodestinationdirectory◇Preparingdemocontent│Createddatadirectory│"/home/user/demo/star_wars/.│data".│Nodatabasedumpfilewasfoundin│data"directory.│Fetcheddemodatabasefrom│https://github.com/drevops/vortex/releases/download/1.40.0/db.demo.sql.│✓Democontentprepared│┌────────────────────────────────────────────────┐││FinishedinstallingVortex│││──────────────────────────│││Addandcommitallfiles:│││gitadd-A│││gitcommit-m"Initialcommit."││││││Files:402added│││Statusanddiffofeveryfilearerecordedin:│││.logs/vortex-install-2026-11-11-060826.md││└────────────────────────────────────────────────┘◆Runthesitebuildnow?││Readytobuild│││──────────────│││Buildthesite:│││ahoybuild│╚████╔╝╚██████╔╝██║██║██║╚████╔╝╚██████╔╝██║██║██║█││Youwillbeaskedafewquestionstotailorthec││Youwillbeaskedafewquestionstotailortheconfigu◇Pressanykeytocontinue...│starwars█│Wewilluse│Wewillusethisnameintheprojectan│We│S█│St█│Sta█│Star█│Star█│StarW█│StarWa█│StarWars█◇Sitemachinename(2/32)│star_wars█│Wewillusethisnamefortheprojectdirectoryandinthecode.│StarWarsOrg█│StarWar│Wewillusethisnamei│Wewillusethisnameintheprojectanddocumentat│E.g.MyOrg│Wewilluseth│Rebell█◆Organization◇Publicdomain(5/32)│star-wars.com█│Domainnamewithoutprotocolandtrailingslash.│Createsasitebyloadinganexistingdemodatabase│providedwiththeinstaller.│○Drupal,installedfromprofile│○DrupalCMS,installedfromprofile│❯●Drupal,loadedfromthedemodatabase│Use⬆and⬇.Appliesonlyonthefirstrunoftheinstaller.│◼│◼Fast404│◼Fieldgroup│↓19more│Use⬆,⬇andSpacebartoselectoneormoremodules.│◼Demo││star_wars█││Wewillusethisnameasacustomthemename│thesamemarkupthesite│Adevelopmentserverrunsondemandwith`ahoystorybook`.Astaticbuild│isproducedduringprovisioningandservedat`/storybook`inlocal,CI│anddevelopmentenvironments.│○Yes/●No│AddsStorybookpackagestothethemeandasteptoprovisioning.│○SemanticVersioning(SemVer)│major.minor.patch(E.g.,1.0.0)│https://semver.org│○Other│Customversioningschemeofyourchoice.│❯●CalendarVersioning(CalVer)│○SemanticVersioning(SemVer)│Use⬆and⬇toselectyourversionscheme.◇Timezone(14/32)│UTC█│Etc/UTC│Use⬆and⬇,orstarttypingtoselectthetimezoneforyourproject.◇Services(15/32)│❯◼ClamAV│◼Solr│◼Redis│Use⬆,⬇andSpacebartoselectoneormoreservices.◇Developmenttools(16/32)│❯◼PHPCodeSniffer│◼PHPStan│◼Rector│◼ESLint│◼Stylelint│◼Jest│◼PHPUnit│◼Behat│◼TwigCSFixer│◼DCLint│↓1more│Use⬆,⬇andSpacebartoselectoneormoretools.◇Hostingprovider(17/32)│○AcquiaCloud│○Lagoon│Use⬆,⬇andSpacebartoselectyourhostingprovider.◇Customwebrootdirectory(18/32)│web█│Customdirectorywherethewebserverservesthesite.◇Deploymenttypes(19/32)│❯◻Codeartifact│◻Lagoonwebhook│◼Customwebhook│Use⬆,⬇andSpacebartoselectoneormoredeploymenttypes.│○│○Installfromprofile│Use⬆and⬇toselecttheprovisiontype.│◇Databasesource(20.1)│❯●URLdownload│○FTPdownload│○Acquiabackup│○Lagoonenvironment│○Containerregistry│○S3bucket│○None│Use⬆and⬇toselectthedatabasefetchsource.◇Useaseconddatabaseformigrations?(21/32)│AddsaseconddatabaseserviceforDrupalmigrations.◇Notificationchannels(22/32)│❯◼Email│◻GitHub│◻JIRA│◻NewRelic│◻Slack│◻Webhook│Use⬆,⬇andSpacebartoselectoneormorenotificationchannels.◇ContinuousIntegrationprovider(23/32)│❯●GitHubActions│○CircleCI│Use⬆and⬇toselecttheCIprovider.◇VisualregressiontestingwithDiffy?(24/32)│Diffy-poweredvisualregressionworkflowtocomparedeployedenvironments.│Automaticallytriggerscomparisonsfordependency-updatepullrequests│matchingtheconfiguredbranchpattern(`deps/*`bydefault).│Runscomparisonsforpullrequeststaggedwiththe`VR`labelandpostsa│stickycomment.│AlsosupportsmanualrunsagainstanyURL.│RequiresaDiffyaccount.◇ScanforcommittedsecretswithGitleaks?(25/32)│RunsinCItodetecthardcodedpasswords,APIkeysandtokens.◇Dependencyupdatesprovider(26/32)│❯●RenovateGitHubapp│○Renovateself-hostedinCI│Use⬆and⬇toselectthedependencyupdatesprovider.│◼CI│◼CItools(major,mi│◼CItools(major,minorandpatch)│◼GitHubActions(major,minorandpatch)│Use⬆,⬇andSpacebartoselectoneormoregroups.◇Codecoverageprovider(27/32)│○Codecov│Use⬆and⬇toselectthecodecoverageprovider.◇Auto-assigntheauthortotheirPR?(28/32)│HelpstokeepthePRsorganized.◇Auto-addaCONFLICTlabeltoaPRwhenconflictsoccur?(29/32)│HelpstokeepquicklyidentifyPRsthatneedattention.◇Preserveprojectdocumentation?(30/32)│Helpstomaintaintheprojectdocumentationwithintherepository.◇ProvideAIagentinstructions?(31/32)│ProvidesAIcodingagentswithbettercontextabouttheproject.◇ConfigureAIcodereviewwithCodeRabbit?(32/32)│RequirestheCodeRabbitappontherepository.││Sitemachinename│sta││Sitemachinename│star_wars│├──────────────────────────────────┬───────────────────────────────│├──────────────────────────────────┬─────────────────────────────────│││navigation_extra_tools,pathaut│││navigation_extra_tools,pathauto,│├──────────────────────────────────┬───│├──────────────────────────────────┬─────│├───│├─────││Deploymentt││Deploymenttypes│├──────────────────────────────────┴────────────────────│├──────────────────────────────────┴──────────────────────│├──────────────────────────────────┴───────────────────────│├──────────────────────────────────┴──────────────────────────│├────────────────────────────│├──────────────────────────────│││cts/tmp/videos-workspace/star_wars◇ProceedwithinstallingVortex?│✓Fi││.logs/vortex-install-2026-11-11-060826││.logs/vortex-install-2026-11-11-060826.md◇Runthesitebuildnow?│Takes~5-10min;outputwillbestreamed.Youcanskipandrunlaterwith:│ahoybuild││SetupGitHubAction││SetupGitHubActions:││SetupGitHubActions:│││https://www.vortextemplate.com/docs/continuous-integration/github-actio│││ns#onboarding│ \ No newline at end of file