diff --git a/.ahoy.yml b/.ahoy.yml
index 8638f2e2e..10173e3ac 100644
--- a/.ahoy.yml
+++ b/.ahoy.yml
@@ -159,6 +159,15 @@ commands:
docker compose build database
ahoy up
+ #;< MIGRATION
+ reload-db2:
+ usage: Reload the migration database container using local database image.
+ cmd: |
+ ahoy confirm "Running this command will replace your current database. Are you sure?" || exit 0
+ docker compose rm --force --stop --volumes database2
+ ahoy up -- --build database2
+ #;> MIGRATION
+
provision:
usage: Provision a site from the database dump or profile.
cmd: |
diff --git a/.env b/.env
index cde00cf35..559cad584 100644
--- a/.env
+++ b/.env
@@ -253,6 +253,12 @@ VORTEX_DOWNLOAD_DB2_FILE=db2.sql
# Second database download source.
VORTEX_DOWNLOAD_DB2_SOURCE=url
+#;< MIGRATION_DB_DOWNLOAD_SOURCE_CONTAINER_REGISTRY
+# Name of the pre-built migration database container image.
+# @see https://github.com/drevops/mariadb-drupal-data to seed your DB image.
+# VORTEX_DB2_IMAGE=your_org/your_site-migration:latest
+#;> MIGRATION_DB_DOWNLOAD_SOURCE_CONTAINER_REGISTRY
+
#;< MIGRATION_DB_DOWNLOAD_SOURCE_URL
# Second database dump file sourced from a URL.
#
diff --git a/.vortex/docs/static/img/installer.json b/.vortex/docs/static/img/installer.json
index 3a2a47041..d6a415942 100644
--- a/.vortex/docs/static/img/installer.json
+++ b/.vortex/docs/static/img/installer.json
@@ -1,215 +1,217 @@
-{"version":2,"width":120,"height":36,"timestamp":1773116471,"command":"/home/user/www/demo/installer_automation.exp","title":"Vortex Installer Demo","env":{"SHELL":"/opt/homebrew/opt/bash/bin/bash"}}
-[0.517789, "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 ╚██╗ ██╔╝ █"]
-[0.517794, "o", "█║ "]
-[0.517885, "o", " ██║ ██╔══██╗ ██║ ██╔══╝ ██╔██╗\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 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────────────────────────────────────────────────────────────────────────────────────────────────────────────────"]
-[0.51794, "o", "──"]
-[0.51799, "o", "────\u001b[39m\r\r\n \u001b[2m Installer version: development\u001b[22m\r\r\n\r\r\n"]
-[0.525704, "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[4mstable\u001b[0m version of Vortex into\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m your project.\u001b[39m\u001b[39m "]
-[0.525716, "o", " "]
-[0.525826, "o", " \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 You will be asked a few questions to tailor the configuration to your 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.528529, "o", "───"]
-[0.529816, "o", "──────────────────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n \u001b[2mPress any key to continue...\u001b[22m\r\r\n"]
-[3.541331, "o", "\r\r\n \u001b[46m\u001b[30m General information \u001b[39m\u001b[49m\r\r\n\r\r\n"]
-[3.554618, "o", "\u001b[?25l"]
-[3.560077, "o", "\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mSite name \u001b[2m(1/32)\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.715182, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mSite name \u001b[2m(1/32)\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 └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m We will use this name in the project and documentation.\u001b[39m\r\r\n"]
-[4.805471, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mSite name \u001b[2m(1/32)\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/32)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m St\u001b[7m \u001b[27m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └─────────────────────────────────────"]
-[4.805519, "o", "──"]
-[4.805595, "o", "───────────────────────┘\u001b[39m\r\r\n\u001b[90m We will use this name in the project and documentation.\u001b[39m\r\r\n"]
-[5.805824, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mSite name \u001b[2m(1/32)\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.8088, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mSite name \u001b[2m(1/32)\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.808903, "o", "\u001b[?25h"]
-[5.828903, "o", "\u001b[?25l"]
-[5.831616, "o", "\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mSite machine name \u001b[2m(2/32)\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.844153, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mSite machine name \u001b[2m(2/32)\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.861117, "o", "\u001b[?25l"]
-[6.863699, "o", "\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mOrganization name \u001b[2m(3/32)\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"]
-[7.014227, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mOrganization name \u001b[2m(3/32)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Star Wars Or\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/32)\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 └────────────────────────────────────────────"]
-[7.014233, "o", "───"]
-[7.50651, "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/32)\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/32)\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.506579, "o", "────"]
-[7.506684, "o", "─────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m We will use this name in the project and documentation.\u001b[39m\r\r\n"]
-[8.509839, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mOrganization name \u001b[2m(3/32)\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.51355, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mOrganization name \u001b[2m(3/32)\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/32)\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.513879, "o", "de.\u001b[39m\r"]
-[9.514028, "o", "\r\r\n"]
-[10.514494, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mOrganization machine name \u001b[2m(4/32)\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/32)\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.516065, "o", "tocol and"]
-[10.518039, "o", " trailing slash.\u001b[39m\r\r\n"]
-[11.521392, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mPublic domain \u001b[2m(5/32)\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/32)\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 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.52141, "o", " "]
-[11.521514, "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.521523, "o", "g an exist"]
-[12.522382, "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.522395, "o", "──"]
-[12.522497, "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.526705, "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/32)\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 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.526714, "o", " "]
-[13.526815, "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.526824, "o", " "]
-[13.526923, "o", " \u001b[90m│\u001b[39m\r\r\n\u001b[90m └─────────────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"]
-[14.531913, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mProfile \u001b[2m(7/32)\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.532257, "o", "\u001b[1G\u001b[8A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mProfile \u001b[2m(7/32)\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/32)\u001b[22m\u001b[39m \u001b[90m──────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m› ◼\u001b[39m Admin toolbar \u001b[36m┃\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mCoffee\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mConfig spli"]
-[15.532267, "o", "t\u001b[22m "]
-[15.532531, "o", " \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mConfig update\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[2mPathauto\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mRedirect\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mRobots.txt\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mSeckit\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mShield\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └───────────────────────"]
-[15.53258, "o", "───"]
-[16.536962, "o", "─────────────────────── 12 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/32)\u001b[22m\u001b[22m \u001b[90m──────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Admin toolbar \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 Environment indicator \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"]
-[16.536968, "o", "\r\n\u001b[90m │"]
-[16.537056, "o", "\u001b[39m Robots.txt \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 XML Sitemap \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"]
-[17.539539, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mCustom modules prefix \u001b[2m(9/32)\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/32)\u001b[22m\u001b[22m \u001b[90m────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m sw \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b"]
-[17.539558, "o", "[39m\r\r\n\r\r\n"]
-[17.539668, "o", "\u001b[?25h"]
-[18.539924, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mCustom modules \u001b[2m(10/32)\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.53997, "o", "m │\u001b[39m"]
-[18.540062, "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.54007, "o", "───"]
-[18.540194, "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.547132, "o", "\u001b[1G\u001b[25A\u001b[J"]
-[19.547178, "o", "\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mCustom modules \u001b[2m(10/32)\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[39m ○"]
-[19.547184, "o", " \u001b[1mSearc"]
-[19.547302, "o", "h\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.547312, "o", "───"]
-[19.547409, "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.547764, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mTheme \u001b[2m(11/32)\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.551016, "o", "\u001b[1G\u001b[8A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mTheme \u001b[2m(11/32)\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/32)\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.551348, "o", " this nam"]
-[21.551498, "o", "e as a custom theme name\u001b[39m\r\r\n"]
-[22.555447, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mCustom theme machine name \u001b[2m(12/32)\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\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(13/32)\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 "]
-[22.555508, "o", " "]
-[22.55557, "o", " \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│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆ and ⬇ to select your code repository provider.\u001b[39m\r\r\n"]
-[23.559579, "o", "\u001b[1G\u001b[11A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mRepository provider \u001b[2m(13/32)\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 └────────────────────────────────────────────────────"]
-[23.559601, "o", "───"]
-[23.559707, "o", "───────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"]
-[24.564386, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mRelease versioning scheme \u001b[2m(14/32)\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) "]
-[24.564428, "o", " "]
-[24.564505, "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"]
-[24.564537, "o", "[90m│\u001b["]
-[24.564738, "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"]
-[25.568853, "o", "\u001b[1G\u001b[22A\u001b[J"]
-[25.56891, "o", "\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mRelease versioning scheme \u001b[2m(14/32)\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) "]
-[25.568915, "o", " \u001b"]
-[25.569034, "o", "[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"]
-[26.573054, "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(15/32)\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"]
-[27.573452, "o", "\u001b[1G\u001b[7A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mTimezone \u001b[2m(15/32)\u001b[22m\u001b[22m \u001b[90m────────────────────────────────────────────┐\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\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mServices \u001b[2m(16/32)\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 "]
-[27.573463, "o", " "]
-[27.573647, "o", " \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"]
-[28.573783, "o", "\u001b[1G\u001b[7A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mServices \u001b[2m(16/32)\u001b[22m\u001b[22m \u001b[90m────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[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\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mDevelopment tools \u001b[2m(17/32)\u001b[22m\u001b[39m \u001b[90m───────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m› ◼\u001b[39m PHP CodeSniffer \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼"]
-[28.573789, "o", "\u001b[39m \u001b[2m"]
-[28.573922, "o", "PHPStan\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mRector\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mPHP Mess Detector\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mESLint\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mStylelint\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mPHPUnit\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mBehat\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 tools."]
-[28.573929, "o", "\u001b[39m\r\r\n"]
-[29.574207, "o", "\u001b[1G\u001b[12A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mDevelopment tools \u001b[2m(17/32)\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 PHP Mess Detector \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 PHPUnit \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Behat \u001b[90m│\u001b[39m\r\r\n\u001b[90m └────────────────────────────"]
-[29.574258, "o", "───"]
-[29.574338, "o", "───────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"]
-[30.574592, "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(18/32)\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\u001b[1G\u001b[8A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mHosting provider \u001b[2m(18/32)"]
-[30.574602, "o", "\u001b[22m\u001b[22m \u001b"]
-[30.574772, "o", "[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"]
-[31.574959, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mCustom web root directory \u001b[2m(19/32)\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 server serves the site.\u001b[39m\r\r\n\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mCustom web root directory \u001b[2m(19/32)\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"]
-[31.574972, "o", "\r\n\r\r\n\u001b[?25"]
-[31.575046, "o", "h"]
-[32.57668, "o", "\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(20/32)\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[2m◻\u001b[22m \u001b[2mContainer image\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mCustom webhook\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 deployment types.\u001b[39m\r\r\n\u001b[1G\u001b[8A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mDeployment types \u001b[2m(20/32"]
-[32.576704, "o", ")\u001b[22m\u001b[22m "]
-[32.577049, "o", "\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"]
-[33.581623, "o", "\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(21/32)\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 │\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 "]
-[33.581706, "o", " "]
-[33.581783, "o", " \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 ├──────────────────────────────────────────────────────────────┤\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 └────────────────────────"]
-[33.581794, "o", "───"]
-[33.581875, "o", "───────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆ and ⬇ to select the provision type.\u001b[39m\r\r\n"]
-[34.585248, "o", "\u001b[1G\u001b[21A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mProvision type \u001b[2m(21/32)\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 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 │\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 "]
-[34.585255, "o", "\u001b[90m│\u001b["]
-[34.585378, "o", "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 ├──────────────────────────────────────────────────────────────┤\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"]
-[35.589607, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mDatabase source \u001b[2m(22/32)\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 \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 └───────────"]
-[35.589665, "o", "───"]
-[35.589744, "o", "────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆ and ⬇ to select the database download source.\u001b[39m\r\r\n"]
-[36.591467, "o", "\u001b[1G\u001b[11A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mDatabase source \u001b[2m(22/32)\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\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mUse a second database for migrations? \u001b[2m(23/32)\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 Drupa"]
-[36.59148, "o", "l migrati"]
-[36.591618, "o", "ons.\u001b[39m\r\r\n"]
-[37.592468, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mUse a second database for migrations? \u001b[2m(23/32)\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(24/32)\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 "]
-[37.592695, "o", "│\u001b[39m \u001b["]
-[37.592933, "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"]
-[38.593221, "o", "\u001b[1G\u001b[10A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mNotification channels \u001b[2m(24/32)\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(25/32)\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 "]
-[38.593227, "o", " \u001b["]
-[38.593315, "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"]
-[39.598408, "o", "\u001b[1G\u001b[7A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mContinuous Integration provider \u001b[2m(25/32)\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\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(26/32)\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"]
-[39.598688, "o", "\r\n\u001b[90m └"]
-[39.598975, "o", "──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆ and ⬇ to select the dependency updates provider.\u001b[39m\r\r\n"]
-[40.602357, "o", "\u001b[1G\u001b[7A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mDependency updates provider \u001b[2m(26/32)\u001b[22m\u001b[22m \u001b[90m─────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Renovate GitHub app \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(27/32)\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"]
-[41.606872, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mAuto-assign the author to their PR? \u001b[2m(27/32)\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(28/32)\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"]
-[42.609543, "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(28/32)\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(29/32)\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"]
-[42.609831, "o", " within the "]
-[42.610134, "o", "repository.\u001b[39m\r\r\n"]
-[43.610195, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mPreserve project documentation? \u001b[2m(29/32)\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(30/32)\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"]
-[43.610242, "o", " with better"]
-[43.610362, "o", " context about the project.\u001b[39m\r\r\n"]
-[44.615283, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mProvide AI agent instructions? \u001b[2m(30/32)\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"]
-[44.615389, "o", "[39m\r\r\n \u001b[90m"]
-[44.615458, "o", "│\u001b[39m\u001b[39m 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 "]
-[44.615469, "o", " "]
-[45.616597, "o", " \u001b[39m\u001b[90m│\u001b[39m\u001b[39m admin_toolbar, coffee, config_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, environment_indicator,\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 pathauto, redirect, robotstxt, seckit,\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, 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"]
-[45.61661, "o", "│\u001b[39m"]
-[45.616702, "o", "\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 \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 clamav,"]
-[45.61671, "o", " redis,"]
-[45.616805, "o", " 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, eslint, phpcs, phpmd, phpstan,\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 phpunit, rector, stylelint \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 \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[39"]
-[45.616836, "o", "m "]
-[45.61693, "o", " \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 \u001b[90m│\u001b[39m\u001b[39m CI provider \u001b[39m\u001b[90m│\u001b[39m\u001b[39m gha "]
-[45.616938, "o", " "]
-[45.617071, "o", " \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-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 "]
-[45.617077, "o", " "]
-[45.617206, "o", " \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 \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/www/demo \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/www/demo/star_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 https://github.com/drevops/vortex.git \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Vortex reference \u001b[39m\u001b[90m│\u001b[39m\u001b[39m stable \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m└────────────────────────────────────┴─────"]
-[45.61721, "o", "───"]
-[45.617326, "o", "────────────────────────────────┘\u001b[39m\r\r\n\r\r\n Vortex will be installed into your project's directory \"/home/user/www/demo/star_wars\"\r\r\n"]
-[47.622707, "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"]
-[49.624583, "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[1G\u001b[2A\u001b[J\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[1G\u001b[2A\u001b[J\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[1G\u001b[2A\u001b[J\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[1G\u001b[2A"]
-[49.624598, "o", "\u001b[J\r\r\n \u001b[36m⠂\u001b[39m \u001b[33"]
-[50.624981, "o", "mDownloading 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[1G\u001b[2A\u001b[J\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[1G\u001b[2A\u001b[J\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[1G\u001b[2A\u001b[J\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 \"https://github.com/drevops/vortex.git\" repository at ref \"stable\"\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 (1.36.1)\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[2A\u001b[J\r\r\n \u001b[36m⠒\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠐\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠰\u001b[39m \u001b[33mCustomizing Vortex for your pr"]
-[50.62547, "o", "oject\u001b[39m\r\r\n\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠠\u001b[39m "]
-[50.62609, "o", "\u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
-[50.708306, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠤\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
-[50.822455, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠄\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
-[50.911758, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠆\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
-[50.98969, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠂\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
-[51.09997, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠒\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
-[51.184001, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠐\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
-[51.26869, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠰\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
-[51.358061, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠠\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
-[51.447303, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠤\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
-[51.533145, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠄\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
-[51.613215, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠆\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
-[51.693706, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠂\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
-[51.773807, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠒\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
-[51.859388, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠐\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
-[51.880407, "o", "\u001b[999D\u001b[2A\u001b[J"]
-[51.880553, "o", "\u001b[?25h"]
-[51.880622, "o", "\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"]
-[51.880916, "o", "\u001b[?25l"]
-[51.90899, "o", "\r\r\n \u001b[36m⠂\u001b[39m \u001b[33mPreparing destination directory\u001b[39m\r\r\n"]
-[51.94535, "o", "\u001b[999D\u001b[2A\u001b[J\u001b[?25h"]
-[51.945493, "o", "\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/www/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[2mInitialising a new Git repository in directory \"/home/user/www/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"]
-[51.945592, "o", "\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"]
-[51.962719, "o", "\r\r\n \u001b[36m⠂\u001b[39m \u001b[33mCopying files to the destination directory\u001b[39m\r\r\n"]
-[52.131163, "o", "\u001b[1G\u001b[2A\u001b[J"]
-[52.131193, "o", "\r\r\n \u001b[36m⠒\u001b[39m \u001b[33mCopying files to the destination directory\u001b[39m\r\r\n"]
-[52.192436, "o", "\u001b[999D\u001b[2A\u001b[J\u001b[?25h"]
-[52.192872, "o", "\r\r\n \u001b[34m✦ Copying files to the 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[32m✓ Files copied to destination directory\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"]
-[52.29551, "o", "\r\r\n \u001b[36m⠂\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"]
-[52.401033, "o", "\u001b[1G\u001b[2A\u001b[J"]
-[52.401198, "o", "\r\r\n \u001b[36m⠒\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"]
-[52.488519, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠐\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"]
-[52.570155, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠰\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"]
-[52.659404, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠠\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"]
-[52.750133, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠤\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"]
-[52.8351, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠄\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"]
-[52.922396, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠆\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"]
-[53.003941, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠂\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"]
-[53.095637, "o", "\u001b[1G\u001b[2A\u001b[J"]
-[53.095714, "o", "\r\r\n \u001b[36m⠒\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"]
-[53.130863, "o", "\u001b[999D\u001b[2A"]
-[53.131893, "o", "\u001b[J\u001b[?25h"]
-[53.131979, "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/www/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/www/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[2mDownloaded demo database from https://github.com/drevops/vortex/releases/download/25.4.0/db_d11.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"]
-[53.157367, "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"]
-[53.183874, "o", "\u001b[?25l"]
-[53.200126, "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: ahoy build\u001b[39m\r\r\n"]
-[55.203666, "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"]
-[55.21618, "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"]
-[55.216195, "o", " \u001b[39m\u001b"]
-[55.216277, "o", "[39m \u001b[39m\u001b[90m│\u001b[39m\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 https://www.vortextemplate.com/docs/continuous-integration/github-actions#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"]
-[55.227786, "x", "0"]
+{"version":2,"width":120,"height":36,"timestamp":1774428358,"command":"/home/user/www/demo/installer_automation.exp","title":"Vortex Installer Demo","env":{"SHELL":"/opt/homebrew/opt/bash/bin/bash"}}
+[0.465661, "o", "Xdebug: [Step Debug] Could not connect to debugging client. Tried: localhost:9003 (through xdebug.client_host/xdebug.client_port).\r\r\n"]
+[0.538531, "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 ╚██╗ ██╔╝ █"]
+[0.538541, "o", "█║ "]
+[0.538712, "o", " ██║ ██╔══██╗ ██║ ██╔══╝ ██╔██╗\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 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────────────────────────────────────────────────────────────────────────────────────────────────────────────────"]
+[0.538734, "o", "──"]
+[0.538862, "o", "────\u001b[39m\r\r\n \u001b[2m Installer version: development\u001b[22m\r\r\n\r\r\n"]
+[0.544317, "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[4mstable\u001b[0m version of Vortex into\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m your project.\u001b[39m\u001b[39m "]
+[0.544567, "o", " "]
+[0.544635, "o", " \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 You will be asked a few questions to tailor the configuration to your 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.544713, "o", "───"]
+[0.544899, "o", "──────────────────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n \u001b[2mPress any key to continue...\u001b[22m\r\r\n"]
+[3.57152, "o", "\r\r\n \u001b[46m\u001b[30m General information \u001b[39m\u001b[49m\r\r\n\r\r\n"]
+[3.586465, "o", "\u001b[?25l"]
+[3.600889, "o", "\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mSite name \u001b[2m(1/32)\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.757799, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mSite name \u001b[2m(1/32)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m st\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/32)\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.760095, "o", "──"]
+[5.093015, "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/32)\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/32)\u001b[22m\u001b[39m \u001b[90m────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m St\u001b[7m \u001b[27m "]
+[5.093122, "o", " "]
+[5.093142, "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"]
+[6.097856, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mSite name \u001b[2m(1/32)\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"]
+[6.114647, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mSite name \u001b[2m(1/32)\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"]
+[6.114935, "o", "\u001b[?25h"]
+[6.159797, "o", "\u001b[?25l"]
+[6.181779, "o", "\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mSite machine name \u001b[2m(2/32)\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"]
+[7.197929, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mSite machine name \u001b[2m(2/32)\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"]
+[7.197998, "o", "\u001b[?25h"]
+[7.315518, "o", "\u001b[?25l"]
+[7.317586, "o", "\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mOrganization name \u001b[2m(3/32)\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"]
+[7.471963, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mOrganization name \u001b[2m(3/32)\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\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mOrganization name \u001b[2m(3/32)\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 └────────────────────────────────────────────"]
+[7.472193, "o", "───"]
+[8.280221, "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/32)\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/32)\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 └─────"]
+[8.280228, "o", "────"]
+[8.280347, "o", "─────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m We will use this name in the project and documentation.\u001b[39m\r\r\n"]
+[9.284085, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mOrganization name \u001b[2m(3/32)\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"]
+[10.28849, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mOrganization name \u001b[2m(3/32)\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/32)\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"]
+[10.288523, "o", "de.\u001b[39m\r"]
+[10.288591, "o", "\r\r\n"]
+[11.293784, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mOrganization machine name \u001b[2m(4/32)\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/32)\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"]
+[11.293809, "o", "tocol and"]
+[11.294215, "o", " trailing slash.\u001b[39m\r\r\n"]
+[12.297267, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mPublic domain \u001b[2m(5/32)\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/32)\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 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 "]
+[12.297553, "o", " "]
+[12.297778, "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"]
+[12.298008, "o", "g an exist"]
+[13.303002, "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 └────────────────────────────────────────────────────────────"]
+[13.303012, "o", "──"]
+[13.303112, "o", "───────┘\u001b[39m\r\r\n\u001b[90m Use ⬆ and ⬇. Applies only on the first run of the installer.\u001b[39m\r\r\n"]
+[14.310798, "o", "\u001b[1G\u001b[24A\u001b[J"]
+[14.310865, "o", "\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mHow would you like your site to be created on the first run? \u001b[2m(6/32)\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 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 "]
+[14.310914, "o", " \u001b[90m│\u001b"]
+[14.310987, "o", "[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 "]
+[14.31106, "o", " "]
+[14.311112, "o", " \u001b[90m│\u001b[39m\r\r\n\u001b[90m └─────────────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"]
+[15.314013, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mProfile \u001b[2m(7/32)\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"]
+[16.323615, "o", "\u001b[1G\u001b[8A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mProfile \u001b[2m(7/32)\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/32)\u001b[22m\u001b[39m \u001b[90m──────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m› ◼\u001b[39m Admin toolbar \u001b[36m┃\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mCoffee\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mConfig spli"]
+[16.325395, "o", "t\u001b[22m "]
+[16.32719, "o", " \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mConfig update\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[2mPathauto\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mRedirect\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mRobots.txt\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mSeckit\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mShield\u001b[22m \u001b[90m│\u001b[39m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └───────────────────────"]
+[16.335799, "o", "───"]
+[17.330748, "o", "─────────────────────── 12 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/32)\u001b[22m\u001b[22m \u001b[90m──────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Admin toolbar \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 Environment indicator \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"]
+[17.331042, "o", "\r\n\u001b[90m │"]
+[17.331382, "o", "\u001b[39m Robots.txt \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 XML Sitemap \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"]
+[18.336162, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mCustom modules prefix \u001b[2m(9/32)\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/32)\u001b[22m\u001b[22m \u001b[90m────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m sw \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b"]
+[18.336229, "o", "[39m\r\r\n\r\r\n"]
+[18.336326, "o", "\u001b[?25h"]
+[19.336754, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mCustom modules \u001b[2m(10/32)\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"]
+[19.336787, "o", "m │\u001b[39m"]
+[19.336856, "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.336879, "o", "───"]
+[19.33701, "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"]
+[20.343298, "o", "\u001b[1G\u001b[25A\u001b[J"]
+[20.343418, "o", "\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mCustom modules \u001b[2m(10/32)\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[39m ○"]
+[20.343501, "o", " \u001b[1mSearc"]
+[20.343736, "o", "h\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 ├───────────────────────────────────────────────"]
+[20.343749, "o", "───"]
+[20.343928, "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"]
+[21.346681, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mTheme \u001b[2m(11/32)\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"]
+[22.347311, "o", "\u001b[1G\u001b[8A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mTheme \u001b[2m(11/32)\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/32)\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"]
+[22.347319, "o", " this nam"]
+[22.347422, "o", "e as a custom theme name\u001b[39m\r\r\n"]
+[23.350974, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mCustom theme machine name \u001b[2m(12/32)\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\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(13/32)\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 "]
+[23.351071, "o", " "]
+[23.351163, "o", " \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│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆ and ⬇ to select your code repository provider.\u001b[39m\r\r\n"]
+[24.355178, "o", "\u001b[1G\u001b[11A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mRepository provider \u001b[2m(13/32)\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 └────────────────────────────────────────────────────"]
+[24.355332, "o", "───"]
+[24.355381, "o", "───────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"]
+[25.356766, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mRelease versioning scheme \u001b[2m(14/32)\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) "]
+[25.356835, "o", " "]
+[25.35697, "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"]
+[25.356984, "o", "[90m│\u001b["]
+[25.357117, "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"]
+[26.365771, "o", "\u001b[1G\u001b[22A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mRelease versioning scheme \u001b[2m(14/32)\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) "]
+[26.365828, "o", " "]
+[26.365928, "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"]
+[27.370149, "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(15/32)\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"]
+[28.371746, "o", "\u001b[1G\u001b[7A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mTimezone \u001b[2m(15/32)\u001b[22m\u001b[22m \u001b[90m────────────────────────────────────────────┐\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\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mServices \u001b[2m(16/32)\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 "]
+[28.371854, "o", " "]
+[28.371995, "o", " \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"]
+[29.383486, "o", "\u001b[1G\u001b[7A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mServices \u001b[2m(16/32)\u001b[22m\u001b[22m \u001b[90m────────────────────────────────────────────┐\u001b[39m\r\r\n\u001b[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\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mDevelopment tools \u001b[2m(17/32)\u001b[22m\u001b[39m \u001b[90m───────────────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m› ◼\u001b[39m PHP CodeSniffer \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼"]
+[29.385084, "o", "\u001b[39m \u001b[2m"]
+[29.385859, "o", "PHPStan\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mRector\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mPHP Mess Detector\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mESLint\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mStylelint\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mJest\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mPHPUnit\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mBehat\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m └────────────────────────────────────────────────"]
+[29.385887, "o", "───"]
+[30.38677, "o", "───────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆, ⬇ and Space bar to select one or more tools.\u001b[39m\r\r\n\u001b[1G\u001b[13A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mDevelopment tools \u001b[2m(17/32)\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 PHP Mess Detector \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 "]
+[30.386818, "o", " \u001b[90m"]
+[30.386965, "o", "│\u001b[39m\r\r\n\u001b[90m │\u001b[39m Behat \u001b[90m│\u001b[39m\r\r\n\u001b[90m └──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\r\r\n\u001b[?25h"]
+[31.389917, "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(18/32)\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\u001b[1G\u001b[8A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mHosting provider \u001b[2m(18/32)"]
+[31.389925, "o", "\u001b[22m\u001b[22m \u001b"]
+[31.390094, "o", "[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"]
+[32.392964, "o", "\u001b[?25h\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mCustom web root directory \u001b[2m(19/32)\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 server serves the site.\u001b[39m\r\r\n\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mCustom web root directory \u001b[2m(19/32)\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 └──────────────────────────────────────────────────────────────┘"]
+[32.393016, "o", "\u001b[39m\r\r\n\r"]
+[32.393167, "o", "\r\r\n\u001b[?25h"]
+[33.396891, "o", "\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(20/32)\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[2m◻\u001b[22m \u001b[2mContainer image\u001b[22m \u001b[90m│\u001b[39m\r\r\n\u001b[90m │\u001b[39m \u001b[36m◼\u001b[39m \u001b[2mCustom webhook\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 deployment types.\u001b[39m\r\r\n\u001b[1G\u001b[8A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mDeployment types \u001b[2m(20/32"]
+[33.396897, "o", ")\u001b[22m\u001b[22m "]
+[33.397108, "o", "\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"]
+[34.401731, "o", "\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(21/32)\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 │\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 "]
+[34.401761, "o", " "]
+[34.401997, "o", " \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 ├──────────────────────────────────────────────────────────────┤\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 └────────────────────────"]
+[34.402013, "o", "───"]
+[34.402153, "o", "───────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆ and ⬇ to select the provision type.\u001b[39m\r\r\n"]
+[35.409192, "o", "\u001b[1G\u001b[21A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mProvision type \u001b[2m(21/32)\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 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 │\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 "]
+[35.409198, "o", "\u001b[90m│\u001b["]
+[35.409422, "o", "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 ├──────────────────────────────────────────────────────────────┤\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"]
+[36.413213, "o", "\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mDatabase source \u001b[2m(22/32)\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 \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 └───────────"]
+[36.413219, "o", "───"]
+[36.413299, "o", "────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆ and ⬇ to select the database download source.\u001b[39m\r\r\n"]
+[37.413606, "o", "\u001b[1G\u001b[11A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mDatabase source \u001b[2m(22/32)\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\u001b[?25l\r\r\n\u001b[90m ┌\u001b[39m \u001b[36mUse a second database for migrations? \u001b[2m(23/32)\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 Drupa"]
+[37.413617, "o", "l migrati"]
+[37.413754, "o", "ons.\u001b[39m\r\r\n"]
+[38.413924, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mUse a second database for migrations? \u001b[2m(23/32)\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(24/32)\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 "]
+[38.413981, "o", "│\u001b[39m \u001b["]
+[38.414076, "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"]
+[39.415677, "o", "\u001b[1G\u001b[10A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mNotification channels \u001b[2m(24/32)\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(25/32)\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 "]
+[39.415772, "o", " \u001b["]
+[39.415987, "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"]
+[40.42084, "o", "\u001b[1G\u001b[7A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mContinuous Integration provider \u001b[2m(25/32)\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\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(26/32)\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"]
+[40.420847, "o", "\r\n\u001b[90m └"]
+[40.42098, "o", "──────────────────────────────────────────────────────────────┘\u001b[39m\r\r\n\u001b[90m Use ⬆ and ⬇ to select the dependency updates provider.\u001b[39m\r\r\n"]
+[41.421611, "o", "\u001b[1G\u001b[7A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mDependency updates provider \u001b[2m(26/32)\u001b[22m\u001b[22m \u001b[90m─────────────────────────┐\u001b[39m\r\r\n\u001b[90m │\u001b[39m Renovate GitHub app \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(27/32)\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"]
+[42.421805, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mAuto-assign the author to their PR? \u001b[2m(27/32)\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(28/32)\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"]
+[43.422501, "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(28/32)\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(29/32)\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"]
+[43.422551, "o", " within the "]
+[43.422687, "o", "repository.\u001b[39m\r\r\n"]
+[44.423074, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mPreserve project documentation? \u001b[2m(29/32)\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(30/32)\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"]
+[44.42315, "o", " with better"]
+[44.423365, "o", " context about the project.\u001b[39m\r\r\n"]
+[45.423568, "o", "\u001b[1G\u001b[5A\u001b[J\r\r\n\u001b[90m ┌\u001b[39m \u001b[2mProvide AI agent instructions? \u001b[2m(30/32)\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 "]
+[45.423576, "o", " \u001b[39m\u001b"]
+[45.423698, "o", "[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m 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[3"]
+[45.423724, "o", "9m\u001b[90m"]
+[46.424027, "o", "│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Modules \u001b[39m\u001b[90m│\u001b[39m\u001b[39m admin_toolbar, coffee, config_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, environment_indicator,\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 pathauto, redirect, robotstxt, seckit,\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, 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 "]
+[46.424034, "o", " \u001b[3"]
+[46.424137, "o", "9m\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 \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 "]
+[46.424141, "o", " "]
+[46.424249, "o", " \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b[39m Services \u001b[39m\u001b[90m│\u001b[39m\u001b[39m clamav, 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, eslint, jest, phpcs, phpmd, phpstan,\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 phpunit, rector, stylelint \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 "]
+[46.424269, "o", "webhook"]
+[46.424367, "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 "]
+[46.42438, "o", " "]
+[46.424488, "o", " \u001b[39m\u001b[90m│\u001b[39m\u001b[39m \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\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 \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-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"]
+[46.424522, "o", " projec"]
+[46.424637, "o", "t 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 \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/www/demo \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/www/demo/star_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 https://github.com/drevops/vortex.git \u001b[39m\u001b[90m│\u001b[39m\r\r\n \u001b[90m│\u001b[39m\u001b"]
+[46.424645, "o", "[39m "]
+[46.424773, "o", "Vortex reference \u001b[39m\u001b[90m│\u001b[39m\u001b[39m stable \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/www/demo/star_wars\"\r\r\n"]
+[48.42953, "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"]
+[50.433871, "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[1G\u001b[2A\u001b[J\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[1G\u001b[2A\u001b[J\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[1G\u001b[2A\u001b[J\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[1G\u001b[2A"]
+[50.433879, "o", "\u001b[J\r\r\n \u001b[36m⠂\u001b[39m \u001b[33"]
+[51.438314, "o", "mDownloading 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[1G\u001b[2A\u001b[J\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[1G\u001b[2A\u001b[J\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[1G\u001b[2A\u001b[J\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[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 \"https://github.com/drevops/vortex.git\" repository at ref \"stable\"\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 (1.37.0)\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[2A\u001b[J\r\r\n \u001b[36m⠒\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠐\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n\u001b[1G"]
+[51.438473, "o", "\u001b[2A\u001b[J\r\r\n \u001b[36m⠰\u001b[39m \u001b[33mCustomizing "]
+[51.438631, "o", "Vortex for your project\u001b[39m\r\r\n"]
+[51.516674, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠠\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
+[51.595605, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠤\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
+[51.674806, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠄\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
+[51.753664, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠆\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
+[51.832716, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠂\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
+[51.911051, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠒\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
+[51.989082, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠐\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
+[52.066781, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠰\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
+[52.14601, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠠\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
+[52.224524, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠤\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
+[52.303422, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠄\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
+[52.382568, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠆\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
+[52.462118, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠂\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
+[52.54069, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠒\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
+[52.620381, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠐\u001b[39m \u001b[33mCustomizing Vortex for your project\u001b[39m\r\r\n"]
+[52.668568, "o", "\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"]
+[52.676245, "o", "\r\r\n \u001b[36m⠂\u001b[39m \u001b[33mPreparing destination directory\u001b[39m\r\r\n"]
+[52.702748, "o", "\u001b[999D\u001b[2A\u001b[J"]
+[52.702809, "o", "\u001b[?25h"]
+[52.702909, "o", "\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"]
+[52.702979, "o", "\r\r\n \u001b[2mCreated directory \"/home/user/www/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[2mInitialising a new Git repository in directory \"/home/user/www/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"]
+[52.703056, "o", "\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"]
+[52.703116, "o", "\u001b[?25l"]
+[52.705212, "o", "\r\r\n \u001b[36m⠂\u001b[39m \u001b[33mCopying files to the destination directory\u001b[39m\r\r\n"]
+[52.79499, "o", "\u001b[1G\u001b[2A\u001b[J"]
+[52.795067, "o", "\r\r\n \u001b[36m⠒\u001b[39m \u001b[33mCopying files to the destination directory\u001b[39m\r\r\n"]
+[52.848483, "o", "\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\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 to destination directory\u001b[39m\r\r\n\r\r\n"]
+[52.84859, "o", "\r\r\n \u001b[A\u001b[A\u001b[A\u001b[A\r\r\n\r\r\n\u001b[?25l"]
+[52.857279, "o", "\r\r\n \u001b[36m⠂\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"]
+[52.950897, "o", "\u001b[1G\u001b[2A\u001b[J"]
+[52.95107, "o", "\r\r\n \u001b[36m⠒\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"]
+[53.029607, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠐\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"]
+[53.108833, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠰\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"]
+[53.18764, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠠\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"]
+[53.269987, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠤\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"]
+[53.35042, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠄\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"]
+[53.435051, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠆\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"]
+[53.513842, "o", "\u001b[1G\u001b[2A\u001b[J\r\r\n \u001b[36m⠂\u001b[39m \u001b[33mPreparing demo content\u001b[39m\r\r\n"]
+[53.573413, "o", "\u001b[999D\u001b[2A\u001b[J\u001b[?25h"]
+[53.573725, "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/www/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/www/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[2mDownloaded demo database from https://github.com/drevops/vortex/releases/download/25.4.0/db_d11.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"]
+[53.573863, "o", "\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"]
+[53.588016, "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"]
+[53.598759, "o", "\u001b[?25l"]
+[53.601988, "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: ahoy build\u001b[39m\r\r\n"]
+[55.604615, "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"]
+[55.611745, "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"]
+[55.611791, "o", " \u001b[39m\u001b"]
+[55.611846, "o", "[39m \u001b[39m\u001b[90m│\u001b[39m\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 https://www.vortextemplate.com/docs/continuous-integration/github-actions#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"]
+[55.621933, "x", "0"]
diff --git a/.vortex/docs/static/img/installer.svg b/.vortex/docs/static/img/installer.svg
index 41cf02425..40cb59d9c 100644
--- a/.vortex/docs/static/img/installer.svg
+++ b/.vortex/docs/static/img/installer.svg
@@ -1 +1 @@
-
\ No newline at end of file
+Xdebug:[StepDebug]Couldnotconnecttodebuggingclient.Tried:localhost:9003(throughxdebug.client_host/xdebug.client_port).──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────██╗██╗██████╗██████╗████████╗███████╗██╗██╗██║██║██╔═══██╗██╔══██╗╚══██╔══╝██╔════╝╚██╗██╔╝██║██║██║██║██████╔╝██║█████╗╚███╔╝╚██╗██╔╝██║██║██╔══██╗██║██╔══╝██╔██╗╚████╔╝╚██████╔╝██║██║██║███████╗██╔╝██╗╚═══╝╚═════╝╚═╝╚═╝╚═╝╚══════╝╚═╝╚═╝DrupalprojecttemplatebyDrevOpsInstallerversion:development┌──────────────────────────────────────────────────────────────────────────────────────┐│WelcometotheVortexinteractiveinstaller││───────────────────────────────────────────││││ThistoolwillguideyouthroughinstallingthelateststableversionofVortexinto││yourproject.│yourproject.││Youwillbeaskedafewquestionstotailortheconfigurationtoyoursite.││Nochangeswillbemadeuntilyouconfirmeverythingattheend.││PressCtrl+Catanytimetoexittheinstaller.││PressCtrl+Uatanytimetogobacktothepreviousstep.│└─────────└──────────────────────────────────────────────────────────────────────────────────────┘Pressanykeytocontinue... General information ┌Sitename(1/32)────────────────────────────────────────────┐└──────────────────────────────────────────────────────────────┘Wewillusethisnameintheprojectanddocumentation.│E.g.MySite││St ┌Sitename(1/32)────────────────────────────────────────────┐│StarWars││star_wars │┌Sitemachinename(2/32)────────────────────────────────────┐│star_wars│┌Organizationname(3/32)────────────────────────────────────┐│E.g.MyOrg││Re │┌Organizationname(3/32)────────────────────────────────────┐│Rebellion│┌Organizationmachinename(4/32)────────────────────────────┐│rebellion │Wewillusethisnameinthecode.┌Organizationmachinename(4/32)────────────────────────────┐│rebellion│┌Publicdomain(5/32)────────────────────────────────────────┐│star-wars.com │┌Publicdomain(5/32)────────────────────────────────────────┐│star-wars.com│ Drupal ┌Howwouldyoulikeyoursitetobecreatedonthefirstrun?(6/32)┐│││Choosehowyoursitewillbecreatedthefirsttimeafterthis││installerfinishes:│││○Drupal,installedfromprofile││Createsanewsitebypopulatingafreshdatabase││fromoneofthestandardDrupalinstallationprofiles.││○DrupalCMS,installedfromprofile││fromtheDrupalCMSrecipe.││○Drupal,loadedfromthedemodatabase││Createsasitebyloadinganexistingdemodatabase││providedwiththeinstaller.│├─────────────────────────────────────────────────────────────────────┤│○Drupal,installedfromprofile││○DrupalCMS,installedfromprofile││›●Drupal,loadedfromthedemodatabase│└─────────────────────────────────────────────────────────────────────┘┌Howwouldyoulikeyoursitetobecreatedonthefirstrun?(6/32)┐│Drupal,loadedfromthedemodatabase│Drupal,loadedfromthedemodatabase│┌Profile(7/32)──────────────────────────────────────────────┐│Standard│┌Modules(8/32)──────────────────────────────────────────────┐│›◼Admintoolbar┃││◼Coffee│││◼Configsplit│││◼Configupdate│││◼Environmentindicator│││◼Pathauto│││◼Redirect│││◼Robots.txt│││◼Seckit│││◼Shield││┌Modules(8/32)──────────────────────────────────────────────┐│Admintoolbar││Coffee││Configsplit││Configupdate││Environmentindicator││Pathauto││Redirect││Robots.txt││Seckit││Shield││Stagefileproxy││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.│┌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│└────────────────────────────────────────────────────────────────────┘┌Theme(11/32)───────────────────────────────────────────────┐│Custom(nextprompt)│┌Customthememachinename(12/32)───────────────────────────┐┌Customthememachinename(12/32)───────────────────────────┐ Code repository ┌Repositoryprovider(13/32)─────────────────────────────────┐│││VortexoffersfullautomationwithGitHub,whilesupportfor││otherprovidersislimited.│├──────────────────────────────────────────────────────────────┤│○Other│┌Repositoryprovider(13/32)─────────────────────────────────┐│GitHub│┌Releaseversioningscheme(14/32)───────────────────────────┐│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(14/32)───────────────────────────┐│CalendarVersioning(CalVer)│ Environment ┌Timezone(15/32)────────────────────────────────────────────┐│UTC│┌Services(16/32)────────────────────────────────────────────┐│›◼ClamAV││◼Solr││◼Redis┌Services(16/32)────────────────────────────────────────────┐│ClamAV││Solr││Redis│┌Developmenttools(17/32)───────────────────────────────────┐│›◼PHPCodeSniffer││◼│◼PHPStan││◼Rector││◼PHPMessDetector││◼ESLint││◼Stylelint││◼Jest││◼PHPUnit││◼Behat│┌Developmenttools(17/32)───────────────────────────────────┐│PHPCodeSniffer││PHPStan││Rector││PHPMessDetector││ESLint││Stylelint││Jest││PHPUnit│PHPUnit││Behat│ Hosting ┌Hostingprovider(18/32)┌Hostingprovider(18/32)────────────────────────────────────┐│None│┌Customwebrootdirectory(19/32)───────────────────────────┐│web│ Deployment ┌Deploymenttypes(20/32)────────────────────────────────────┐│Customwebhook│ Workflow ┌Provisiontype(21/32)──────────────────────────────────────┐│Provisioningsetsupthesiteinanenvironmentusingan││alreadyassembledcodebase.││○Importfromdatabasedump││Provisionsthesitebyimportingadatabasedump││typicallycopiedfromproductionintolower││environments.││○Installfromprofile││ProvisionsthesitebyinstallingafreshDrupal││sitefromaprofileeverytimeanenvironmentis││created.││›●Importfromdatabasedump││○Installfromprofile│┌Provisiontype(21/32)──────────────────────────────────────┐│Importfromdatabasedump│┌Databasesource(22/32)─────────────────────────────────────┐│›●URLdownload││○FTPdownload││○Acquiabackup││○Lagoonenvironment││○Containerregistry││○S3bucket││○None│┌Databasesource(22/32)─────────────────────────────────────┐│URLdownload│┌Useaseconddatabaseformigrations?(23/32)───────────────┐│○Yes/●No│┌Useaseconddatabaseformigrations?(23/32)───────────────┐│No│ Notifications ┌Notificationchannels(24/32)───────────────────────────────┐│›◼Email││◻GitHub││◻JIRA│┌Notificationchannels(24/32)───────────────────────────────┐│Email│ Continuous Integration ┌ContinuousIntegrationprovider(25/32)─────────────────────┐│›●GitHubActions││○CircleCI││○None┌ContinuousIntegrationprovider(25/32)─────────────────────┐│GitHubActions│ Automations ┌Dependencyupdatesprovider(26/32)─────────────────────────┐│›●RenovateGitHubapp││○Renovateself-hostedinCI│┌Dependencyupdatesprovider(26/32)─────────────────────────┐│RenovateGitHubapp││●Yes/○No│┌Auto-assigntheauthortotheirPR?(27/32)─────────────────┐│Yes│└─────────────────────────────────────────────────────────────────┘┌Auto-addaCONFLICTlabeltoaPRwhenconflictsoccur?(28/32)┐│Yes│ Documentation ┌Preserveprojectdocumentation?(29/32)─────────────────────┐┌Preserveprojectdocumentation?(29/32)─────────────────────┐ AI ┌ProvideAIagentinstructions?(30/32)──────────────────────┐┌ProvideAIagentinstructions?(30/32)──────────────────────┐ Installation summary ┌────────────────────────────────────┬─────────────────────────────────────────────┐│Generalinformation││Generalinformation│││Sitename│StarWars││Sitemachinename│star_wars││Organizationname│Rebellion││Organizationmachinename│rebellion││Publicdomain│star-wars.com││Drupal│││Starter│load_demodb│Starter│load_demodb││Modules│admin_toolbar,coffee,config_split,│││config_update,environment_indicator,│││pathauto,redirect,robotstxt,seckit,│││shield,stage_file_proxy,xmlsitemap││Webroot│web││Profile│standard││Moduleprefix│sw│Moduleprefix│sw││Custommodules│base,search,demo││Thememachinename│star_wars││Coderepository│││Codeprovider│github││Versionscheme│calver││Environment│││Timezone│UTC│Timezone│UTC││Services│clamav,redis,solr││Tools│behat,eslint,jest,phpcs,phpmd,phpstan,│││phpunit,rector,stylelint││Hosting│││Hostingprovider│none││Deployment│││Deploymenttypes│webhook││Workflow│││Provisiontype│database││Databasesource│url││Migrationdatabase│No││Notifications│││Channels│email││ContinuousIntegration│ContinuousIntegration│││CIprovider│gha││Automations│││Dependencyupdatesprovider│renovatebot_app││Auto-assignPRauthor│Yes││Auto-addaCONFLICTlabeltoPRs│Yes││Documentation│││Preserveprojectdocumentation│Yes││AI│││AIagentinstructions│Yes││Locations│││Currentdirectory│/home/user/www/demo││Destinationdirectory│/home/user/www/demo/star_wars││Vortexrepository│https://github.com/drevops/vortex.git││Vortexreference│stable│└────────────────────────────────────┴─────────────────────────────────────────────┘Vortexwillbeinstalledintoyourproject'sdirectory"/home/user/www/demo/star_wars"┌ProceedwithinstallingVortex?─────────────────────────────┐ Starting project installation ✦DownloadingVortexDownloadingfrom"https://github.com/drevops/vortex.git"repositoryatref"stable"✓Vortexdownloaded(1.37.0)⠐CustomizingVortexforyourproject⠰CustomizingVortexforyourproject⠠CustomizingVortexforyourproject⠤CustomizingVortexforyourproject⠄CustomizingVortexforyourproject⠆CustomizingVortexforyourproject⠂CustomizingVortexforyourproject⠒CustomizingVortexforyourproject✦CustomizingVortexforyourproject✓Vortexwascustomizedforyourproject✦PreparingdestinationdirectoryCreateddirectory"/home/user/www/demo/star_wars".InitialisinganewGitrepositoryindirectory"/home/user/www/demo/star_wars".✓Destinationdirectoryisready✦Copyingfilestothedestinationdirectory✓Filescopiedtodestinationdirectory⠂Preparingdemocontent✦PreparingdemocontentCreateddatadirectory"/home/user/www/demo/star_wars/.data".Nodatabasedumpfilewasfoundin"/home/user/www/demo/star_wars/.data"directory.Downloadeddemodatabasefromhttps://github.com/drevops/vortex/releases/download/25.4.0/db_d11.demo.sql.✓Democontentprepared┌───────────────────────────────────┐│FinishedinstallingVortex││──────────────────────────││││Addandcommitallfiles:││gitadd-A││gitcommit-m"Initialcommit."│└───────────────────────────────────┘┌Runthesitebuildnow?─────────────────────────────────────┐┌────────────────────────────────────────────────────────────────────────────────────────┐│Readytobuild││──────────────││││Buildthesite:││ahoybuild│╚██╗██╔╝█╚██╗██╔╝██║──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────└────────────│starwars │└──────────────────────────────────└────────────────────────────────────│St ││StarWars │┌Sitemachinename(2/32)────────────────────────────────────┐Wewillusethisnamefortheprojectdirectoryandinthecode.│StarWarsOrg │└────────────────────────────────────────────└───────────────────────────────────────────────└─────│Rebellion │WewillusethisnameinthecoDomainnamewithoutproDomainnamewithoutprotocolandDomainnamewithoutprotocolandtrailingslash.│Createsasitebyloadin│Createsasitebyloadinganexist└────────────────────────────────────────────────────────────└──────────────────────────────────────────────────────────────Use⬆and⬇.Appliesonlyonthefirstrunoftheinstaller.│○DrupalCMS,installedfromprofile┌Profile(7/32)──────────────────────────────────────────────┐│›●Standard││○Minimal││○DemoUmami││○Custom(nextprompt)│Use⬆and⬇toselectwhichDrupalprofiletouse.│◼Configspli│◼Configsplit└───────────────────────└──────────────────────────├──────────────────────────────────────├─────────────────────────────────────────│›◼Base-startermodulewithutilitiesandtestscaffolding││◼Search-customSolrsearchintegration││◼Demo-counterblockandexampleteststodemonstratetooling│Use⬆,⬇andSpacebartoselectoneormoremodules.│○│○Searc├───────────────────────────────────────────────├──────────────────────────────────────────────────┌Theme(11/32)───────────────────────────────────────────────┐│○Olivero││○Claro││○Stark││›●Custom(nextprompt)│Use⬆and⬇toselectwhichDrupalthemetouse.WewilluseWewillusethisnamWewillusethisnameasacustomthemename│›●GitHub│Use⬆and⬇toselectyourcoderepositoryprovider.└────────────────────────────────────────────────────└───────────────────────────────────────────────────────│○OtherUse⬆and⬇toselectyourversionscheme.┌Timezone(15/32)────────────────────────────────────────────┐│UTC ││UTC│Use⬆and⬇,orstarttypingtoselectthetimezoneforyourproject.│◼Redis│Use⬆,⬇andSpacebartoselectoneormoreservices.└────────────────────────────────────────────────└───────────────────────────────────────────────────┌Deploymenttypes(20/32┌Deploymenttypes(20/32)└────────────────────────└───────────────────────────Use⬆and⬇toselecttheprovisiontype.└───────────└──────────────Use⬆and⬇toselectthedatabasedownloadsource.AddsaseconddatabaseserviceforDrupaAddsaseconddatabaseserviceforDrupalmigratiAddsaseconddatabaseserviceforDrupalmigrations.│◻NewRelic││◻Slack││◻Webhook│Use⬆,⬇andSpacebartoselectoneormorenotificationchannels.Use⬆and⬇toselecttheCIprovider.└Use⬆and⬇toselectthedependencyupdatesprovider.┌Auto-assigntheauthortotheirPR?(27/32)─────────────────┐HelpstokeepthePRsorganized.┌Auto-addaCONFLICTlabeltoaPRwhenconflictsoccur?(28/32)┐│●Yes/○No│HelpstokeepquicklyidentifyPRsthatneedattention.HelpstomaintaintheprojectdocumentationHelpstomaintaintheprojectdocumentationwithintheHelpstomaintaintheprojectdocumentationwithintherepository.ProvidesAIcodingagentsProvidesAIcodingagentswithbetterProvidesAIcodingagentswithbettercontextabouttheproject.│Deploymenttypes││Deploymenttypes│webhook│Preserve│Preserveprojec┌ProceedwithinstallingVortex?─────────────────────────────┐⠆DownloadingVortex⠂⠰Customizing⠂Preparingdestinationdirectory⠂Copyingfilestothedestinationdirectory⠒Copyingfilestothedestinationdirectory⠒Preparingdemocontent⠐Preparingdemocontent⠰Preparingdemocontent⠠Preparingdemocontent⠤Preparingdemocontent⠄Preparingdemocontent⠆Preparingdemocontent┌Runthesitebuildnow?─────────────────────────────────────┐Takes~5-10min;outputwillbestreamed.Youcanskipandrunlaterwith:ahoybuild│SetupGitHubActions:││https://www.vortextemplate.com/docs/continuous-integration/github-actions#onboarding│└────────────────────────────────────────────────────────────────────────────────────────┘
\ No newline at end of file
diff --git a/.vortex/installer/src/Prompts/Handlers/MigrationDownloadSource.php b/.vortex/installer/src/Prompts/Handlers/MigrationDownloadSource.php
index b47d34665..6a86ae544 100644
--- a/.vortex/installer/src/Prompts/Handlers/MigrationDownloadSource.php
+++ b/.vortex/installer/src/Prompts/Handlers/MigrationDownloadSource.php
@@ -17,6 +17,8 @@ class MigrationDownloadSource extends AbstractHandler {
const LAGOON = 'lagoon';
+ const CONTAINER_REGISTRY = 'container_registry';
+
const S3 = 's3';
/**
@@ -42,6 +44,7 @@ public function options(array $responses): ?array {
self::FTP => 'FTP download',
self::ACQUIA => 'Acquia backup',
self::LAGOON => 'Lagoon environment',
+ self::CONTAINER_REGISTRY => 'Container registry',
self::S3 => 'S3 bucket',
];
@@ -112,6 +115,7 @@ public function process(): void {
MigrationDownloadSource::FTP,
MigrationDownloadSource::ACQUIA,
MigrationDownloadSource::LAGOON,
+ MigrationDownloadSource::CONTAINER_REGISTRY,
MigrationDownloadSource::S3,
];
diff --git a/.vortex/installer/src/Prompts/Handlers/MigrationImage.php b/.vortex/installer/src/Prompts/Handlers/MigrationImage.php
new file mode 100644
index 000000000..2faac2455
--- /dev/null
+++ b/.vortex/installer/src/Prompts/Handlers/MigrationImage.php
@@ -0,0 +1,109 @@
+ [MigrationDownloadSource::CONTAINER_REGISTRY]];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function shouldRun(array $responses): bool {
+ return isset($responses[MigrationDownloadSource::id()]) && $responses[MigrationDownloadSource::id()] === MigrationDownloadSource::CONTAINER_REGISTRY;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function default(array $responses): null|string|bool|array {
+ if (
+ isset($responses[OrgMachineName::id()]) &&
+ isset($responses[MachineName::id()]) &&
+ !empty($responses[OrgMachineName::id()]) &&
+ !empty($responses[MachineName::id()])
+ ) {
+ return sprintf(
+ '%s/%s-data-migration:latest',
+ strtolower(Converter::phpNamespace($responses[OrgMachineName::id()])),
+ strtolower(Converter::phpNamespace($responses[MachineName::id()]))
+ );
+ }
+
+ return NULL;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function discover(): null|string|bool|array {
+ return Env::getFromDotenv('VORTEX_DB2_IMAGE', $this->dstDir);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function validate(): ?callable {
+ return fn($v): ?string => Validator::containerImage($v) ? NULL : 'Please enter a valid container image name with an optional tag.';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function transform(): ?callable {
+ return fn($v): string => trim((string) $v);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function process(): void {
+ if (!empty($this->response)) {
+ $v = $this->getResponseAsString();
+ $t = $this->tmpDir;
+
+ Env::writeValueDotenv('VORTEX_DB2_IMAGE', $v, $t . '/.env');
+ }
+ }
+
+}
diff --git a/.vortex/installer/src/Prompts/PromptManager.php b/.vortex/installer/src/Prompts/PromptManager.php
index b76b2b557..e59db6719 100644
--- a/.vortex/installer/src/Prompts/PromptManager.php
+++ b/.vortex/installer/src/Prompts/PromptManager.php
@@ -24,6 +24,7 @@
use DrevOps\VortexInstaller\Prompts\Handlers\MachineName;
use DrevOps\VortexInstaller\Prompts\Handlers\Migration;
use DrevOps\VortexInstaller\Prompts\Handlers\MigrationDownloadSource;
+use DrevOps\VortexInstaller\Prompts\Handlers\MigrationImage;
use DrevOps\VortexInstaller\Prompts\Handlers\ModulePrefix;
use DrevOps\VortexInstaller\Prompts\Handlers\Modules;
use DrevOps\VortexInstaller\Prompts\Handlers\Name;
@@ -195,6 +196,11 @@ public function runPrompts(): void {
fn(array $r, $pr, $n): mixed => $this->prompt(MigrationDownloadSource::class, $r),
MigrationDownloadSource::id()
)
+ ->addIf(
+ fn(array $r): bool => $this->handlers[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())
@@ -286,6 +292,7 @@ public function runProcessors(): void {
AssignAuthorPr::id(),
DependencyUpdatesProvider::id(),
CiProvider::id(),
+ MigrationImage::id(),
MigrationDownloadSource::id(),
Migration::id(),
DatabaseImage::id(),
@@ -467,6 +474,10 @@ public function getResponsesSummary(): array {
$values['Migration database'] = Converter::bool($responses[Migration::id()]);
if ($responses[Migration::id()] === TRUE && isset($responses[MigrationDownloadSource::id()])) {
$values['Migration database source'] = $responses[MigrationDownloadSource::id()];
+
+ if ($responses[MigrationDownloadSource::id()] == MigrationDownloadSource::CONTAINER_REGISTRY && isset($responses[MigrationImage::id()])) {
+ $values['Migration database container image'] = $responses[MigrationImage::id()];
+ }
}
}
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_acquia/.ahoy.yml b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_acquia/.ahoy.yml
index 0d7123934..b8803f7f0 100644
--- a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_acquia/.ahoy.yml
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_acquia/.ahoy.yml
@@ -21,17 +21,31 @@
# ----------------------------------------------------------------------------
# Container commands.
# ----------------------------------------------------------------------------
-@@ -117,6 +126,13 @@
- cmd: |
+@@ -118,6 +127,13 @@
case " $* " in *" --fresh "*) export VORTEX_DOWNLOAD_DB_FRESH=1;; esac
./scripts/vortex/download-db.sh
-+
+
+ download-db2:
+ usage: Download second database (migration). Run with "--fresh" to force.
+ aliases: [fetch-db2]
+ cmd: |
+ case " $* " in *" --fresh "*) export VORTEX_DOWNLOAD_DB_FORCE=1;; esac
+ VORTEX_DB_INDEX=2 ./scripts/vortex/download-db.sh
-
++
reload-db:
usage: Reload the database container using local database image.
+ cmd: |
+@@ -125,6 +141,13 @@
+ docker compose rm --force --stop --volumes database
+ docker compose build database
+ ahoy up
++
++ reload-db2:
++ usage: Reload the migration database container using local database image.
++ cmd: |
++ ahoy confirm "Running this command will replace your current database. Are you sure?" || exit 0
++ docker compose rm --force --stop --volumes database2
++ ahoy up -- --build database2
+
+ provision:
+ usage: Provision a site from the database dump or profile.
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_acquia/docker-compose.yml b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_acquia/docker-compose.yml
index 3bdb9139b..4a9708dcf 100644
--- a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_acquia/docker-compose.yml
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_acquia/docker-compose.yml
@@ -20,7 +20,7 @@
- '3306' # Database port in a container. Find port on host with `ahoy info` or `docker compose port database 3306`.
+ database2:
-+ image: uselagoon/mysql-8.4:__VERSION__
++ image: "${VORTEX_DB2_IMAGE:-uselagoon/mysql-8.4:__VERSION__}" # Use custom database image (if defined) or fallback to standard database image.
+ environment:
+ <<: *default-environment
+ MYSQL_DATABASE: drupal
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/.ahoy.yml b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/.ahoy.yml
new file mode 100644
index 000000000..b8803f7f0
--- /dev/null
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/.ahoy.yml
@@ -0,0 +1,51 @@
+@@ -30,6 +30,7 @@
+ 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_DB2_PORT=$(docker compose port database2 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)
+@@ -43,6 +44,14 @@
+ open "mysql://${DATABASE_USERNAME:-drupal}:${DATABASE_PASSWORD:-drupal}@127.0.0.1:${VORTEX_HOST_DB_PORT}/drupal" -a "Sequel Ace" \
+ || echo "Not a supported OS or Sequel Ace is not installed."
+
++ db2:
++ usage: Open DB2 in Sequel Ace.
++ cmd: |
++ uname -a | grep -i -q darwin && test -d "${VORTEX_HOST_SEQUELACE_PATH:-/Applications/Sequel Ace.app}" && \
++ VORTEX_HOST_DB2_PORT=$(docker compose port database2 3306 2>/dev/null | cut -d : -f 2) && \
++ open "mysql://${DATABASE2_USERNAME:-drupal}:${DATABASE2_PASSWORD:-drupal}@127.0.0.1:${VORTEX_HOST_DB2_PORT}/drupal" -a "Sequel Ace" \
++ || echo "Not a supported OS or Sequel Ace is not installed."
++
+ # ----------------------------------------------------------------------------
+ # Container commands.
+ # ----------------------------------------------------------------------------
+@@ -118,6 +127,13 @@
+ case " $* " in *" --fresh "*) export VORTEX_DOWNLOAD_DB_FRESH=1;; esac
+ ./scripts/vortex/download-db.sh
+
++ download-db2:
++ usage: Download second database (migration). Run with "--fresh" to force.
++ aliases: [fetch-db2]
++ cmd: |
++ case " $* " in *" --fresh "*) export VORTEX_DOWNLOAD_DB_FORCE=1;; esac
++ VORTEX_DB_INDEX=2 ./scripts/vortex/download-db.sh
++
+ reload-db:
+ usage: Reload the database container using local database image.
+ cmd: |
+@@ -125,6 +141,13 @@
+ docker compose rm --force --stop --volumes database
+ docker compose build database
+ ahoy up
++
++ reload-db2:
++ usage: Reload the migration database container using local database image.
++ cmd: |
++ ahoy confirm "Running this command will replace your current database. Are you sure?" || exit 0
++ docker compose rm --force --stop --volumes database2
++ ahoy up -- --build database2
+
+ provision:
+ usage: Provision a site from the database dump or profile.
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/.env b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/.env
new file mode 100644
index 000000000..8fcdc916f
--- /dev/null
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/.env
@@ -0,0 +1,29 @@
+@@ -170,6 +170,28 @@
+ VORTEX_DOWNLOAD_DB_ENVIRONMENT=prod
+
+ ################################################################################
++# SECOND DATABASE (MIGRATION) #
++################################################################################
++
++# Second database for migrations.
++# See settings.migration.php for database credentials.
++
++# Second database dump file name.
++VORTEX_DOWNLOAD_DB2_FILE=db2.sql
++
++# Second database download source.
++VORTEX_DOWNLOAD_DB2_SOURCE=container_registry
++
++# Name of the pre-built migration database container image.
++# @see https://github.com/drevops/mariadb-drupal-data to seed your DB image.
++VORTEX_DB2_IMAGE=the_empire/star_wars-migration:latest
++
++# Environment to download the second database from.
++#
++# Applies to hosting environments.
++VORTEX_DOWNLOAD_DB2_ENVIRONMENT=prod
++
++################################################################################
+ # RELEASE VERSIONING #
+ ################################################################################
+
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/.github/workflows/build-test-deploy.yml b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/.github/workflows/build-test-deploy.yml
new file mode 100644
index 000000000..37d96c1a1
--- /dev/null
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/.github/workflows/build-test-deploy.yml
@@ -0,0 +1,21 @@
+@@ -250,6 +250,9 @@
+ echo "db_hash=${{ hashFiles('.data') }}" >> "$GITHUB_ENV"
+ timeout-minutes: 30
+
++ - name: Download migration DB
++ run: VORTEX_DB_INDEX=2 ./scripts/vortex/download-db.sh
++
+ - name: Export DB
+ run: |
+ if [ ! -f /tmp/download-db-success ]; then echo "==> Database download semaphore file is missing. DB export will not proceed."; exit 0; fi
+@@ -373,6 +376,10 @@
+ if [ -f .data/db.sql ]; then
+ docker compose exec cli mkdir -p .data
+ docker compose cp -L .data/db.sql cli:/app/.data/db.sql
++ fi
++ if [ -f ".data/${VORTEX_DOWNLOAD_DB2_FILE:-db2.sql}" ]; then
++ docker compose exec -T cli mkdir -p .data
++ docker compose cp -L ".data/${VORTEX_DOWNLOAD_DB2_FILE:-db2.sql}" cli:"/app/.data/${VORTEX_DOWNLOAD_DB2_FILE:-db2.sql}"
+ fi
+ docker compose exec $(env | cut -f1 -d= | sed 's/^/-e /') -T cli ./scripts/vortex/provision.sh
+ timeout-minutes: 30
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/.gitignore b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/.gitignore
new file mode 100644
index 000000000..ae6f21e2a
--- /dev/null
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/.gitignore
@@ -0,0 +1,8 @@
+@@ -21,6 +21,7 @@
+ web/sites/default/*
+ !web/sites/default/settings.php
+ !web/sites/default/services.yml
++!web/sites/default/settings.migration.php
+ !web/sites/default/example.settings.local.php
+ !web/sites/default/example.services.local.yml
+ !web/sites/default/default.settings.local.php
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/composer.json b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/composer.json
new file mode 100644
index 000000000..1005053d4
--- /dev/null
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/composer.json
@@ -0,0 +1,9 @@
+@@ -17,6 +17,8 @@
+ "drupal/drupal_helpers": "__VERSION__",
+ "drupal/environment_indicator": "__VERSION__",
+ "drupal/generated_content": "__VERSION__",
++ "drupal/migrate_plus": "__VERSION__",
++ "drupal/migrate_tools": "__VERSION__",
+ "drupal/pathauto": "__VERSION__",
+ "drupal/redirect": "__VERSION__",
+ "drupal/redis": "__VERSION__",
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/docker-compose.yml b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/docker-compose.yml
new file mode 100644
index 000000000..4a9708dcf
--- /dev/null
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/docker-compose.yml
@@ -0,0 +1,51 @@
+@@ -54,6 +54,16 @@
+ DRUPAL_SHIELD_PASS: ${DRUPAL_SHIELD_PASS:-}
+ # Redis integration flag.
+ DRUPAL_REDIS_ENABLED: ${DRUPAL_REDIS_ENABLED:-}
++ # Local migration database host (not used in production).
++ DATABASE2_HOST: database2
++ # Local migration database name (not used in production).
++ DATABASE2_NAME: drupal
++ # Local migration database user (not used in production).
++ DATABASE2_USERNAME: drupal
++ # Local migration database password (not used in production).
++ DATABASE2_PASSWORD: drupal
++ # Local migration database port (not used in production).
++ DATABASE2_PORT: 3306
+
+ # The default user under which the containers should run.
+ x-user: &default-user
+@@ -149,6 +159,19 @@
+ ports:
+ - '3306' # Database port in a container. Find port on host with `ahoy info` or `docker compose port database 3306`.
+
++ database2:
++ image: "${VORTEX_DB2_IMAGE:-uselagoon/mysql-8.4:__VERSION__}" # Use custom database image (if defined) or fallback to standard database image.
++ environment:
++ <<: *default-environment
++ MYSQL_DATABASE: drupal
++ MYSQL_USER: drupal
++ MYSQL_PASSWORD: drupal
++ <<: *default-user
++ ports:
++ - '3306' # Database port in a container. Find port on host with `ahoy info` or `docker compose port database2 3306`.
++ labels:
++ lagoon.type: mariadb # See https://docs.lagoon.sh/using-lagoon-advanced/service-types/
++
+ redis:
+ image: uselagoon/valkey-8:__VERSION__
+
+@@ -192,11 +215,13 @@
+ depends_on:
+ - clamav
+ - database
++ - database2
+ - redis
+ - solr
+ command:
+ - clamav:3310
+ - database:3306
++ - database2:3306
+ - redis:6379
+ - solr:8983
+ - curl -s "http://solr:8983/solr/drupal/select?q=*:*&rows=0&wt=json" | grep response
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/scripts/custom/provision-20-migration.sh b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/scripts/custom/provision-20-migration.sh
new file mode 100755
index 000000000..fa75d7649
--- /dev/null
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/scripts/custom/provision-20-migration.sh
@@ -0,0 +1,166 @@
+#!/usr/bin/env bash
+##
+# Import migration database and run migrations.
+#
+# This script is called during site provisioning via provision.sh.
+# Customize the migration names at the bottom of this file.
+#
+# shellcheck disable=SC2086
+
+set -eu
+[ "${VORTEX_DEBUG-}" = "1" ] && set -x
+
+# Skip all migrations.
+DRUPAL_MIGRATION_SKIP="${DRUPAL_MIGRATION_SKIP:-0}"
+
+# Skip rollback of migrations before import.
+DRUPAL_MIGRATION_ROLLBACK_SKIP="${DRUPAL_MIGRATION_ROLLBACK_SKIP:-1}"
+
+# Limit the number of entities to import. Set to 'all' to import all.
+DRUPAL_MIGRATION_IMPORT_LIMIT="${DRUPAL_MIGRATION_IMPORT_LIMIT:-50}"
+
+# Update already imported entities during migration.
+DRUPAL_MIGRATION_UPDATE="${DRUPAL_MIGRATION_UPDATE:-0}"
+
+# Feedback frequency for migration progress.
+DRUPAL_MIGRATION_FEEDBACK="${DRUPAL_MIGRATION_FEEDBACK:-50}"
+
+# Import migration source database. Set to 1 to import, 0 to skip.
+DRUPAL_MIGRATION_SOURCE_DB_IMPORT="${DRUPAL_MIGRATION_SOURCE_DB_IMPORT:-${VORTEX_PROVISION_OVERRIDE_DB:-0}}"
+
+# Table name to probe in the source database to verify it is not corrupted.
+DRUPAL_MIGRATION_SOURCE_DB_PROBE_TABLE="${DRUPAL_MIGRATION_SOURCE_DB_PROBE_TABLE:-categories}"
+
+# Directory with database dump file.
+VORTEX_DB_DIR="${VORTEX_DB_DIR:-./.data}"
+
+# Migration database dump file name.
+VORTEX_DOWNLOAD_DB2_FILE="${VORTEX_DOWNLOAD_DB2_FILE:-db2.sql}"
+
+# ------------------------------------------------------------------------------
+
+# @formatter:off
+note() { printf " %s\n" "${1}"; }
+task() { [ "${TERM:-}" != "dumb" ] && tput colors >/dev/null 2>&1 && printf "\033[34m[TASK] %s\033[0m\n" "${1}" || printf "[TASK] %s\n" "${1}"; }
+info() { [ "${TERM:-}" != "dumb" ] && tput colors >/dev/null 2>&1 && printf "\033[36m[INFO] %s\033[0m\n" "${1}" || printf "[INFO] %s\n" "${1}"; }
+pass() { [ "${TERM:-}" != "dumb" ] && tput colors >/dev/null 2>&1 && printf "\033[32m[ OK ] %s\033[0m\n" "${1}" || printf "[ OK ] %s\n" "${1}"; }
+fail() { [ "${TERM:-}" != "dumb" ] && tput colors >/dev/null 2>&1 && printf "\033[31m[FAIL] %s\033[0m\n" "${1}" || printf "[FAIL] %s\n" "${1}"; }
+# @formatter:on
+
+drush() { ./vendor/bin/drush -y "$@"; }
+
+# ------------------------------------------------------------------------------
+
+info "Started migration operations."
+
+environment="$(drush php:eval "print \Drupal\core\Site\Settings::get('environment');")"
+note "Environment: ${environment}"
+
+# Skip migrations in production.
+if [ "${environment}" = "prod" ]; then
+ DRUPAL_MIGRATION_SKIP=1
+fi
+
+note "Migration skip: ${DRUPAL_MIGRATION_SKIP}"
+note "Migration limit: ${DRUPAL_MIGRATION_IMPORT_LIMIT}"
+note "Migration skip rollback: ${DRUPAL_MIGRATION_ROLLBACK_SKIP}"
+note "Migration update: ${DRUPAL_MIGRATION_UPDATE}"
+note "Migration feedback: ${DRUPAL_MIGRATION_FEEDBACK}"
+note "Source DB import: ${DRUPAL_MIGRATION_SOURCE_DB_IMPORT}"
+echo
+
+if [ "${DRUPAL_MIGRATION_SKIP}" = "1" ]; then
+ info "Skipping migrations. DRUPAL_MIGRATION_SKIP is set to 1."
+ exit 0
+fi
+
+# Helper function to run a single migration with configured options.
+run_migration() {
+ local migration_name="${1}"
+ shift
+
+ drush migrate:reset-status "${migration_name}" || {
+ fail "Failed to reset migration status for ${migration_name}."
+ exit 1
+ }
+
+ task "Running migration: ${migration_name}"
+ local opts=()
+
+ opts+=("--feedback=${DRUPAL_MIGRATION_FEEDBACK}")
+
+ if printf '%s\n' "${DRUPAL_MIGRATION_IMPORT_LIMIT}" | grep -q '^[0-9][0-9]*$' && [ "${DRUPAL_MIGRATION_IMPORT_LIMIT}" -gt 0 ]; then
+ opts+=("--limit=${DRUPAL_MIGRATION_IMPORT_LIMIT}")
+ fi
+
+ if [ "${DRUPAL_MIGRATION_UPDATE}" = "1" ]; then
+ opts+=("--update")
+ fi
+
+ # Add any additional arguments passed to the function.
+ opts+=("$@")
+
+ drush migrate:import "${opts[@]}" "${migration_name}" || {
+ drush migrate:messages "${migration_name}"
+ exit 1
+ }
+}
+
+# Detect if existing migration source database is corrupted.
+if [ "${DRUPAL_MIGRATION_SOURCE_DB_IMPORT}" != "1" ]; then
+ note "Source database import is set to be skipped. Checking existing database."
+ task "Probing for '${DRUPAL_MIGRATION_SOURCE_DB_PROBE_TABLE}' table in the source database."
+ if ! drush sql:query --database=migrate "SELECT COUNT(*) FROM ${DRUPAL_MIGRATION_SOURCE_DB_PROBE_TABLE}" >/dev/null 2>&1; then
+ note "Migration source database is corrupted or empty. Re-importing."
+ DRUPAL_MIGRATION_SOURCE_DB_IMPORT=1
+ fi
+fi
+
+# Import the migration source database from the dump file.
+if [ "${DRUPAL_MIGRATION_SOURCE_DB_IMPORT}" = "1" ]; then
+ task "Importing migration source database."
+
+ [ ! -f "${VORTEX_DB_DIR}/${VORTEX_DOWNLOAD_DB2_FILE}" ] && fail "Migration source database file not found. Please run 'ahoy download-db2'." && exit 1
+
+ drush sql:drop --database=migrate
+ # shellcheck disable=SC2091
+ $(drush sql:connect --database=migrate) <"${VORTEX_DB_DIR}/${VORTEX_DOWNLOAD_DB2_FILE}"
+
+ pass "Imported migration source database."
+else
+ note "Using existing migration source database."
+fi
+
+task "Verifying migration source database."
+if ! drush sql:query --database=migrate "SELECT COUNT(*) FROM ${DRUPAL_MIGRATION_SOURCE_DB_PROBE_TABLE}" >/dev/null 2>&1; then
+ fail "Migration source database is corrupted."
+ drush sql:query --database=migrate "SHOW TABLES;"
+ exit 1
+fi
+
+# Enable custom migration modules.
+task "Enabling migration modules."
+drush pm:install ys_migrate
+
+task "Starting migrations."
+
+if [ "${DRUPAL_MIGRATION_ROLLBACK_SKIP}" = "1" ]; then
+ note "Skipping rollback of all migrations."
+else
+ task "Rolling back all migrations."
+ drush migrate:rollback --all || true
+fi
+echo
+
+# -----------------------------------------------------------------------------
+# Add your migrations below.
+# -----------------------------------------------------------------------------
+
+run_migration ys_migrate_categories
+
+echo
+note "Finished migrations."
+
+drush migrate:status
+
+info "Finished migration operations."
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/tests/phpunit/Drupal/DatabaseSettingsTest.php b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/tests/phpunit/Drupal/DatabaseSettingsTest.php
new file mode 100644
index 000000000..956cd535d
--- /dev/null
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/tests/phpunit/Drupal/DatabaseSettingsTest.php
@@ -0,0 +1,110 @@
+@@ -47,6 +47,17 @@
+ 'prefix' => '',
+ ],
+ ],
++ 'migrate' => [
++ 'default' => [
++ 'database' => 'drupal',
++ 'username' => 'drupal',
++ 'password' => 'drupal',
++ 'host' => 'localhost',
++ 'port' => '',
++ 'prefix' => '',
++ 'driver' => 'mysql',
++ ],
++ ],
+ ],
+ ];
+
+@@ -74,6 +85,17 @@
+ 'prefix' => '',
+ ],
+ ],
++ 'migrate' => [
++ 'default' => [
++ 'database' => 'drupal',
++ 'username' => 'drupal',
++ 'password' => 'drupal',
++ 'host' => 'localhost',
++ 'port' => '',
++ 'prefix' => '',
++ 'driver' => 'mysql',
++ ],
++ ],
+ ],
+ ];
+
+@@ -101,6 +123,17 @@
+ 'prefix' => '',
+ ],
+ ],
++ 'migrate' => [
++ 'default' => [
++ 'database' => 'drupal',
++ 'username' => 'drupal',
++ 'password' => 'drupal',
++ 'host' => 'localhost',
++ 'port' => '',
++ 'prefix' => '',
++ 'driver' => 'mysql',
++ ],
++ ],
+ ],
+ ];
+
+@@ -128,9 +161,55 @@
+ 'prefix' => '',
+ ],
+ ],
++ 'migrate' => [
++ 'default' => [
++ 'database' => 'drupal',
++ 'username' => 'drupal',
++ 'password' => 'drupal',
++ 'host' => 'localhost',
++ 'port' => '',
++ 'prefix' => '',
++ 'driver' => 'mysql',
++ ],
++ ],
+ ],
+ ];
+
++ yield [
++ [
++ 'DATABASE2_NAME' => 'migrate_db_name',
++ 'DATABASE2_USERNAME' => 'migrate_db_user',
++ 'DATABASE2_PASSWORD' => 'migrate_db_pass',
++ 'DATABASE2_HOST' => 'migrate_db_host',
++ 'DATABASE2_PORT' => '3307',
++ ],
++ [
++ 'default' => [
++ 'default' => [
++ 'database' => 'drupal',
++ 'username' => 'drupal',
++ 'password' => 'drupal',
++ 'host' => 'localhost',
++ 'port' => '3306',
++ 'charset' => 'utf8mb4',
++ 'collation' => 'utf8mb4_general_ci',
++ 'driver' => 'mysql',
++ 'prefix' => '',
++ ],
++ ],
++ 'migrate' => [
++ 'default' => [
++ 'database' => 'migrate_db_name',
++ 'username' => 'migrate_db_user',
++ 'password' => 'migrate_db_pass',
++ 'host' => 'migrate_db_host',
++ 'port' => '3307',
++ 'prefix' => '',
++ 'driver' => 'mysql',
++ ],
++ ],
++ ],
++ ];
+ }
+
+ }
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/tests/phpunit/Drupal/EnvironmentSettingsTest.php b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/tests/phpunit/Drupal/EnvironmentSettingsTest.php
new file mode 100644
index 000000000..0849e0c14
--- /dev/null
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/tests/phpunit/Drupal/EnvironmentSettingsTest.php
@@ -0,0 +1,14 @@
+@@ -141,6 +141,13 @@
+ $databases['default']['default']['collation'] = 'utf8_general_ci';
+ $databases['default']['default']['driver'] = 'mysql';
+ $databases['default']['default']['prefix'] = '';
++ $databases['migrate']['default']['database'] = 'drupal';
++ $databases['migrate']['default']['username'] = 'drupal';
++ $databases['migrate']['default']['password'] = 'drupal';
++ $databases['migrate']['default']['host'] = 'localhost';
++ $databases['migrate']['default']['port'] = '';
++ $databases['migrate']['default']['prefix'] = '';
++ $databases['migrate']['default']['driver'] = 'mysql';
+ $this->assertEquals($databases, $this->databases);
+
+ // Verify key config overrides.
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/tests/phpunit/Drupal/SettingsTestCase.php b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/tests/phpunit/Drupal/SettingsTestCase.php
new file mode 100644
index 000000000..5e528577b
--- /dev/null
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/tests/phpunit/Drupal/SettingsTestCase.php
@@ -0,0 +1,8 @@
+@@ -62,6 +62,7 @@
+ const ALLOWED_ENV_VARS = [
+ // Service variables.
+ 'DATABASE_',
++ 'DATABASE2_',
+ 'REDIS_',
+ 'COMPOSE_',
+ 'GITHUB_',
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/web/modules/custom/ys_migrate/migrations/ys_migrate_categories.yml b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/web/modules/custom/ys_migrate/migrations/ys_migrate_categories.yml
new file mode 100644
index 000000000..37be37c5b
--- /dev/null
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/web/modules/custom/ys_migrate/migrations/ys_migrate_categories.yml
@@ -0,0 +1,29 @@
+id: ys_migrate_categories
+label: 'Migrate categories to tags'
+migration_tags:
+ - ys_migrate
+
+source:
+ plugin: table
+ key: migrate
+ table_name: categories
+ id_fields:
+ id:
+ type: integer
+ fields:
+ id: id
+ name: name
+ description: description
+
+process:
+ name: name
+ description__value: description
+ description__format:
+ plugin: default_value
+ default_value: plain_text
+ vid:
+ plugin: default_value
+ default_value: tags
+
+destination:
+ plugin: 'entity:taxonomy_term'
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/web/modules/custom/ys_migrate/ys_migrate.info.yml b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/web/modules/custom/ys_migrate/ys_migrate.info.yml
new file mode 100644
index 000000000..96c67179a
--- /dev/null
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/web/modules/custom/ys_migrate/ys_migrate.info.yml
@@ -0,0 +1,9 @@
+name: star wars Migrate
+type: module
+description: Migrations for star wars site.
+core_version_requirement: ^11
+package: star_wars
+dependencies:
+ - drupal:migrate
+ - migrate_plus:migrate_plus
+ - migrate_tools:migrate_tools
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/web/sites/default/settings.migration.php b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/web/sites/default/settings.migration.php
new file mode 100644
index 000000000..82f5301a0
--- /dev/null
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/web/sites/default/settings.migration.php
@@ -0,0 +1,21 @@
+ getenv('DATABASE2_NAME') ?: getenv('DATABASE2_DATABASE') ?: 'drupal',
+ 'username' => getenv('DATABASE2_USERNAME') ?: 'drupal',
+ 'password' => getenv('DATABASE2_PASSWORD') ?: 'drupal',
+ 'host' => getenv('DATABASE2_HOST') ?: 'localhost',
+ 'port' => getenv('DATABASE2_PORT') ?: '',
+ 'prefix' => '',
+ 'driver' => 'mysql',
+];
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/web/sites/default/settings.php b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/web/sites/default/settings.php
new file mode 100644
index 000000000..ef44adc3d
--- /dev/null
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_container_registry/web/sites/default/settings.php
@@ -0,0 +1,15 @@
+@@ -166,6 +166,14 @@
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
++/// MIGRATION SETTINGS ///
++////////////////////////////////////////////////////////////////////////////////
++// @todo Migration. Remove when migration configuration is no longer required.
++if (file_exists($app_root . '/' . $site_path . '/settings.migration.php')) {
++ require $app_root . '/' . $site_path . '/settings.migration.php';
++}
++
++////////////////////////////////////////////////////////////////////////////////
+ /// LOCAL OVERRIDE ///
+ ////////////////////////////////////////////////////////////////////////////////
+ // @see https://www.vortextemplate.com/docs/drupal/settings#local-overrides
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_ftp/.ahoy.yml b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_ftp/.ahoy.yml
index 0d7123934..b8803f7f0 100644
--- a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_ftp/.ahoy.yml
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_ftp/.ahoy.yml
@@ -21,17 +21,31 @@
# ----------------------------------------------------------------------------
# Container commands.
# ----------------------------------------------------------------------------
-@@ -117,6 +126,13 @@
- cmd: |
+@@ -118,6 +127,13 @@
case " $* " in *" --fresh "*) export VORTEX_DOWNLOAD_DB_FRESH=1;; esac
./scripts/vortex/download-db.sh
-+
+
+ download-db2:
+ usage: Download second database (migration). Run with "--fresh" to force.
+ aliases: [fetch-db2]
+ cmd: |
+ case " $* " in *" --fresh "*) export VORTEX_DOWNLOAD_DB_FORCE=1;; esac
+ VORTEX_DB_INDEX=2 ./scripts/vortex/download-db.sh
-
++
reload-db:
usage: Reload the database container using local database image.
+ cmd: |
+@@ -125,6 +141,13 @@
+ docker compose rm --force --stop --volumes database
+ docker compose build database
+ ahoy up
++
++ reload-db2:
++ usage: Reload the migration database container using local database image.
++ cmd: |
++ ahoy confirm "Running this command will replace your current database. Are you sure?" || exit 0
++ docker compose rm --force --stop --volumes database2
++ ahoy up -- --build database2
+
+ provision:
+ usage: Provision a site from the database dump or profile.
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_ftp/docker-compose.yml b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_ftp/docker-compose.yml
index 3bdb9139b..4a9708dcf 100644
--- a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_ftp/docker-compose.yml
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_ftp/docker-compose.yml
@@ -20,7 +20,7 @@
- '3306' # Database port in a container. Find port on host with `ahoy info` or `docker compose port database 3306`.
+ database2:
-+ image: uselagoon/mysql-8.4:__VERSION__
++ image: "${VORTEX_DB2_IMAGE:-uselagoon/mysql-8.4:__VERSION__}" # Use custom database image (if defined) or fallback to standard database image.
+ environment:
+ <<: *default-environment
+ MYSQL_DATABASE: drupal
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_lagoon/.ahoy.yml b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_lagoon/.ahoy.yml
index 0d7123934..b8803f7f0 100644
--- a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_lagoon/.ahoy.yml
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_lagoon/.ahoy.yml
@@ -21,17 +21,31 @@
# ----------------------------------------------------------------------------
# Container commands.
# ----------------------------------------------------------------------------
-@@ -117,6 +126,13 @@
- cmd: |
+@@ -118,6 +127,13 @@
case " $* " in *" --fresh "*) export VORTEX_DOWNLOAD_DB_FRESH=1;; esac
./scripts/vortex/download-db.sh
-+
+
+ download-db2:
+ usage: Download second database (migration). Run with "--fresh" to force.
+ aliases: [fetch-db2]
+ cmd: |
+ case " $* " in *" --fresh "*) export VORTEX_DOWNLOAD_DB_FORCE=1;; esac
+ VORTEX_DB_INDEX=2 ./scripts/vortex/download-db.sh
-
++
reload-db:
usage: Reload the database container using local database image.
+ cmd: |
+@@ -125,6 +141,13 @@
+ docker compose rm --force --stop --volumes database
+ docker compose build database
+ ahoy up
++
++ reload-db2:
++ usage: Reload the migration database container using local database image.
++ cmd: |
++ ahoy confirm "Running this command will replace your current database. Are you sure?" || exit 0
++ docker compose rm --force --stop --volumes database2
++ ahoy up -- --build database2
+
+ provision:
+ usage: Provision a site from the database dump or profile.
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_lagoon/docker-compose.yml b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_lagoon/docker-compose.yml
index 3bdb9139b..4a9708dcf 100644
--- a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_lagoon/docker-compose.yml
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_lagoon/docker-compose.yml
@@ -20,7 +20,7 @@
- '3306' # Database port in a container. Find port on host with `ahoy info` or `docker compose port database 3306`.
+ database2:
-+ image: uselagoon/mysql-8.4:__VERSION__
++ image: "${VORTEX_DB2_IMAGE:-uselagoon/mysql-8.4:__VERSION__}" # Use custom database image (if defined) or fallback to standard database image.
+ environment:
+ <<: *default-environment
+ MYSQL_DATABASE: drupal
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_s3/.ahoy.yml b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_s3/.ahoy.yml
index 0d7123934..b8803f7f0 100644
--- a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_s3/.ahoy.yml
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_s3/.ahoy.yml
@@ -21,17 +21,31 @@
# ----------------------------------------------------------------------------
# Container commands.
# ----------------------------------------------------------------------------
-@@ -117,6 +126,13 @@
- cmd: |
+@@ -118,6 +127,13 @@
case " $* " in *" --fresh "*) export VORTEX_DOWNLOAD_DB_FRESH=1;; esac
./scripts/vortex/download-db.sh
-+
+
+ download-db2:
+ usage: Download second database (migration). Run with "--fresh" to force.
+ aliases: [fetch-db2]
+ cmd: |
+ case " $* " in *" --fresh "*) export VORTEX_DOWNLOAD_DB_FORCE=1;; esac
+ VORTEX_DB_INDEX=2 ./scripts/vortex/download-db.sh
-
++
reload-db:
usage: Reload the database container using local database image.
+ cmd: |
+@@ -125,6 +141,13 @@
+ docker compose rm --force --stop --volumes database
+ docker compose build database
+ ahoy up
++
++ reload-db2:
++ usage: Reload the migration database container using local database image.
++ cmd: |
++ ahoy confirm "Running this command will replace your current database. Are you sure?" || exit 0
++ docker compose rm --force --stop --volumes database2
++ ahoy up -- --build database2
+
+ provision:
+ usage: Provision a site from the database dump or profile.
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_s3/docker-compose.yml b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_s3/docker-compose.yml
index 3bdb9139b..4a9708dcf 100644
--- a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_s3/docker-compose.yml
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_s3/docker-compose.yml
@@ -20,7 +20,7 @@
- '3306' # Database port in a container. Find port on host with `ahoy info` or `docker compose port database 3306`.
+ database2:
-+ image: uselagoon/mysql-8.4:__VERSION__
++ image: "${VORTEX_DB2_IMAGE:-uselagoon/mysql-8.4:__VERSION__}" # Use custom database image (if defined) or fallback to standard database image.
+ environment:
+ <<: *default-environment
+ MYSQL_DATABASE: drupal
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_url/.ahoy.yml b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_url/.ahoy.yml
index 0d7123934..b8803f7f0 100644
--- a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_url/.ahoy.yml
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_url/.ahoy.yml
@@ -21,17 +21,31 @@
# ----------------------------------------------------------------------------
# Container commands.
# ----------------------------------------------------------------------------
-@@ -117,6 +126,13 @@
- cmd: |
+@@ -118,6 +127,13 @@
case " $* " in *" --fresh "*) export VORTEX_DOWNLOAD_DB_FRESH=1;; esac
./scripts/vortex/download-db.sh
-+
+
+ download-db2:
+ usage: Download second database (migration). Run with "--fresh" to force.
+ aliases: [fetch-db2]
+ cmd: |
+ case " $* " in *" --fresh "*) export VORTEX_DOWNLOAD_DB_FORCE=1;; esac
+ VORTEX_DB_INDEX=2 ./scripts/vortex/download-db.sh
-
++
reload-db:
usage: Reload the database container using local database image.
+ cmd: |
+@@ -125,6 +141,13 @@
+ docker compose rm --force --stop --volumes database
+ docker compose build database
+ ahoy up
++
++ reload-db2:
++ usage: Reload the migration database container using local database image.
++ cmd: |
++ ahoy confirm "Running this command will replace your current database. Are you sure?" || exit 0
++ docker compose rm --force --stop --volumes database2
++ ahoy up -- --build database2
+
+ provision:
+ usage: Provision a site from the database dump or profile.
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_url/docker-compose.yml b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_url/docker-compose.yml
index 3bdb9139b..4a9708dcf 100644
--- a/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_url/docker-compose.yml
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_download_source_url/docker-compose.yml
@@ -20,7 +20,7 @@
- '3306' # Database port in a container. Find port on host with `ahoy info` or `docker compose port database 3306`.
+ database2:
-+ image: uselagoon/mysql-8.4:__VERSION__
++ image: "${VORTEX_DB2_IMAGE:-uselagoon/mysql-8.4:__VERSION__}" # Use custom database image (if defined) or fallback to standard database image.
+ environment:
+ <<: *default-environment
+ MYSQL_DATABASE: drupal
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_enabled/.ahoy.yml b/.vortex/installer/tests/Fixtures/handler_process/migration_enabled/.ahoy.yml
index 0d7123934..b8803f7f0 100644
--- a/.vortex/installer/tests/Fixtures/handler_process/migration_enabled/.ahoy.yml
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_enabled/.ahoy.yml
@@ -21,17 +21,31 @@
# ----------------------------------------------------------------------------
# Container commands.
# ----------------------------------------------------------------------------
-@@ -117,6 +126,13 @@
- cmd: |
+@@ -118,6 +127,13 @@
case " $* " in *" --fresh "*) export VORTEX_DOWNLOAD_DB_FRESH=1;; esac
./scripts/vortex/download-db.sh
-+
+
+ download-db2:
+ usage: Download second database (migration). Run with "--fresh" to force.
+ aliases: [fetch-db2]
+ cmd: |
+ case " $* " in *" --fresh "*) export VORTEX_DOWNLOAD_DB_FORCE=1;; esac
+ VORTEX_DB_INDEX=2 ./scripts/vortex/download-db.sh
-
++
reload-db:
usage: Reload the database container using local database image.
+ cmd: |
+@@ -125,6 +141,13 @@
+ docker compose rm --force --stop --volumes database
+ docker compose build database
+ ahoy up
++
++ reload-db2:
++ usage: Reload the migration database container using local database image.
++ cmd: |
++ ahoy confirm "Running this command will replace your current database. Are you sure?" || exit 0
++ docker compose rm --force --stop --volumes database2
++ ahoy up -- --build database2
+
+ provision:
+ usage: Provision a site from the database dump or profile.
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_enabled/docker-compose.yml b/.vortex/installer/tests/Fixtures/handler_process/migration_enabled/docker-compose.yml
index 3bdb9139b..4a9708dcf 100644
--- a/.vortex/installer/tests/Fixtures/handler_process/migration_enabled/docker-compose.yml
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_enabled/docker-compose.yml
@@ -20,7 +20,7 @@
- '3306' # Database port in a container. Find port on host with `ahoy info` or `docker compose port database 3306`.
+ database2:
-+ image: uselagoon/mysql-8.4:__VERSION__
++ image: "${VORTEX_DB2_IMAGE:-uselagoon/mysql-8.4:__VERSION__}" # Use custom database image (if defined) or fallback to standard database image.
+ environment:
+ <<: *default-environment
+ MYSQL_DATABASE: drupal
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_enabled_circleci/.ahoy.yml b/.vortex/installer/tests/Fixtures/handler_process/migration_enabled_circleci/.ahoy.yml
index 0d7123934..b8803f7f0 100644
--- a/.vortex/installer/tests/Fixtures/handler_process/migration_enabled_circleci/.ahoy.yml
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_enabled_circleci/.ahoy.yml
@@ -21,17 +21,31 @@
# ----------------------------------------------------------------------------
# Container commands.
# ----------------------------------------------------------------------------
-@@ -117,6 +126,13 @@
- cmd: |
+@@ -118,6 +127,13 @@
case " $* " in *" --fresh "*) export VORTEX_DOWNLOAD_DB_FRESH=1;; esac
./scripts/vortex/download-db.sh
-+
+
+ download-db2:
+ usage: Download second database (migration). Run with "--fresh" to force.
+ aliases: [fetch-db2]
+ cmd: |
+ case " $* " in *" --fresh "*) export VORTEX_DOWNLOAD_DB_FORCE=1;; esac
+ VORTEX_DB_INDEX=2 ./scripts/vortex/download-db.sh
-
++
reload-db:
usage: Reload the database container using local database image.
+ cmd: |
+@@ -125,6 +141,13 @@
+ docker compose rm --force --stop --volumes database
+ docker compose build database
+ ahoy up
++
++ reload-db2:
++ usage: Reload the migration database container using local database image.
++ cmd: |
++ ahoy confirm "Running this command will replace your current database. Are you sure?" || exit 0
++ docker compose rm --force --stop --volumes database2
++ ahoy up -- --build database2
+
+ provision:
+ usage: Provision a site from the database dump or profile.
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_enabled_circleci/docker-compose.yml b/.vortex/installer/tests/Fixtures/handler_process/migration_enabled_circleci/docker-compose.yml
index 3bdb9139b..4a9708dcf 100644
--- a/.vortex/installer/tests/Fixtures/handler_process/migration_enabled_circleci/docker-compose.yml
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_enabled_circleci/docker-compose.yml
@@ -20,7 +20,7 @@
- '3306' # Database port in a container. Find port on host with `ahoy info` or `docker compose port database 3306`.
+ database2:
-+ image: uselagoon/mysql-8.4:__VERSION__
++ image: "${VORTEX_DB2_IMAGE:-uselagoon/mysql-8.4:__VERSION__}" # Use custom database image (if defined) or fallback to standard database image.
+ environment:
+ <<: *default-environment
+ MYSQL_DATABASE: drupal
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_enabled_lagoon/.ahoy.yml b/.vortex/installer/tests/Fixtures/handler_process/migration_enabled_lagoon/.ahoy.yml
index 0d7123934..b8803f7f0 100644
--- a/.vortex/installer/tests/Fixtures/handler_process/migration_enabled_lagoon/.ahoy.yml
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_enabled_lagoon/.ahoy.yml
@@ -21,17 +21,31 @@
# ----------------------------------------------------------------------------
# Container commands.
# ----------------------------------------------------------------------------
-@@ -117,6 +126,13 @@
- cmd: |
+@@ -118,6 +127,13 @@
case " $* " in *" --fresh "*) export VORTEX_DOWNLOAD_DB_FRESH=1;; esac
./scripts/vortex/download-db.sh
-+
+
+ download-db2:
+ usage: Download second database (migration). Run with "--fresh" to force.
+ aliases: [fetch-db2]
+ cmd: |
+ case " $* " in *" --fresh "*) export VORTEX_DOWNLOAD_DB_FORCE=1;; esac
+ VORTEX_DB_INDEX=2 ./scripts/vortex/download-db.sh
-
++
reload-db:
usage: Reload the database container using local database image.
+ cmd: |
+@@ -125,6 +141,13 @@
+ docker compose rm --force --stop --volumes database
+ docker compose build database
+ ahoy up
++
++ reload-db2:
++ usage: Reload the migration database container using local database image.
++ cmd: |
++ ahoy confirm "Running this command will replace your current database. Are you sure?" || exit 0
++ docker compose rm --force --stop --volumes database2
++ ahoy up -- --build database2
+
+ provision:
+ usage: Provision a site from the database dump or profile.
diff --git a/.vortex/installer/tests/Fixtures/handler_process/migration_enabled_lagoon/docker-compose.yml b/.vortex/installer/tests/Fixtures/handler_process/migration_enabled_lagoon/docker-compose.yml
index 2aedeff23..ebe267536 100644
--- a/.vortex/installer/tests/Fixtures/handler_process/migration_enabled_lagoon/docker-compose.yml
+++ b/.vortex/installer/tests/Fixtures/handler_process/migration_enabled_lagoon/docker-compose.yml
@@ -66,7 +66,7 @@
+ lagoon.type: mariadb # See https://docs.lagoon.sh/using-lagoon-advanced/service-types/
+ database2:
-+ image: uselagoon/mysql-8.4:__VERSION__
++ image: "${VORTEX_DB2_IMAGE:-uselagoon/mysql-8.4:__VERSION__}" # Use custom database image (if defined) or fallback to standard database image.
+ environment:
+ <<: *default-environment
+ MYSQL_DATABASE: drupal
diff --git a/.vortex/installer/tests/Functional/Handlers/MigrationDownloadSourceHandlerProcessTest.php b/.vortex/installer/tests/Functional/Handlers/MigrationDownloadSourceHandlerProcessTest.php
index e8f743c23..794529147 100644
--- a/.vortex/installer/tests/Functional/Handlers/MigrationDownloadSourceHandlerProcessTest.php
+++ b/.vortex/installer/tests/Functional/Handlers/MigrationDownloadSourceHandlerProcessTest.php
@@ -6,6 +6,7 @@
use DrevOps\VortexInstaller\Prompts\Handlers\Migration;
use DrevOps\VortexInstaller\Prompts\Handlers\MigrationDownloadSource;
+use DrevOps\VortexInstaller\Prompts\Handlers\MigrationImage;
use DrevOps\VortexInstaller\Tests\Functional\FunctionalTestCase;
use DrevOps\VortexInstaller\Utils\Env;
use PHPUnit\Framework\Attributes\CoversClass;
@@ -74,6 +75,20 @@ public static function dataProviderHandlerProcess(): \Iterator {
$test->assertFileNotContainsString(static::$sut . '/.env', 'VORTEX_DOWNLOAD_DB2_FTP_HOST');
}),
];
+ yield 'migration_download_source_container_registry' => [
+ static::cw(function (): void {
+ Env::put(Migration::envName(), Env::TRUE);
+ Env::put(MigrationDownloadSource::envName(), MigrationDownloadSource::CONTAINER_REGISTRY);
+ Env::put(MigrationImage::envName(), 'the_empire/star_wars-migration:latest');
+ }),
+ static::cw(function (FunctionalTestCase $test): void {
+ $test->assertFileContainsString(static::$sut . '/.env', 'VORTEX_DOWNLOAD_DB2_SOURCE=container_registry');
+ $test->assertFileContainsString(static::$sut . '/.env', 'VORTEX_DB2_IMAGE=the_empire/star_wars-migration:latest');
+ $test->assertFileNotContainsString(static::$sut . '/.env', 'VORTEX_DOWNLOAD_DB2_URL=');
+ $test->assertFileNotContainsString(static::$sut . '/.env', 'VORTEX_DOWNLOAD_DB2_FTP_HOST');
+ $test->assertFileNotContainsString(static::$sut . '/.env', 'VORTEX_DOWNLOAD_DB2_S3_BUCKET');
+ }),
+ ];
}
}
diff --git a/.vortex/installer/tests/Unit/Handlers/AbstractHandlerDiscoveryTestCase.php b/.vortex/installer/tests/Unit/Handlers/AbstractHandlerDiscoveryTestCase.php
index 8d4cd0e4c..fc1b1e181 100644
--- a/.vortex/installer/tests/Unit/Handlers/AbstractHandlerDiscoveryTestCase.php
+++ b/.vortex/installer/tests/Unit/Handlers/AbstractHandlerDiscoveryTestCase.php
@@ -22,6 +22,7 @@
use DrevOps\VortexInstaller\Prompts\Handlers\MachineName;
use DrevOps\VortexInstaller\Prompts\Handlers\Migration;
use DrevOps\VortexInstaller\Prompts\Handlers\MigrationDownloadSource;
+use DrevOps\VortexInstaller\Prompts\Handlers\MigrationImage;
use DrevOps\VortexInstaller\Prompts\Handlers\ModulePrefix;
use DrevOps\VortexInstaller\Prompts\Handlers\Modules;
use DrevOps\VortexInstaller\Prompts\Handlers\Name;
@@ -149,6 +150,7 @@ protected static function getExpectedDefaults(): array {
DatabaseImage::id() => NULL,
Migration::id() => FALSE,
MigrationDownloadSource::id() => NULL,
+ MigrationImage::id() => NULL,
CiProvider::id() => CiProvider::GITHUB_ACTIONS,
DependencyUpdatesProvider::id() => DependencyUpdatesProvider::RENOVATEBOT_APP,
AssignAuthorPr::id() => TRUE,
@@ -224,6 +226,7 @@ public static function defaultTuiAnswers(): array {
DatabaseImage::id() => static::TUI_SKIP,
Migration::id() => static::TUI_DEFAULT,
MigrationDownloadSource::id() => static::TUI_SKIP,
+ MigrationImage::id() => static::TUI_SKIP,
CiProvider::id() => static::TUI_DEFAULT,
DependencyUpdatesProvider::id() => static::TUI_DEFAULT,
AssignAuthorPr::id() => static::TUI_DEFAULT,
diff --git a/.vortex/installer/tests/Unit/Handlers/AbstractHandlerTypeTest.php b/.vortex/installer/tests/Unit/Handlers/AbstractHandlerTypeTest.php
index 143bcb242..b5f40f2c9 100644
--- a/.vortex/installer/tests/Unit/Handlers/AbstractHandlerTypeTest.php
+++ b/.vortex/installer/tests/Unit/Handlers/AbstractHandlerTypeTest.php
@@ -11,6 +11,7 @@
use DrevOps\VortexInstaller\Prompts\Handlers\CodeProvider;
use DrevOps\VortexInstaller\Prompts\Handlers\DatabaseDownloadSource;
use DrevOps\VortexInstaller\Prompts\Handlers\DatabaseImage;
+use DrevOps\VortexInstaller\Prompts\Handlers\MigrationImage;
use DrevOps\VortexInstaller\Prompts\Handlers\DependencyUpdatesProvider;
use DrevOps\VortexInstaller\Prompts\Handlers\DeployTypes;
use DrevOps\VortexInstaller\Prompts\Handlers\Domain;
@@ -79,6 +80,7 @@ public static function dataProviderTypeInference(): \Iterator {
yield 'hosting_project_name' => [HostingProjectName::id(), PromptType::Text];
yield 'webroot' => [Webroot::id(), PromptType::Text];
yield 'database_image' => [DatabaseImage::id(), PromptType::Text];
+ yield 'migration_image' => [MigrationImage::id(), PromptType::Text];
// Select handlers.
yield 'starter' => [Starter::id(), PromptType::Select];
yield 'profile' => [Profile::id(), PromptType::Select];
diff --git a/.vortex/installer/tests/Unit/Handlers/MigrationImageHandlerDiscoveryTest.php b/.vortex/installer/tests/Unit/Handlers/MigrationImageHandlerDiscoveryTest.php
new file mode 100644
index 000000000..7867660e3
--- /dev/null
+++ b/.vortex/installer/tests/Unit/Handlers/MigrationImageHandlerDiscoveryTest.php
@@ -0,0 +1,51 @@
+ [
+ [
+ Migration::id() => Key::LEFT . Key::ENTER,
+ MigrationDownloadSource::id() => Key::DOWN . Key::DOWN . Key::DOWN . Key::DOWN . Key::ENTER,
+ MigrationImage::id() => static::TUI_DEFAULT,
+ ],
+ [Migration::id() => TRUE, MigrationDownloadSource::id() => MigrationDownloadSource::CONTAINER_REGISTRY, MigrationImage::id() => 'myprojectorg/myproject-data-migration:latest'] + $expected_defaults,
+ ];
+ yield 'migration image - invalid' => [
+ [
+ Migration::id() => Key::LEFT . Key::ENTER,
+ MigrationDownloadSource::id() => Key::DOWN . Key::DOWN . Key::DOWN . Key::DOWN . 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,
+ MigrationDownloadSource::id() => Key::DOWN . Key::DOWN . Key::DOWN . Key::DOWN . Key::ENTER,
+ ],
+ [
+ Migration::id() => TRUE,
+ MigrationDownloadSource::id() => MigrationDownloadSource::CONTAINER_REGISTRY,
+ MigrationImage::id() => 'discovered_owner/discovered_migration:tag',
+ ] + $expected_defaults,
+ function (AbstractHandlerDiscoveryTestCase $test, Config $config): void {
+ $test->stubDotenvValue('VORTEX_DB2_IMAGE', 'discovered_owner/discovered_migration:tag');
+ },
+ ];
+ }
+
+}
diff --git a/.vortex/installer/tests/Unit/Schema/SchemaGeneratorTest.php b/.vortex/installer/tests/Unit/Schema/SchemaGeneratorTest.php
index fe4608d6b..d7190bbd3 100644
--- a/.vortex/installer/tests/Unit/Schema/SchemaGeneratorTest.php
+++ b/.vortex/installer/tests/Unit/Schema/SchemaGeneratorTest.php
@@ -8,6 +8,7 @@
use DrevOps\VortexInstaller\Prompts\Handlers\CiProvider;
use DrevOps\VortexInstaller\Prompts\Handlers\DatabaseDownloadSource;
use DrevOps\VortexInstaller\Prompts\Handlers\DatabaseImage;
+use DrevOps\VortexInstaller\Prompts\Handlers\MigrationImage;
use DrevOps\VortexInstaller\Prompts\Handlers\HostingProjectName;
use DrevOps\VortexInstaller\Prompts\Handlers\HostingProvider;
use DrevOps\VortexInstaller\Prompts\Handlers\Migration;
@@ -132,6 +133,7 @@ public static function dataProviderDependsOnFormat(): \Iterator {
yield 'database_download_source' => [DatabaseDownloadSource::id()];
yield 'database_image' => [DatabaseImage::id()];
yield 'migration_download_source' => [MigrationDownloadSource::id()];
+ yield 'migration_image' => [MigrationImage::id()];
}
public function testUtilityHandlersExcluded(): void {
diff --git a/.vortex/tests/phpunit/Functional/AhoyWorkflowTest.php b/.vortex/tests/phpunit/Functional/AhoyWorkflowTest.php
index 52c549103..d2a11c73c 100644
--- a/.vortex/tests/phpunit/Functional/AhoyWorkflowTest.php
+++ b/.vortex/tests/phpunit/Functional/AhoyWorkflowTest.php
@@ -292,6 +292,34 @@ public function testAhoyWorkflowMigration(): void {
$this->subtestAhoyMigrationSkip();
}
+ #[Group('p4')]
+ public function testAhoyWorkflowMigrationDatabaseFromImage(): void {
+ static::$sutInstallerEnv = [
+ 'VORTEX_INSTALLER_IS_DEMO' => '1',
+ 'VORTEX_INSTALLER_PROMPT_MIGRATION' => 'true',
+ 'VORTEX_INSTALLER_PROMPT_MIGRATION_DOWNLOAD_SOURCE' => 'container_registry',
+ 'VORTEX_INSTALLER_PROMPT_MIGRATION_IMAGE' => self::VORTEX_DB_IMAGE_TEST,
+ ];
+ $this->prepareSut();
+ $this->adjustAhoyForUnmountedVolumes();
+
+ // Verify installer produced the migration infrastructure.
+ $this->subtestAhoyMigrationFilesPresent();
+
+ $this->logSubstep('Verify migration database image configuration');
+ $this->assertFileContainsString('.env', 'VORTEX_DOWNLOAD_DB2_SOURCE=container_registry', '.env should contain container registry source for migration');
+ $this->assertFileContainsString('.env', 'VORTEX_DB2_IMAGE=' . self::VORTEX_DB_IMAGE_TEST, '.env should contain migration database image');
+
+ // Skip migration during build - we are testing the container reload
+ // mechanism, not actual migrations. The test image has a standard Drupal
+ // database, not the migration source data.
+ $this->fileAddVar('.env', 'DRUPAL_MIGRATION_SKIP', '1');
+
+ $this->subtestAhoyBuild();
+
+ $this->subtestAhoyMigrationReloadDb();
+ }
+
#[Group('p4')]
public function testAhoyUpdateVortexLatest(): void {
// For test performance, we only export the current codebase without git
diff --git a/.vortex/tests/phpunit/Traits/Subtests/SubtestAhoyTrait.php b/.vortex/tests/phpunit/Traits/Subtests/SubtestAhoyTrait.php
index d4c12f015..a3d2e9e37 100644
--- a/.vortex/tests/phpunit/Traits/Subtests/SubtestAhoyTrait.php
+++ b/.vortex/tests/phpunit/Traits/Subtests/SubtestAhoyTrait.php
@@ -866,6 +866,7 @@ protected function subtestAhoyMigrationFilesPresent(): void {
$this->assertFileContainsString('.env', 'VORTEX_DOWNLOAD_DB2_FILE');
$this->assertFileContainsString('.env', 'VORTEX_DOWNLOAD_DB2_SOURCE');
$this->assertFileContainsString('.ahoy.yml', 'download-db2');
+ $this->assertFileContainsString('.ahoy.yml', 'reload-db2');
$this->logStepFinish();
}
@@ -880,6 +881,45 @@ protected function subtestAhoyMigrationDownloadDb(): void {
$this->logStepFinish();
}
+ protected function subtestAhoyMigrationReloadDb(): void {
+ $this->logStepStart();
+
+ $this->logSubstep('Verify database2 container has data from the image');
+ $this->cmd(
+ 'ahoy cli "vendor/bin/drush sql:query --database=migrate \"SHOW TABLES\""',
+ '* node',
+ 'Migration database should have tables from the container image',
+ tio: 30,
+ );
+
+ $this->logSubstep('Drop all tables in database2 to simulate data loss');
+ $this->cmd('ahoy cli "vendor/bin/drush sql:drop --database=migrate -y"', txt: 'Drop migration database tables', tio: 30);
+
+ $this->logSubstep('Verify database2 is empty after drop');
+ $this->cmd(
+ 'ahoy cli "vendor/bin/drush sql:query --database=migrate \"SHOW TABLES\""',
+ '! node',
+ 'Migration database should have no tables after drop',
+ tio: 30,
+ );
+
+ $this->logSubstep('Reload database2 from the container image');
+ $this->cmd('ahoy reload-db2', txt: '`ahoy reload-db2` reloads migration database container', tio: 60);
+
+ $this->logSubstep('Wait for database2 container to be ready');
+ $this->cmd('docker compose exec -T cli wait-for database2:3306', txt: 'Wait for database2 to accept connections', tio: 60);
+
+ $this->logSubstep('Verify database2 data is restored after reload');
+ $this->cmd(
+ 'ahoy cli "vendor/bin/drush sql:query --database=migrate \"SHOW TABLES\""',
+ '* node',
+ 'Migration database should have tables restored after reload',
+ tio: 30,
+ );
+
+ $this->logStepFinish();
+ }
+
protected function subtestAhoyMigrationProvision(): void {
$this->logStepStart();
diff --git a/docker-compose.yml b/docker-compose.yml
index 5b55c1f8b..900aa31c8 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -199,7 +199,7 @@ services:
#;< MIGRATION
database2:
- image: uselagoon/mysql-8.4:26.2.0
+ image: "${VORTEX_DB2_IMAGE:-uselagoon/mysql-8.4:26.2.0}" # Use custom database image (if defined) or fallback to standard database image.
environment:
<<: *default-environment
MYSQL_DATABASE: drupal