Skip to content

Replace @wordpress/env with custom wp-alpine Docker containers - #910

Open
lgersman wants to merge 117 commits into
developfrom
feat/replace-wpenv
Open

Replace @wordpress/env with custom wp-alpine Docker containers#910
lgersman wants to merge 117 commits into
developfrom
feat/replace-wpenv

Conversation

@lgersman

@lgersman lgersman commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Breaking change

This branch assumes an up to date version of pnpm version >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/env with a custom Alpine-based Docker image/toolchain (packages/docker/wp-alpine), per docs/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:

  • Phase 1: wp-alpine base image + registry publish workflow
  • Phase 2: pnpm start/stop/destroy drive wp-alpine instead of wp-env
  • Phase 3: pnpm test:php against an ephemeral wp-alpine container
  • Phase 4: pnpm test:e2e against the same ephemeral container
  • Phase 5: TEST_PRODUCTION=true dist-mount parity + PHP_VERSION_OVERRIDE=7.4 for legacy-PHP testing
  • Phase 6 (this push): CI pulls the prebuilt wp-alpine image instead of building it locally; new test-php74 CI job

Test plan

  • build job (PHP 8.4 / TEST_PRODUCTION path) is green
  • test-php74 job (PHP_VERSION_OVERRIDE=7.4 path) is green
  • lint job unaffected/still green
  • devcontainer and Phase 1 build-wp-alpine-image publish workflows succeed

🤖 Generated with Claude Code

lgersman added 18 commits July 31, 2026 16:11
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.
@lgersman
lgersman marked this pull request as ready for review August 5, 2026 12:59
Copilot AI lite review requested due to automatic review settings August 5, 2026 12:59

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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/test scripts to manage wp-alpine containers directly (persistent dev + throwaway test stack) and added pnpm logs/enter/cli helpers.
  • 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.

Comment thread .claude/settings.json Outdated
Comment thread .github/workflows/integration.yaml Outdated
Comment thread phpunit/phpunit.xml Outdated
Comment thread docs/agent/wp-env-to-alpine-migration-plan.md Outdated
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.
@tobibode

Copy link
Copy Markdown
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
still the claude review has some good points worth going through and take action for some of them

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants