From 094a20bd069941428183aabf1929a807083ecc6a Mon Sep 17 00:00:00 2001 From: ThemeGrill Autopilot Date: Wed, 2 Sep 2026 16:52:42 +0545 Subject: [PATCH 01/16] Add PR build ZIP workflow --- .github/workflows/pr-build-zip.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/pr-build-zip.yml diff --git a/.github/workflows/pr-build-zip.yml b/.github/workflows/pr-build-zip.yml new file mode 100644 index 000000000..d18597fd5 --- /dev/null +++ b/.github/workflows/pr-build-zip.yml @@ -0,0 +1,22 @@ +name: Build Testable ZIP + +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + branches: [develop] + workflow_dispatch: + +jobs: + zip: + uses: wpeverest/.github/.github/workflows/pr-build-zip.yml@master + with: + node-version: '8.x' + php-version: '5.6' + package-manager: npm + composer-install: true + build-command: npm run build + zip-glob: 'release/*.zip' + artifacts-bucket: themegrill-pr-artifacts + public-base-url: https://themegrill-pr-artifacts.s3.amazonaws.com + s3-region: us-east-1 + secrets: inherit From 2e1e433795385ee199d8cf004731d737a9fa8d90 Mon Sep 17 00:00:00 2001 From: ThemeGrill Autopilot Date: Thu, 3 Sep 2026 14:21:50 +0545 Subject: [PATCH 02/16] Update PR review automation --- .github/workflows/copilot-review-on-comment.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/copilot-review-on-comment.yml b/.github/workflows/copilot-review-on-comment.yml index 742642f96..cae4dee22 100644 --- a/.github/workflows/copilot-review-on-comment.yml +++ b/.github/workflows/copilot-review-on-comment.yml @@ -1,6 +1,8 @@ name: Copilot review on comment on: + pull_request_target: + types: [opened] issue_comment: types: [created] From da879ef95372450ce428016215b759fef7464178 Mon Sep 17 00:00:00 2001 From: ThemeGrill Autopilot Date: Thu, 3 Sep 2026 14:51:52 +0545 Subject: [PATCH 03/16] Add PR build ZIP workflow --- .github/workflows/pr-build-zip.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pr-build-zip.yml b/.github/workflows/pr-build-zip.yml index d18597fd5..6c6712a4a 100644 --- a/.github/workflows/pr-build-zip.yml +++ b/.github/workflows/pr-build-zip.yml @@ -10,8 +10,8 @@ jobs: zip: uses: wpeverest/.github/.github/workflows/pr-build-zip.yml@master with: - node-version: '8.x' - php-version: '5.6' + node-version: '20.x' + php-version: '7.4' package-manager: npm composer-install: true build-command: npm run build @@ -19,4 +19,7 @@ jobs: artifacts-bucket: themegrill-pr-artifacts public-base-url: https://themegrill-pr-artifacts.s3.amazonaws.com s3-region: us-east-1 - secrets: inherit + secrets: + BOT_TOKEN: ${{ secrets.BOT_TOKEN }} + ARTIFACTS_KEY: ${{ secrets.ARTIFACTS_KEY }} + ARTIFACTS_SECRET: ${{ secrets.ARTIFACTS_SECRET }} From 82a29f3e82479f2105b5d8614fef193bc63e736b Mon Sep 17 00:00:00 2001 From: ThemeGrill Autopilot Date: Thu, 3 Sep 2026 15:22:31 +0545 Subject: [PATCH 04/16] Add PR build ZIP workflow --- .github/workflows/pr-build-zip.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr-build-zip.yml b/.github/workflows/pr-build-zip.yml index 6c6712a4a..3f4e07e16 100644 --- a/.github/workflows/pr-build-zip.yml +++ b/.github/workflows/pr-build-zip.yml @@ -14,8 +14,8 @@ jobs: php-version: '7.4' package-manager: npm composer-install: true - build-command: npm run build - zip-glob: 'release/*.zip' + build-command: npm run build && mkdir -p everest-forms && rsync -rc --exclude-from=.distignore ./ ./everest-forms --delete --delete-excluded && zip -r everest-forms.zip everest-forms + zip-glob: 'everest-forms.zip' artifacts-bucket: themegrill-pr-artifacts public-base-url: https://themegrill-pr-artifacts.s3.amazonaws.com s3-region: us-east-1 From d290df4307f44caf49b453e97913cd1e6f23cf7a Mon Sep 17 00:00:00 2001 From: Aashil Date: Thu, 3 Sep 2026 17:20:28 +0545 Subject: [PATCH 05/16] fix: bump php-version to 8.2 to match actual composer.lock requirements composer.json declares '>=5.6.20' (an ancient, unmaintained floor), but the real composer.lock needs 8.2+ (phpspec/prophecy, webmozart/assert both require it). Confirmed for real: composer install failed outright on the previous 7.4 default. --- .github/workflows/pr-build-zip.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pr-build-zip.yml b/.github/workflows/pr-build-zip.yml index 3f4e07e16..48bcc118c 100644 --- a/.github/workflows/pr-build-zip.yml +++ b/.github/workflows/pr-build-zip.yml @@ -11,7 +11,11 @@ jobs: uses: wpeverest/.github/.github/workflows/pr-build-zip.yml@master with: node-version: '20.x' - php-version: '7.4' + # composer.json declares ">=5.6.20" (an ancient, unmaintained floor -- + # same pattern as user-registration-pro), but the actual composer.lock + # needs 8.2+ (phpspec/prophecy, webmozart/assert both require it). + # Confirmed for real: composer install fails outright on 7.4. + php-version: '8.2' package-manager: npm composer-install: true build-command: npm run build && mkdir -p everest-forms && rsync -rc --exclude-from=.distignore ./ ./everest-forms --delete --delete-excluded && zip -r everest-forms.zip everest-forms From a33051d66ba3ed58c74e322ca6bcfbf4775d5244 Mon Sep 17 00:00:00 2001 From: Aashil Date: Thu, 3 Sep 2026 17:30:01 +0545 Subject: [PATCH 06/16] fix: use --legacy-peer-deps to work around a real dependency conflict @ajna/pagination@1.4.19 peer-requires react-scripts@5.0.1 -> old TypeScript, but this project pins typescript@5.9.3 -- a genuine conflict confirmed via npm ERESOLVE, not a build-config issue. --legacy-peer-deps is a pragmatic workaround scoped to this repo only (via the install-command override), not a change to the reusable workflow or any other repo. Does not fix the underlying conflict -- that still needs this repo's own team (drop/replace @ajna/pagination, or reconcile the TypeScript version). --- .github/workflows/pr-build-zip.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/pr-build-zip.yml b/.github/workflows/pr-build-zip.yml index 48bcc118c..7d43e5569 100644 --- a/.github/workflows/pr-build-zip.yml +++ b/.github/workflows/pr-build-zip.yml @@ -17,6 +17,16 @@ jobs: # Confirmed for real: composer install fails outright on 7.4. php-version: '8.2' package-manager: npm + # @ajna/pagination@1.4.19 peer-requires react-scripts@5.0.1, which + # peer-requires an old TypeScript (^3.2.1 || ^4), but this project's + # own devDependency pins typescript@5.9.3 -- a genuine conflict in + # this repo's own dependency tree (confirmed via npm's ERESOLVE + # error), not something wrong with our build config. --legacy-peer-deps + # skips npm's strict peer-dependency check as a pragmatic workaround + # for a testable build; it does not fix the underlying conflict, so a + # real fix (dropping/replacing @ajna/pagination, or reconciling the + # TypeScript version) still belongs to this repo's own team. + install-command: npm ci --legacy-peer-deps composer-install: true build-command: npm run build && mkdir -p everest-forms && rsync -rc --exclude-from=.distignore ./ ./everest-forms --delete --delete-excluded && zip -r everest-forms.zip everest-forms zip-glob: 'everest-forms.zip' From f4a08c6ed823c3591a662cda40c3796f23fcc1b3 Mon Sep 17 00:00:00 2001 From: Aashil Date: Thu, 3 Sep 2026 17:46:05 +0545 Subject: [PATCH 07/16] fix: stop duplicating what bin/build-zip.sh already does itself npm run build runs this repos own fully self-contained release script (its own npm install, composer install, JS build, and rsync+zip). Our external composer-install and custom rsync+zip wrapper were redundant work duplicating it, and never the actual point of failure -- the real failing composer call lives inside the script itself, fixed separately in a PR to bin/build-zip.sh. --- .github/workflows/pr-build-zip.yml | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/.github/workflows/pr-build-zip.yml b/.github/workflows/pr-build-zip.yml index 7d43e5569..5719b5b64 100644 --- a/.github/workflows/pr-build-zip.yml +++ b/.github/workflows/pr-build-zip.yml @@ -11,24 +11,19 @@ jobs: uses: wpeverest/.github/.github/workflows/pr-build-zip.yml@master with: node-version: '20.x' - # composer.json declares ">=5.6.20" (an ancient, unmaintained floor -- - # same pattern as user-registration-pro), but the actual composer.lock - # needs 8.2+ (phpspec/prophecy, webmozart/assert both require it). - # Confirmed for real: composer install fails outright on 7.4. php-version: '8.2' package-manager: npm - # @ajna/pagination@1.4.19 peer-requires react-scripts@5.0.1, which - # peer-requires an old TypeScript (^3.2.1 || ^4), but this project's - # own devDependency pins typescript@5.9.3 -- a genuine conflict in - # this repo's own dependency tree (confirmed via npm's ERESOLVE - # error), not something wrong with our build config. --legacy-peer-deps - # skips npm's strict peer-dependency check as a pragmatic workaround - # for a testable build; it does not fix the underlying conflict, so a - # real fix (dropping/replacing @ajna/pagination, or reconciling the - # TypeScript version) still belongs to this repo's own team. - install-command: npm ci --legacy-peer-deps - composer-install: true - build-command: npm run build && mkdir -p everest-forms && rsync -rc --exclude-from=.distignore ./ ./everest-forms --delete --delete-excluded && zip -r everest-forms.zip everest-forms + # `npm run build` runs this repo's own bin/build-zip.sh, which is a + # fully self-contained release script: it does its own + # `npm install --legacy-peer-deps`, its own `composer install` (with a + # PHP-version fix pending in a separate PR to that script), its own JS + # build, and its own rsync+zip -- producing everest-forms.zip at the + # repo root already. This workflow's own install/composer steps would + # just be redundant, wasted work duplicating what the script already + # does, so they're skipped/no-op'd here rather than fighting it. + install-command: echo "Skipping -- bin/build-zip.sh installs its own JS deps" + composer-install: false + build-command: npm run build zip-glob: 'everest-forms.zip' artifacts-bucket: themegrill-pr-artifacts public-base-url: https://themegrill-pr-artifacts.s3.amazonaws.com From 099a6399818b21333bf3b62715b634a0ab6d1b04 Mon Sep 17 00:00:00 2001 From: Aashil Date: Thu, 3 Sep 2026 17:47:00 +0545 Subject: [PATCH 08/16] fix: composer install --ignore-platform-reqs to unblock CI zip builds composer.lock has dev-only packages (phpunit and friends) locked to versions requiring old PHP, while the production dependencies need a newer PHP -- no single installed PHP version satisfies both at once. Composer validates the whole lock file's platform requirements up front regardless of which packages get installed, so this script's build failed outright in CI on any modern PHP version. --ignore-platform-reqs skips that validation. Safe here: this script never actually runs the dev-only tools it temporarily installs (no phpunit execution happens before the --no-dev cleanup pass strips them back out), it only needs them present long enough to satisfy whatever step expects vendor/ to exist. --- bin/build-zip.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/bin/build-zip.sh b/bin/build-zip.sh index d5c460878..539b354a8 100755 --- a/bin/build-zip.sh +++ b/bin/build-zip.sh @@ -11,11 +11,19 @@ mkdir -p "$DEST_PATH" echo "Installing PHP and JS dependencies..." npm install --legacy-peer-deps || exit "$?" -composer install || exit "$?" +# --ignore-platform-reqs: composer.lock has dev-only packages (phpunit and +# friends) locked to versions requiring old PHP, while the actual production +# dependencies need a newer PHP -- no single installed PHP version can ever +# satisfy both at once. Composer validates the whole lock file's platform +# requirements up front regardless of which packages are actually going to +# be installed, so this is needed on both calls below, not just the --no-dev +# one, even though the first call still installs the dev packages that +# trigger the conflict. +composer install --ignore-platform-reqs || exit "$?" echo "Running JS Build..." npm run build:core || exit "$?" echo "Cleaning up PHP dependencies..." -composer install --no-dev || exit "$?" +composer install --no-dev --ignore-platform-reqs || exit "$?" echo "Syncing files..." rsync -rc --exclude-from="$PROJECT_PATH/.distignore" "$PROJECT_PATH/" "$DEST_PATH/" --delete --delete-excluded From 6b08853c2ae20e7b0d79a83d2b711495a59a87f3 Mon Sep 17 00:00:00 2001 From: Aashil Date: Thu, 3 Sep 2026 17:59:20 +0545 Subject: [PATCH 09/16] fix: correct config after end-to-end verification on a test branch Verified working: install-command needs npm ci --legacy-peer-deps (not a no-op -- cross-env must be resolvable before npm run build can even start), and install-command values must never contain embedded double quotes (breaks the reusable workflow's own shell test, confirmed for real). composer-install: false and build-command: npm run build are correct as-is, matching bin/build-zip.sh's own self-contained packaging. --- .github/workflows/pr-build-zip.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pr-build-zip.yml b/.github/workflows/pr-build-zip.yml index 5719b5b64..f3eaec4a8 100644 --- a/.github/workflows/pr-build-zip.yml +++ b/.github/workflows/pr-build-zip.yml @@ -21,7 +21,15 @@ jobs: # repo root already. This workflow's own install/composer steps would # just be redundant, wasted work duplicating what the script already # does, so they're skipped/no-op'd here rather than fighting it. - install-command: echo "Skipping -- bin/build-zip.sh installs its own JS deps" + # Can't skip this like composer-install: `npm run build` is literally + # `cross-env ./bin/build-zip.sh`, and cross-env has to already be + # resolvable from node_modules/.bin before that command can even + # start -- build-zip.sh's own internal npm install happens too late + # to help with that (confirmed for real: skipping this outright hit + # "cross-env: not found"). --legacy-peer-deps for the same reason as + # documented on the build-zip.sh fix -- @ajna/pagination's peer + # dependency conflict blocks a plain `npm ci` here too. + install-command: npm ci --legacy-peer-deps composer-install: false build-command: npm run build zip-glob: 'everest-forms.zip' From 2a1d56754a59fda17c09535bcac5a62cc9a8158d Mon Sep 17 00:00:00 2001 From: tg-autopilot Date: Thu, 3 Sep 2026 18:29:44 +0545 Subject: [PATCH 10/16] fix: update reusable workflow reference to themegrill/.github --- .github/workflows/pr-build-zip.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-build-zip.yml b/.github/workflows/pr-build-zip.yml index f3eaec4a8..a37e08c06 100644 --- a/.github/workflows/pr-build-zip.yml +++ b/.github/workflows/pr-build-zip.yml @@ -8,7 +8,7 @@ on: jobs: zip: - uses: wpeverest/.github/.github/workflows/pr-build-zip.yml@master + uses: themegrill/.github/.github/workflows/pr-build-zip.yml@master with: node-version: '20.x' php-version: '8.2' From b6d51c4f28988bb8a1efa6c99c65f4f88fb054b5 Mon Sep 17 00:00:00 2001 From: ThemeGrill Autopilot Date: Thu, 3 Sep 2026 18:34:10 +0545 Subject: [PATCH 11/16] Update PR review automation --- .github/workflows/copilot-review-on-comment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/copilot-review-on-comment.yml b/.github/workflows/copilot-review-on-comment.yml index cae4dee22..e1a3accde 100644 --- a/.github/workflows/copilot-review-on-comment.yml +++ b/.github/workflows/copilot-review-on-comment.yml @@ -8,6 +8,6 @@ on: jobs: review: - uses: wpeverest/.github/.github/workflows/copilot-review-on-comment.yml@master + uses: themegrill/.github/.github/workflows/copilot-review-on-comment.yml@master secrets: BOT_TOKEN: ${{ secrets.BOT_TOKEN }} From 200128f914985f9a1b152a4b19cb149ef30bec3b Mon Sep 17 00:00:00 2001 From: Prajjwal Poudel Date: Mon, 7 Sep 2026 10:17:53 +0545 Subject: [PATCH 12/16] Installation process --- package-lock.json | 4 +-- vendor/autoload.php | 5 +-- vendor/composer/InstalledVersions.php | 45 ++++++++++++++++++++++++--- vendor/composer/autoload_real.php | 2 ++ vendor/composer/autoload_static.php | 16 +++++----- vendor/composer/installed.php | 4 +-- vendor/composer/platform_check.php | 25 +++++++++++++++ 7 files changed, 81 insertions(+), 20 deletions(-) create mode 100644 vendor/composer/platform_check.php diff --git a/package-lock.json b/package-lock.json index 0d5a25a06..659265748 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "everest-forms", - "version": "3.5.2", + "version": "3.6.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "everest-forms", - "version": "3.5.2", + "version": "3.6.0", "license": "GPL-3.0+", "dependencies": { "@ajna/pagination": "1.4.19", diff --git a/vendor/autoload.php b/vendor/autoload.php index 7df44c9ff..0ea3b06b6 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -14,10 +14,7 @@ echo $err; } } - trigger_error( - $err, - E_USER_ERROR - ); + throw new RuntimeException($err); } require_once __DIR__ . '/composer/autoload_real.php'; diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php index 51e734a77..2052022fd 100644 --- a/vendor/composer/InstalledVersions.php +++ b/vendor/composer/InstalledVersions.php @@ -26,12 +26,23 @@ */ class InstalledVersions { + /** + * @var string|null if set (by reflection by Composer), this should be set to the path where this class is being copied to + * @internal + */ + private static $selfDir = null; + /** * @var mixed[]|null * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null */ private static $installed; + /** + * @var bool + */ + private static $installedIsLocalDir; + /** * @var bool|null */ @@ -309,6 +320,24 @@ public static function reload($data) { self::$installed = $data; self::$installedByVendor = array(); + + // when using reload, we disable the duplicate protection to ensure that self::$installed data is + // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not, + // so we have to assume it does not, and that may result in duplicate data being returned when listing + // all installed packages for example + self::$installedIsLocalDir = false; + } + + /** + * @return string + */ + private static function getSelfDir() + { + if (self::$selfDir === null) { + self::$selfDir = strtr(__DIR__, '\\', '/'); + } + + return self::$selfDir; } /** @@ -322,19 +351,27 @@ private static function getInstalled() } $installed = array(); + $copiedLocalDir = false; if (self::$canGetVendors) { + $selfDir = self::getSelfDir(); foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + $vendorDir = strtr($vendorDir, '\\', '/'); if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (is_file($vendorDir.'/composer/installed.php')) { /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ $required = require $vendorDir.'/composer/installed.php'; - $installed[] = self::$installedByVendor[$vendorDir] = $required; - if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { - self::$installed = $installed[count($installed) - 1]; + self::$installedByVendor[$vendorDir] = $required; + $installed[] = $required; + if (self::$installed === null && $vendorDir.'/composer' === $selfDir) { + self::$installed = $required; + self::$installedIsLocalDir = true; } } + if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) { + $copiedLocalDir = true; + } } } @@ -350,7 +387,7 @@ private static function getInstalled() } } - if (self::$installed !== array()) { + if (self::$installed !== array() && !$copiedLocalDir) { $installed[] = self::$installed; } diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index 214e0a156..90d7a7f98 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -22,6 +22,8 @@ public static function getLoader() return self::$loader; } + require __DIR__ . '/platform_check.php'; + spl_autoload_register(array('ComposerAutoloaderInit9a2cf263d30e5ab5059048903ceb21ec', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); spl_autoload_unregister(array('ComposerAutoloaderInit9a2cf263d30e5ab5059048903ceb21ec', 'loadClassLoader')); diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 6730a53da..6b4059082 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -11,40 +11,40 @@ class ComposerStaticInit9a2cf263d30e5ab5059048903ceb21ec ); public static $prefixLengthsPsr4 = array ( - 'S' => + 'S' => array ( 'ScssPhp\\ScssPhp\\' => 16, ), - 'E' => + 'E' => array ( 'EverestForms\\Traits\\' => 20, 'EverestForms\\Helpers\\' => 21, 'EverestForms\\Addons\\' => 20, ), - 'C' => + 'C' => array ( 'Composer\\Installers\\' => 20, ), ); public static $prefixDirsPsr4 = array ( - 'ScssPhp\\ScssPhp\\' => + 'ScssPhp\\ScssPhp\\' => array ( 0 => __DIR__ . '/..' . '/scssphp/scssphp/src', ), - 'EverestForms\\Traits\\' => + 'EverestForms\\Traits\\' => array ( 0 => __DIR__ . '/../..' . '/traits', ), - 'EverestForms\\Helpers\\' => + 'EverestForms\\Helpers\\' => array ( 0 => __DIR__ . '/../..' . '/includes/Helpers', ), - 'EverestForms\\Addons\\' => + 'EverestForms\\Addons\\' => array ( 0 => __DIR__ . '/../..' . '/addons', ), - 'Composer\\Installers\\' => + 'Composer\\Installers\\' => array ( 0 => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers', ), diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index 2d63d677e..3d6c920d5 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'wpeverest/everest-forms', 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => 'f54386f3bb3783e251b8bc50bf045af03b9d0811', + 'reference' => 'b79b32c946602bce7087677569bea12a256fbabc', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -40,7 +40,7 @@ 'wpeverest/everest-forms' => array( 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => 'f54386f3bb3783e251b8bc50bf045af03b9d0811', + 'reference' => 'b79b32c946602bce7087677569bea12a256fbabc', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), diff --git a/vendor/composer/platform_check.php b/vendor/composer/platform_check.php new file mode 100644 index 000000000..7b1b7c3af --- /dev/null +++ b/vendor/composer/platform_check.php @@ -0,0 +1,25 @@ += 70224)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 7.2.24". You are running ' . PHP_VERSION . '.'; +} + +if ($issues) { + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); + } elseif (!headers_sent()) { + echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; + } + } + throw new \RuntimeException( + 'Composer detected issues in your platform: ' . implode(' ', $issues) + ); +} From 030cc48d689d6cf533b5a1d1ade5243e3a92380a Mon Sep 17 00:00:00 2001 From: Prajjwal Poudel Date: Mon, 7 Sep 2026 14:39:03 +0545 Subject: [PATCH 13/16] Add - ClaudGrill skill setup and e2e test specs --- .distignore | 2 + .github/workflows/qa-suite.yml | 39 + .gitignore | 7 + ..._100__fields_id_name_slug_count_parent.txt | 1 + ...d_slug_link_title_content_doc_category.txt | 1 + ...d_slug_link_title_content_doc_category.txt | 1 + .themegrill-qa/docs-index.json | 527 +++++ .themegrill-qa/docs/account-management.md | 213 ++ .themegrill-qa/docs/advanced.md | 1714 +++++++++++++++ .themegrill-qa/docs/anti-spam-and-security.md | 365 ++++ .themegrill-qa/docs/crms.md | 587 +++++ .themegrill-qa/docs/design.md | 212 ++ .themegrill-qa/docs/developers-doc.md | 434 ++++ .themegrill-qa/docs/everest-forms-pro.md | 542 +++++ .themegrill-qa/docs/faq.md | 909 ++++++++ .../form-customization-and-user-experience.md | 649 ++++++ .themegrill-qa/docs/form-fields.md | 633 ++++++ .../docs/getting-started-with-form.md | 521 +++++ .themegrill-qa/docs/getting-started.md | 118 + .themegrill-qa/docs/global-settings.md | 264 +++ .../docs/individual-form-settings.md | 538 +++++ .themegrill-qa/docs/integrations.md | 329 +++ .themegrill-qa/docs/marketing.md | 1273 +++++++++++ .themegrill-qa/docs/new-payment-gateways.md | 1237 +++++++++++ .../docs/page-builder-compatibility.md | 136 ++ .themegrill-qa/docs/payment-gateways.md | 779 +++++++ .themegrill-qa/docs/tools.md | 61 + .themegrill-qa/docs/translation.md | 44 + .themegrill-qa/docs/troubleshooting.md | 338 +++ .themegrill-qa/docs/tutorials.md | 1936 +++++++++++++++++ .themegrill-qa/docs/uncategorised.md | 85 + .themegrill-qa/knowledge.md | 276 +++ .themegrill-qa/suite.json | 96 + package-lock.json | 90 + package.json | 5 +- tests/e2e/.gitignore | 2 + tests/e2e/README.md | 148 ++ tests/e2e/auth.setup.ts | 89 + tests/e2e/env.ts | 102 + tests/e2e/fixtures/form.ts | 89 + tests/e2e/fixtures/published-form.ts | 82 + tests/e2e/playwright.config.ts | 77 + .../admin-screens-render-clean.spec.ts | 94 + tests/e2e/specs/admin/menus-and-pages.spec.ts | 93 + .../specs/builder/field-option-groups.spec.ts | 88 + .../specs/builder/pro-gated-controls.spec.ts | 94 + .../forms/create-form-from-template.spec.ts | 166 ++ .../captcha-language-persists.spec.ts | 103 + .../validation-message-persists.spec.ts | 77 + .../color-preset-reaches-front-end.spec.ts | 158 ++ .../style-customizer-v2.spec.ts | 123 ++ .../specs/submission/entry-end-to-end.spec.ts | 136 ++ tests/e2e/tsconfig.json | 15 + 53 files changed, 16697 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/qa-suite.yml create mode 100644 .themegrill-qa/.docs-cache/_wp-json_wp_v2_doc_category_per_page_100__fields_id_name_slug_count_parent.txt create mode 100644 .themegrill-qa/.docs-cache/_wp-json_wp_v2_docs_per_page_100_page_1__fields_id_slug_link_title_content_doc_category.txt create mode 100644 .themegrill-qa/.docs-cache/_wp-json_wp_v2_docs_per_page_100_page_2__fields_id_slug_link_title_content_doc_category.txt create mode 100644 .themegrill-qa/docs-index.json create mode 100644 .themegrill-qa/docs/account-management.md create mode 100644 .themegrill-qa/docs/advanced.md create mode 100644 .themegrill-qa/docs/anti-spam-and-security.md create mode 100644 .themegrill-qa/docs/crms.md create mode 100644 .themegrill-qa/docs/design.md create mode 100644 .themegrill-qa/docs/developers-doc.md create mode 100644 .themegrill-qa/docs/everest-forms-pro.md create mode 100644 .themegrill-qa/docs/faq.md create mode 100644 .themegrill-qa/docs/form-customization-and-user-experience.md create mode 100644 .themegrill-qa/docs/form-fields.md create mode 100644 .themegrill-qa/docs/getting-started-with-form.md create mode 100644 .themegrill-qa/docs/getting-started.md create mode 100644 .themegrill-qa/docs/global-settings.md create mode 100644 .themegrill-qa/docs/individual-form-settings.md create mode 100644 .themegrill-qa/docs/integrations.md create mode 100644 .themegrill-qa/docs/marketing.md create mode 100644 .themegrill-qa/docs/new-payment-gateways.md create mode 100644 .themegrill-qa/docs/page-builder-compatibility.md create mode 100644 .themegrill-qa/docs/payment-gateways.md create mode 100644 .themegrill-qa/docs/tools.md create mode 100644 .themegrill-qa/docs/translation.md create mode 100644 .themegrill-qa/docs/troubleshooting.md create mode 100644 .themegrill-qa/docs/tutorials.md create mode 100644 .themegrill-qa/docs/uncategorised.md create mode 100644 .themegrill-qa/knowledge.md create mode 100644 .themegrill-qa/suite.json create mode 100644 tests/e2e/.gitignore create mode 100644 tests/e2e/README.md create mode 100644 tests/e2e/auth.setup.ts create mode 100644 tests/e2e/env.ts create mode 100644 tests/e2e/fixtures/form.ts create mode 100644 tests/e2e/fixtures/published-form.ts create mode 100644 tests/e2e/playwright.config.ts create mode 100644 tests/e2e/specs/activation/admin-screens-render-clean.spec.ts create mode 100644 tests/e2e/specs/admin/menus-and-pages.spec.ts create mode 100644 tests/e2e/specs/builder/field-option-groups.spec.ts create mode 100644 tests/e2e/specs/builder/pro-gated-controls.spec.ts create mode 100644 tests/e2e/specs/forms/create-form-from-template.spec.ts create mode 100644 tests/e2e/specs/settings/captcha-language-persists.spec.ts create mode 100644 tests/e2e/specs/settings/validation-message-persists.spec.ts create mode 100644 tests/e2e/specs/style-customizer/color-preset-reaches-front-end.spec.ts create mode 100644 tests/e2e/specs/style-customizer/style-customizer-v2.spec.ts create mode 100644 tests/e2e/specs/submission/entry-end-to-end.spec.ts create mode 100644 tests/e2e/tsconfig.json diff --git a/.distignore b/.distignore index 654ec1e06..6dff08655 100644 --- a/.distignore +++ b/.distignore @@ -9,6 +9,8 @@ Gruntfile.js webpack.config.js tests/ node_modules/ +playwright-report/ +test-results/ none package-lock.json package.json diff --git a/.github/workflows/qa-suite.yml b/.github/workflows/qa-suite.yml new file mode 100644 index 000000000..4efd78cd8 --- /dev/null +++ b/.github/workflows/qa-suite.yml @@ -0,0 +1,39 @@ +# Written by `/claudegrill:setup`. Safe to edit — it is a plain caller. +# +# THIS IS THE ONLY PR CHECK MOST PRODUCTS NEED. No ANTHROPIC_API_KEY, no agent, +# runner minutes only. +# +# It works without AI because the developer already wrote the spec: they ran +# /claudegrill:verify-fix locally, write-spec added a @fresh spec to their +# branch, and they committed it with the fix. By the time CI sees the PR the +# regression is already a deterministic assertion. +# +# ONE job, on pull requests only. Nothing runs on a schedule: the team's model is +# a local /claudegrill:verify-fix while the fix is being written, and the e2e +# suite on the PR. No cron, no nightly, no WordPress-core watcher. +# +# `scope: changed` narrows a run to the areas the diff maps to. That is safe by +# construction — a changed file matching no `area_paths` pattern in +# .themegrill-qa/suite.json falls back to the full tier, so an unmapped change +# costs runner time, never coverage. +# +# Worth knowing, since nothing else runs the suite now: a spec whose area is +# never touched by any PR will not execute. Set `scope: full` below if you would +# rather every PR run the whole @fresh tier. + +name: QA suite + +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + workflow_dispatch: + +jobs: + # The only check. Scoped, fast, runs on every PR including drafts. + pr: + uses: ThemeGrill/claudegrill/.github/workflows/suite.yml@main + with: + product_slug: everest-forms + product_type: plugin + scope: changed + diff --git a/.gitignore b/.gitignore index 6c0fc0cfd..00ac87e10 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,10 @@ phpunit-watcher.yml /release/ /.idea/ + +# claudegrill local credentials +.themegrill-qa/.env.local + +# playwright run artefacts +playwright-report/ +test-results/ diff --git a/.themegrill-qa/.docs-cache/_wp-json_wp_v2_doc_category_per_page_100__fields_id_name_slug_count_parent.txt b/.themegrill-qa/.docs-cache/_wp-json_wp_v2_doc_category_per_page_100__fields_id_name_slug_count_parent.txt new file mode 100644 index 000000000..cc9830263 --- /dev/null +++ b/.themegrill-qa/.docs-cache/_wp-json_wp_v2_doc_category_per_page_100__fields_id_name_slug_count_parent.txt @@ -0,0 +1 @@ +[{"id":2,"count":7,"name":"Account Management","slug":"account-management","parent":0},{"id":48,"count":14,"name":"Advanced","slug":"advanced","parent":0},{"id":47,"count":4,"name":"Anti-Spam and Security","slug":"anti-spam-and-security","parent":0},{"id":35,"count":0,"name":"Basic Debugging Steps","slug":"basic-debugging-steps","parent":0},{"id":44,"count":6,"name":"CRMs","slug":"crms","parent":0},{"id":43,"count":2,"name":"Design","slug":"design","parent":0},{"id":26,"count":4,"name":"Developer's Doc","slug":"developers-doc","parent":0},{"id":3,"count":0,"name":"Everest Forms Add-ons","slug":"everest-forms-add-ons","parent":0},{"id":4,"count":10,"name":"Everest Forms Pro","slug":"everest-forms-pro","parent":0},{"id":56,"count":6,"name":"Form Customization and User Experience","slug":"form-customization-and-user-experience","parent":0},{"id":5,"count":19,"name":"Form Fields","slug":"form-fields","parent":0},{"id":17,"count":13,"name":"Frequently Asked Questions","slug":"faq","parent":0},{"id":6,"count":6,"name":"Getting Started with Form","slug":"getting-started-with-form","parent":0},{"id":7,"count":4,"name":"Getting Started with Plugin","slug":"getting-started","parent":0},{"id":8,"count":4,"name":"Global Settings","slug":"global-settings","parent":0},{"id":9,"count":43,"name":"How To?","slug":"tutorials","parent":0},{"id":10,"count":6,"name":"Individual Form Settings","slug":"individual-form-settings","parent":0},{"id":57,"count":5,"name":"Integrations","slug":"integrations","parent":0},{"id":51,"count":17,"name":"Marketing","slug":"marketing","parent":0},{"id":61,"count":7,"name":"New Payment Gateways","slug":"new-payment-gateways","parent":0},{"id":42,"count":5,"name":"Page Builder Compatibility","slug":"page-builder-compatibility","parent":0},{"id":45,"count":6,"name":"Payment Gateways ( Old )","slug":"payment-gateways","parent":0},{"id":59,"count":3,"name":"Tools","slug":"tools","parent":0},{"id":11,"count":2,"name":"Translation","slug":"translation","parent":0},{"id":12,"count":6,"name":"Troubleshooting","slug":"troubleshooting","parent":0}] \ No newline at end of file diff --git a/.themegrill-qa/.docs-cache/_wp-json_wp_v2_docs_per_page_100_page_1__fields_id_slug_link_title_content_doc_category.txt b/.themegrill-qa/.docs-cache/_wp-json_wp_v2_docs_per_page_100_page_1__fields_id_slug_link_title_content_doc_category.txt new file mode 100644 index 000000000..12fb74cd5 --- /dev/null +++ b/.themegrill-qa/.docs-cache/_wp-json_wp_v2_docs_per_page_100_page_1__fields_id_slug_link_title_content_doc_category.txt @@ -0,0 +1 @@ +[{"id":5955,"slug":"style-customizer","link":"https:\/\/docs.everestforms.net\/docs\/style-customizer\/","title":{"rendered":"Style Customizer"},"content":{"rendered":"

The Style Customizer lets you change how your form looks \u2014 colors, fonts, spacing, borders, and button style \u2014 without writing any CSS. It’s built directly into the form builder’s Style<\/strong> tab, with a live preview that updates as you make changes.<\/p>\n

This article covers the current Style Customizer. If you styled a form before this update, don’t worry \u2014 your existing look carries over automatically the first time you open the Style tab. See Migrating an Older Form<\/strong> below.<\/p>\n

Where to Find It<\/h2>\n
    \n
  1. Go to Everest Forms \u2192 All Forms<\/strong> and edit the form you want to style.<\/li>\n
  2. Click the Style<\/strong> tab at the top of the builder.<\/li>\n<\/ol>\n
    \"Everest<\/figure>\n
    \"Everest<\/figure>\n

    The Style Tab Layout<\/h2>\n

    The Style tab is split into two panes:<\/p>\n