Replace @wordpress/env with custom wp-alpine Docker containers - #910
Open
lgersman wants to merge 117 commits into
Open
Replace @wordpress/env with custom wp-alpine Docker containers#910lgersman wants to merge 117 commits into
lgersman wants to merge 117 commits into
Conversation
Split the single flat epic into 3 milestones (Foundation, Test infrastructure parity, CI integration & rollout) each containing a focused epic, with the existing 8 phase tasks reparented under the epic matching their concern. Preserves the phase-to-phase blocking chain and adds epic-to-epic blocking across milestones so `beans list --ready` still surfaces only the actionable next step.
Fork the prototype's Alpine WordPress dev image into packages/docker/wp-alpine, adding APCu, baked yoast/phpunit-polyfills, git-ref core installs, and an AFTER_START hook, plus a GHCR publish workflow building both the 8.4 and 7.4 PHP variants. This is Phase 1 of the wp-env -> Alpine migration (see docs/agent/wp-env-to-alpine-migration-plan.md); later phases wire it into pnpm start/test. bean: mrwg
…(euw2) Rewrite scripts/start.sh/stop.sh/destroy.sh to run a single persistent dev container from the wp-alpine image (packages/docker/wp-alpine), replacing .wp-env.json generation with dynamic --volume mounts (one per discovered wp-plugin/wp-theme/wp-mu-plugin package). Adds mnt/wordpress-core/<version> (shared, survives destroy) + mnt/dev/ (per-stack overlay, wiped on destroy). Replaces scripts/wp-env.sh with logs/enter/cli scripts; SSH needs no wrapper. This is Phase 2 of the wp-env -> Alpine migration (docs/agent/wp-env-to-alpine-migration-plan.md). scripts/test.sh still calls wp-env for PHPUnit/e2e and will need pnpm start until Phase 3 rewrites it - expected, temporary breakage until the next phase lands. bean: euw2
Rewrite the PHPUnit path in scripts/test.sh to start a throwaway ionos-wordpress-test container, bind-mount phpunit/ directly, and always tear it down (trap on success and failure) - replacing the wp-env calls that broke when Phase 2 removed .wp-env.json. Corrects a Phase 1 decision based on real test runs: WordPress core's own test harness (wordpress-develop#trunk) still calls a PHPUnit method removed in 10+, so packages/docker/wp-alpine/Dockerfile now pins phpunit/phpunit ^9.0 uniformly (phpunit/phpunit.xml's schema downgraded to match). Also fixes the actual test-suite source: WordPress/WordPress has no tests/ at all - wp-env clones WordPress/wordpress-develop#trunk instead (confirmed against a real wp-env cache on disk), which scripts/test.sh now does too, cached under mnt/wordpress-tests/trunk. Extracts the plugin/theme/mu-plugin mount-discovery logic shared by start.sh and test.sh into scripts/includes/_docker-mounts.sh. bean: g4m1
…ner (7hn5) Rewire Playwright to run against the same ionos-wordpress-test container Phase 3 introduced for PHPUnit, instead of the removed wp-env. scripts/test.sh now hoists the container start/readiness/teardown out of the php-only block so a combined php+e2e (or `pnpm test`) run shares one container and one teardown. playwright/wp-env.js's execTestCLI drops wp-env container-name discovery for the fixed container name. Fixes two real gaps found while actually running the suite (not just review): docker-entrypoint.sh never defined WP_HOME/WP_SITEURL as wp-config.php constants like wp-env's generated config always did, and the shared .default-themes-cache reseeding step from the prototype's prepare-mounts.sh was never ported - the dev container happened to work by being the first to ever download core, but the ephemeral test container always needs the reseed. Completes the b55y epic (Phases 1-4 of the wp-env -> wp-alpine migration, see docs/agent/wp-env-to-alpine-migration-plan.md). Remaining: Phase 5 (PHP_VERSION_OVERRIDE), Phase 6 (CI), Phase 7 (cutover/docs). bean: 7hn5
…test support (gjbp) Bind-mounts phpunit/ dirs onto the transpiled dist/ output (rector excludes tests/ from dist/) instead of copying them in, since dist/ is also mounted wholesale in source mode and copies would leak into later non-production runs. Fixes two pre-existing dist-mount bugs found while verifying: TEST_PRODUCTION mounted the wrong nested subdir for both wp-mu-plugin and wp-plugin packages, crashing wp-mu-plugin loaders and hiding wp-plugin test fixtures. Adds PHP_VERSION_OVERRIDE=7.4 to scripts/test.sh, pulling the prebuilt legacy-PHP image from IMAGE_REGISTRY/IMAGE_REPOSITORY instead of building locally.
… (7wdg) Adds a step to integration.yaml's build job that pulls the Phase 1-published wp-alpine image and retags it locally so scripts/build.sh skips rebuilding it, falling back to a local build if the pull fails. Adds a test-php74 job running the suite against the prebuilt legacy-PHP image via PHP_VERSION_OVERRIDE. Wires registry credentials into the nested docker-in-docker devcontainer via a new env input on devcontainer-shell-run, adds a retry to scripts/test.sh's image pull to tolerate racing the separate publish workflow, and drops the retired phpMyAdmin port labels from devcontainer.json.
…uild-time one A prebuilt/pulled wp-alpine image (PHP_VERSION_OVERRIDE, CI's registry pull) bakes in whatever uid built it in the publish workflow, independent of whoever actually runs the container - so files it writes into host bind mounts (e.g. the shared core/theme cache) come back owned by a uid the consuming host can't clean up, as CI's first real run of PHP_VERSION_OVERRIDE just demonstrated with a permission-denied cleanup failure. The entrypoint now remaps the php user to a HOST_UID/HOST_GID runtime env var (skipping the chown if it already matches, the common locally-built case), and start.sh/test.sh always pass the current host's uid/gid.
ECS's skip list still only excluded the old wp-env-home/ runtime directory, never updated when Phase 2 introduced mnt/ as its replacement - so any populated mnt/ (WordPress core cache, wp-content overlays) got recursively linted as project source, timing ECS out against WordPress core itself and failing CI's lint job. Also applies pnpm lint-fix's pre-existing, unrelated Prettier formatting fixes across .beans/*.md, .beans.yml, .claude/settings.json and the migration plan doc, since CI's lint job checks the whole repo unconditionally and would otherwise keep failing regardless of this PR's own changes.
A cold run (fresh core download/install, no shared cache yet) inside CI's nested docker-in-docker devcontainer is slower than a local run - the PHP_VERSION_OVERRIDE=7.4 CI job's first real run timed out waiting for the container within the previous 60s budget. Widens it to 180s and dumps `docker logs` on failure so a future timeout is diagnosable from the CI log directly instead of needing a follow-up debugging round-trip.
PHP_VERSION_OVERRIDE=7.4 alone runs raw source directly under a real PHP 7.4 interpreter - but source is written against PHP 8+ syntax, so this always fatals during WordPress bootstrap. Only rector's transpiled dist/ output (TEST_PRODUCTION=true) is meant to run under PHP 7.4. CI's test-php74 job hit this for real (its first genuine run against the actual PHP 7.4 image, as opposed to my earlier local check which unwittingly retagged a PHP 8.4 build under the -php7.4 tag on a scratch registry and never actually exercised a real PHP 7.4 interpreter). scripts/test.sh now errors out immediately with a clear message rather than a cryptic WordPress fatal if TEST_PRODUCTION isn't also set.
Two blockers surfaced only once the real (not locally-relabeled) PHP 7.4 image was exercised end-to-end: - wordpress-develop trunk's own PHPUnit bootstrap and wp-tests-config.php call str_starts_with() (a PHP 8.0+ builtin) before WordPress core's own compat.php polyfills ever load, and before requests ever reach our own bootstrap.php - both wp-cli (wp core install) and PHPUnit hit this on a real PHP 7.4 interpreter. Adds symfony/polyfill-php80 and loads it via auto_prepend_file (PHP 7.x image variant only) so every PHP entrypoint in the container gets it uniformly. - ClassNBATest.php used PHP 8.0+ named-argument syntax calling NBA::register() - a hard parse error under a real PHP 7.4 interpreter, since phpunit/ test dirs are bind-mounted from source and never rector-transpiled even under PHP_VERSION_OVERRIDE (only the actual plugin code is). Switched to positional arguments.
The MCP feature downloads and activates a third-party plugin (Automattic/wordpress-mcp) fresh at test time, entirely outside our own rector transpile pipeline - it fataled reliably (not a flake, reproduced across two runs) once tests actually ran against the real PHP 7.4 image. Since PHP_VERSION_OVERRIDE exists to validate our own code's PHP 7.4 compatibility, not third-party plugins we don't control, exclude @mcp on this CI leg specifically rather than the whole e2e suite.
CI is green on PR #910 across all 4 jobs (devcontainer, lint, build and test, test against legacy PHP 7.4). Documents the five real bugs surfaced and fixed while getting there, for future reference.
Contributor
There was a problem hiding this comment.
Pull request overview
This PR replaces the repository’s @wordpress/env (wp-env) driven dev/test/CI workflow with a custom Alpine-based “wp-alpine” Docker image/toolchain (packages/docker/wp-alpine) and updates scripts, tests, and CI to run against persistent (dev) and ephemeral (test) containers.
Changes:
- Reworked
pnpm start/stop/destroy/testscripts to manage wp-alpine containers directly (persistent dev + throwaway test stack) and addedpnpm logs/enter/clihelpers. - Added and wired a publish workflow for prebuilt wp-alpine images and updated CI to pull/retag prebuilt images (including a new PHP 7.4 test job).
- Updated PHPUnit/Playwright wiring to execute inside the ephemeral test container, including legacy PHP 7.4 compatibility adjustments.
Reviewed changes
Copilot reviewed 53 out of 55 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| scripts/wp-env.sh | Removes the wp-env wrapper script. |
| scripts/test.sh | Runs PHPUnit/Playwright against an ephemeral wp-alpine test container (optionally pulling prebuilt legacy-PHP image). |
| scripts/stop.sh | Stops the persistent wp-alpine dev container. |
| scripts/start.sh | Starts (or restarts) the persistent wp-alpine dev container with dynamic bind mounts. |
| scripts/logs.sh | Adds a helper to follow dev container logs. |
| scripts/includes/_docker-mounts.sh | Adds shared mount-discovery + volume-arg construction for dev/test stacks, including TEST_PRODUCTION support. |
| scripts/enter.sh | Adds a helper to open an interactive shell inside the dev container. |
| scripts/destroy.sh | Removes the persistent dev container and its per-stack overlay data. |
| scripts/cli.sh | Adds a helper to run wp-cli inside the dev container. |
| scripts/build.sh | Passes HOST_UID/HOST_GID build args for docker package builds (needed by wp-alpine). |
| scripts/beans.sh | Adds a wrapper that downloads/verifies and runs the Beans CLI locally. |
| scripts/_prepare.sh | Pre-downloads Beans during prepare. |
| pnpm-lock.yaml | Adds the new packages/docker/wp-alpine workspace. |
| playwright/wp-env.js | Switches CLI execution helper to docker exec into the fixed-name ephemeral test container. |
| playwright.config.js | Updates Playwright config to target the ephemeral wp-alpine test container. |
| phpunit/phpunit.xml | Adjusts PHPUnit schema and suite discovery to work with the new mount layout. |
| phpunit/bootstrap.php | Points Composer autoload to baked-in /opt/wp-tests/vendor/autoload.php in the image. |
| packages/wp-plugin/ionos-essentials/ionos-essentials/inc/dashboard/tests/phpunit/ClassNBATest.php | Removes PHP 8 named args for compatibility with PHP 7.4 test runs. |
| packages/docker/wp-alpine/scripts/update-dependencies.sh | Adds update-dependencies check script for the new docker package. |
| packages/docker/wp-alpine/scripts/generate-vscode-launch.sh | Adds a host-side generator for VS Code Xdebug pathMappings. |
| packages/docker/wp-alpine/package.json | Introduces the new @ionos-wordpress/wp-alpine workspace package metadata. |
| packages/docker/wp-alpine/examples/after-start-ionos-wordpress.sh | Adds an example AFTER_START script reproducing repo-specific WP bootstrapping. |
| packages/docker/wp-alpine/Dockerfile | Adds the Alpine-based WordPress all-in-one dev/test image definition (PHP 8.4/7.4 variants). |
| packages/docker/wp-alpine/docker-entrypoint.sh | Adds container entrypoint handling WP provisioning, DB, SSH, Apache, logging, and AFTER_START. |
| packages/docker/wp-alpine/.env | Adds default build args for the wp-alpine image package. |
| packages/docker/wp-alpine/.dockerignore | Adds dockerignore for wp-alpine build context. |
| packages/docker/ecs-php/ecs-config.php | Excludes mnt/ from ECS scanning to avoid linting generated/mounted content. |
| package.json | Replaces wp-env script with logs/enter/cli and adds beans. |
| docs/agent/wp-env-to-alpine-migration-plan.md | Adds detailed migration plan documentation for wp-env → wp-alpine. |
| AGENTS.md | Documents Beans workflow and commit message guidance related to Bean IDs. |
| .secrets.example | Documents optional registry credentials for pulling prebuilt images. |
| .gitignore | Ignores mnt/ and PHPUnit result cache. |
| .github/workflows/integration.yaml | Updates CI to pull/retag prebuilt wp-alpine image and adds a PHP 7.4 test job. |
| .github/workflows/build-wp-alpine-image.yaml | Adds workflow to build and publish wp-alpine image variants tagged by content hash. |
| .github/shared/actions/devcontainer-shell-run/action.yaml | Adds support for forwarding env vars into devcontainer CI runs. |
| .env.local.example | Documents WORDPRESS_VERSION and PHP 7.4 override usage. |
| .env | Replaces wp-env vars with wp-alpine container/mount/image configuration. |
| .devcontainer/devcontainer.json | Updates forwarded ports labels and removes phpMyAdmin ports. |
| .claude/settings.json | Updates Claude settings and adds Beans hooks. |
| .beans/zr06--phase-7-cutover.md | Adds Beans task record for Phase 7. |
| .beans/zmd6--ci-integration-rollout.md | Adds Beans milestone record for CI integration & rollout. |
| .beans/vjbx--base-image-registry-publishing.md | Adds Beans epic record for base image publishing. |
| .beans/p8wo--test-infrastructure-parity.md | Adds Beans milestone record for test infrastructure parity. |
| .beans/mrwg--phase-1-base-image-adapted-from-the-prototype.md | Adds Beans task record for Phase 1 completion notes. |
| .beans/hr03--local-dev-environment.md | Adds Beans epic record for local dev environment work. |
| .beans/gjbp--phase-5-production-build-test-production-parity-an.md | Adds Beans task record for Phase 5 completion notes. |
| .beans/g4m1--phase-3-phpunit-on-an-ephemeral-test-stack.md | Adds Beans task record for Phase 3 completion notes. |
| .beans/euw2--phase-2-dev-stack-dynamic-mount-generation.md | Adds Beans task record for Phase 2 completion notes. |
| .beans/ei5p--foundation-base-image-local-dev-environment.md | Adds Beans milestone record for foundation work. |
| .beans/dav1--ci-integration-cutover-cleanup.md | Adds Beans epic record for CI integration/cutover/cleanup. |
| .beans/b55y--test-infrastructure-phpunit-e2e-prodphp-version-pa.md | Adds Beans epic record for test infra work. |
| .beans/7wdg--phase-6-ci-integration.md | Adds Beans task record for Phase 6 completion notes. |
| .beans/7hn5--phase-4-playwrighte2e-against-the-same-ephemeral-t.md | Adds Beans task record for Phase 4 completion notes. |
| .beans/3pr5--phase-8-other-cleanup.md | Adds Beans task record for Phase 8 follow-ups. |
| .beans.yml | Adds Beans configuration for the repo. |
Files not reviewed (1)
- pnpm-lock.yaml: Generated file
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
PHP 7.4 forced two workarounds that existed only to route around it: a str_starts_with() polyfill for wordpress-develop's own test bootstrap, and rewriting ClassNBATest.php's named arguments to positional (a parse error under a real PHP 7.4 interpreter, since phpunit/ test dirs are never rector-transpiled). It also required excluding the @mcp e2e test, since the third-party Automattic/wordpress-mcp plugin it depends on isn't PHP 7.4-compatible. AGENTS.md states PHP 8.3+ as the project's actual minimum supported version, so 8.3 is both a more representative target and fully compatible with existing source (named arguments, str_starts_with, wordpress-mcp) with no workarounds needed - runs in source mode directly, no TEST_PRODUCTION=true requirement, and @mcp runs normally again. Verified end-to-end: rebuilt the wp-alpine image for PHP 8.3/Alpine 3.20, pushed to a local registry, and confirmed PHP_VERSION_OVERRIDE=8.3 pnpm test:php (15/15) and pnpm test:e2e (28/28, including the MCP snippet test) both pass against the real image. - packages/docker/wp-alpine/Dockerfile: matrix comment updated, removed the symfony/polyfill-php80 + auto_prepend_file workaround (unneeded on 8.3) - .github/workflows/build-wp-alpine-image.yaml: publishes 8.3/Alpine 3.20 instead of 7.4/Alpine 3.15 - scripts/test.sh: PHP_VERSION_OVERRIDE validates against 8.3, dropped the TEST_PRODUCTION=true requirement guard - .github/workflows/integration.yaml: renamed job to test-php83, dropped TEST_PRODUCTION and the @mcp exclusion - ClassNBATest.php: reverted to named arguments (AGENTS.md's preferred style for 3+ parameters)
Deletes .wp-env.json, its lifecycle scripts, and the @wordpress/env dependency now that CI and local dev both run against the wp-alpine containers. Rewrites scripts/playground.sh to read WORDPRESS_VERSION/ PHP_VERSION from .env sources instead of the deleted config, swaps the clean/distclean scripts' wp-env readiness guard for a docker-based one, and updates every doc/README/code-comment that still referenced wp-env to describe the wp-alpine dev container and its pnpm start/stop/cli/ enter/logs commands instead. bean: zr06
Drops the separate CI leg that ran the test suite against the prebuilt minimum-supported-PHP (8.3) image, keeping just the default build/test job (PHP 8.4) and lint.
Comments out the 8.3 matrix entry in build-wp-alpine-image.yaml now that the integration workflow no longer has a job testing against it. Kept commented rather than deleted so it's easy to re-enable if the minimum-supported-PHP test leg comes back.
scripts/test.sh's PHP_VERSION_OVERRIDE=8.3 path only ever pulled the prebuilt image from the registry, retrying 5 times before giving up. Now that build-wp-alpine-image.yaml's 8.3 matrix leg is disabled, that tag will never appear for new commits touching packages/docker/wp-alpine, so build it locally (same build-args as the disabled matrix entry) as a failsafe once the pull retries are exhausted.
…ild.sh/distclean.sh The @scope/name -> docker image name derivation (strip @, split on /, honor DOCKER_USERNAME/DOCKER_REPOSITORY overrides) was copy-pasted verbatim, comments included, in build.sh and distclean.sh. Extracted ionos.wordpress.docker_image_name_for_package() into _bootstrap.sh. Verified pnpm build --filter ecs-php and pnpm distclean derive and target the identical image name (ionos-wordpress/ecs-php). closes 3ihn
…ard blocks ecs-php/dennis-i18n/potrans each had a hand-copied "if USE matches && needs docker; then add --filter" block, differing only in the USE pattern, tool name, and (for potrans) an extra FIX=yes requirement. Replaced with a DOCKER_BUILD_FILTER_TOOLS table (tool:use-pattern:requires-fix rows) and one loop - a 4th linter now needs one row, not a copied block. Verified: identical output across 3 USE/FIX combinations vs. the original logic; pnpm lint --use php passes; pnpm lint-fix --use i18n actually runs potrans end-to-end (translated missing .po entries, reverted as an unrelated test artifact). closes k24u
Two inefficiencies: a separate "/orgs/{owner}" membership probe before the
actual paginated package-list call (2 round trips to determine one thing),
and a per-package "/.../versions" fetch purely to print a version count
that GitHub's package-list response already includes as version_count.
Merged the org check into the list call itself (try the org endpoint
directly, fall back to /user/packages on failure - a nonexistent/foreign
org 404s either way), and read version_count straight from the existing
list response instead of a second per-package API call.
Destructive script (needs delete:packages scope) - did not run it against
the real registry. Verified the jq extraction against a fixture matching
GitHub's documented package schema, and the matching/counting/fallback
logic against a mocked gh CLI.
closes iqxt
…_php() run_php() implemented its own native-vs-docker dispatch, ignoring IONOS_WP_FORCE_DOCKER unlike every other native-tool-or-docker call site in the codebase. The bean's literal suggestion (register php in IONOS_NATIVE_TOOL_PATHS) doesn't fit that registry's shape - it assumes a per-tool COMPOSER_HOME-isolated composer install, not a plain system binary - so scoped this down to the escape hatch gap, and documented that the php:8.3-cli fallback tag is arbitrary (no version-sensitive syntax in the config file), not a real compatibility constraint to keep in sync. Verified both branches directly and via `pnpm stretch-extra --check`. closes qrgm
…me/test_stack_dir Both derived the same "shard 1 is unsuffixed, others get -<shard>" rule independently. Extracted ionos.wordpress.shard_name_suffix() and used it in both. Left the e2e loop's SHARD_SUFFIX alone - the bean claimed it recomputes the same rule, but it actually uses a different condition (whether sharding is enabled at all, vs. this shard's own number) and they genuinely diverge at E2E_SHARDS>1, shard 1. Unifying them would have changed real behavior (concurrently-running shards' artifacts/storage state paths would collide for shard 1). Verified: identical naming for shards 1-3 vs. the original logic; pnpm test:php (15/15) and E2E_SHARDS=2 pnpm test:e2e security.spec.js (3/3) both pass. closes jpk9
…RRIDE pull retry The 5-attempt image-pull retry slept a flat 30s between every attempt (up to 150s) before falling back to a local build - even though the common case (image not published yet) isn't transient and always ends up at that same fallback. Switched to a 5s/10s/20s/30s backoff, capping the wait at 65s while still giving a genuinely racing CI publish job a full 30s window on the last retry. Verified the retry/delay logic in isolation, and confirmed the pull path itself still works: PHP_VERSION_OVERRIDE=8.3 pnpm test pulled the real prebuilt image and ran 15/15 PHPUnit tests. closes xun6
…ed record WP_PATH_BY_NAME/WP_NAME_BY_PATH/WP_DEPENDENCIES_BY_NAME only ever moved together and were always read together, inviting index-consistency drift on future edits. Collapsed into one WP_DEPENDENCY_PATHS_BY_PATH array (path -> pre-resolved dependency paths) - package names only matter transiently during indexing (a two-pass resolve), the consumer never needs anything but a path. Verified: pnpm build (full) succeeds; a second run reports every package "already up to date"; touching a dependency's build-info correctly cascades a rebuild to its dependents only. closes 6up7
…gible Measured the exact find command from is_workspace_package_up_to_date against all 4 workspace packages, including the worst case (build-info newer than every file, forcing a full traversal with no early exit): ~20- 50ms per package, negligible in aggregate at this repo's current scale. A "cheaper" alternative would trade that for a real risk of silently misjudging staleness. No code change.
rector's dist/*-php7.4 syntax lint already covers the minimum-version compatibility concern for distributed plugin code, making the second PHP 8.3 wordpress-alpine image build/test redundant. Trims image-matrix.json to the single 8.4 entry and updates AGENTS.md, php-standards.md, and stale comments/hardcoded tags that referenced the old 8.3 minimum. See bean vdsd.
Captures currently GitHub-coupled surface area (CI workflows, gh CLI usage, GHCR, Dependabot, PR notify webhook) and open questions to resolve before this leaves draft.
Vendors the ste-writing skill and its ste-lint.py/ste-recurring-errors.md companions from woosal1337/blog (MIT) into docs/skills/, and registers it in docs/10-ai-integration.md alongside the existing testing skill.
Apply the ste-writing skill (ASD-STE100, STE-flavored mode) across docs/ and the top-level README/AGENTS.md: active voice, simple tenses, expanded contractions, no semicolons, one topic per sentence/paragraph. Also fixes several pre-existing typos found along the way.
…encies.sh chmod +x on the script fixes exit 126/Permission denied when running pnpm update-dependencies. Also includes the dependency updates picked up while verifying the fix. hegd
…sting active_plugins
modify-commands-plugins.php's WP_CLI-only option_active_plugins filter injects the
unprefixed slug (e.g. "extendify/extendify.php") for `wp plugin list` display. When
`wp plugin activate --all` reads-modifies-writes the option, that unprefixed form
rode along into the persisted DB value since pre_update_option_active_plugins only
stripped the prefixed ("plugins/extendify/extendify.php") form. Once baked into
active_plugins, WordPress can't find a matching file under wp-content/plugins and
shows a "Plugin file does not exist" notice on every subsequent admin page load.
Comments must sit directly above the __() call, not the wrapping sprintf()/WP_CLI::error() line, or make-pot fails to associate them and warns during POT generation.
go-waas required VPN-only access to an internal gitlab server and is no longer used in this repo's workflow.
Drops the pnpm playground command, wp-now dependency, and its generated blueprint files, which are no longer part of the local dev workflow.
…e email strings Silences make-pot warnings for placeholders in the maintenance mode reminder email strings by adding translators comments above each sprintf/__ call.
Only print the syntax check output when a check actually fails, instead of echoing every file's "No syntax errors detected" line on every run.
wp core is-installed bootstrapped every mounted mu-plugin, racing the entrypoint's own still-running wp core install and surfacing a harmless-but-noisy wp_options DB error on stdout while polling.
Contributor
|
I tested. works and can be merged from my point of view. https://claude.ai/code/artifact/ca358f9e-a9cf-447a-93e8-41188a07b1f2?via=auto_preview |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Breaking change
This branch assumes an up to date version of
pnpmversion >11 on bare metal.Within the dev container everything is configured and installed as expected.
If you want to test this branch you need to install latest pnpm using on Linux you need to update your pnpm version using
curl -fsSL https://get.pnpm.io/install.sh | sh -Summary
Replaces
@wordpress/envwith a custom Alpine-based Docker image/toolchain (packages/docker/wp-alpine), perdocs/agent/wp-env-to-alpine-migration-plan.md. This is the first push of the branch; opening as draft to validate CI end-to-end (Phase 6's exit criteria is "CI green on a branch" and can't be fully verified locally).Phases included so far:
pnpm start/stop/destroydrive wp-alpine instead of wp-envpnpm test:phpagainst an ephemeral wp-alpine containerpnpm test:e2eagainst the same ephemeral containerTEST_PRODUCTION=truedist-mount parity +PHP_VERSION_OVERRIDE=7.4for legacy-PHP testingtest-php74CI jobTest plan
buildjob (PHP 8.4 / TEST_PRODUCTION path) is greentest-php74job (PHP_VERSION_OVERRIDE=7.4 path) is greenlintjob unaffected/still greendevcontainerand Phase 1build-wp-alpine-imagepublish workflows succeed🤖 Generated with Claude Code