Repository navigation
Releases: drevops/eddy
Release list
5.0.0-alpha4
What's new since 5.0.0-alpha3
- [#600] Stopped 'eddy-start' and 'eddy-stop' from killing another project's webserver, and capped the 'eddy-start' wait at its timeout. @AlexSkrypnyk (#603)
- [#601] Removed the WebDriver export, port line, CSpell words and blank lines that deselected tools left behind. @AlexSkrypnyk (#602)
- [#594] Kept the Mink packages Functional tests need when FunctionalJavascript is deselected and removed its leftovers. @AlexSkrypnyk (#599)
- [#596] Scoped 'reset' and 'kill_port()' to the project's webserver and polled the port in 'eddy-start' instead of sleeping. @AlexSkrypnyk (#598)
- [#593] Kept local builds on a stable Drupal major, added a PHP check to 'eddy-assemble' and fixed the other upgrade gaps. @AlexSkrypnyk (#597)
Full Changelog: 5.0.0-alpha3...5.0.0-alpha4
5.0.0-alpha3
What's new since 5.0.0-alpha2
- [#590] [#591] Covered adding a Drupal major in 'update-consumer-eddy' and corrected the 'MIGRATION.md' notes on Drupal 12 and deployment. @AlexSkrypnyk (#592)
Full Changelog: 5.0.0-alpha2...5.0.0-alpha3
5.0.0-alpha2
What's new since 5.0.0-alpha1
- [#581] Rendered the Drupal version and command wrapper text in generated projects from the installer answers. @AlexSkrypnyk (#589)
- [#580] Scoped 'install.php' to the template when it runs inside an existing project. @AlexSkrypnyk (#588)
- [#584] Kept project files, local state and newer pins in the 'update-consumer-eddy' skill by merging each release 3 ways. @AlexSkrypnyk (#587)
- [#583] Removed the CircleCI branch from the JS test base, serialised branch deploys in 'deploy.yml' and corrected 'MIGRATION.md'. @AlexSkrypnyk (#586)
- [#582] Timed out the version probes in 'eddy-browser-start' and finished the 'eddy-provision' status lines. @AlexSkrypnyk (#585)
Full Changelog: 5.0.0-alpha1...5.0.0-alpha2
5.0.0-alpha1
What's new since 4.19.0
Highlights
5.0 is the first release under the Eddy name, and most of it is about where things live: the template has a new home, the build tooling became a Composer package, and GitHub Actions is the only CI left. Drupal 12 joins the CI matrix, and deployments no longer rewind branches. A project created from 4.x needs a one-off upgrade, which MIGRATION.md walks through.
The Drupal Extension Scaffold is now Eddy
The template moved from AlexSkrypnyk/drupal_extension_scaffold to drevops/eddy, next to Vortex, and the README now spells out how the 2 differ: Eddy maintains a contributed Drupal module or theme on GitHub, Vortex builds websites, and a repository uses one or the other.
| 4.x | 5.x | |
|---|---|---|
| Repository | AlexSkrypnyk/drupal_extension_scaffold |
drevops/eddy |
| Default branch | 1.x |
main |
| Template maintenance files | .scaffold/ |
.eddy/ |
| Update skill | update-consumer-drupal-extension-scaffold |
update-consumer-eddy |
| Installer | php init.php, answers from DEX_* |
php install.php, answers from INSTALL_* |
The branch rename only applies to the Eddy repository itself. New projects still build and deploy from 1.x, and when the installer runs during an update, it keeps whatever branches the project's committed test.yml lists.
The build tooling is a Composer package
In 4.x, every project carried its own copy of the build, run and deploy scripts in .devtools/, so a fix reached a project only when its maintainer merged the next release by hand. In 5.x, those scripts ship as the drevops/eddy-tooling package, and every project installs the same one:
4.x: each project carries its own copy 5.x: each project installs the same package
ahoy assemble, make assemble or CI ahoy assemble, make assemble or CI
│ │
▼ ▼
.devtools/assemble scripts/eddy-tooling
your copy, fixed only when you merge installs drevops/eddy-tooling ~1.0.0
the next release by hand into vendor/, and skips Composer
while nothing has changed
│
▼
vendor/bin/eddy-assemble
fixes arrive as patch releases,
your changes as patches or hooks
Each .devtools/<script> is now vendor/bin/eddy-<script>, and .devtools/browser start and stop are eddy-browser-start and eddy-browser-stop, while the ahoy and make commands keep their names. CI picks up tooling fixes on its own, and a local checkout picks them up after ahoy reset or make reset, which now also remove vendor/. A project-specific step goes into a custom lifecycle script, and a change to what a command does becomes a patch for the package in composer.dev.json.
The Cloudflare quick tunnel moved into the package as well: eddy-start, eddy-provision and eddy-stop run it whenever CLOUDFLARE_TUNNEL=1 is set, so projects no longer carry the scripts/*-cloudflared.sh hooks. The default Drupal major for local builds lives in extra.eddy.drupal-version in composer.dev.json, now that there's no script copy to rewrite.
Drupal 12 in CI
Drupal 12 support is opt-in: select 12 when install.php asks for the Drupal versions, or ask Claude to include it when it runs the update skill, and an upgrade keeps the majors your CI tests today. Opting in adds a README badge and 5 CI jobs, all on PHP 8.5, which Drupal 12 requires:
| Job | DRUPAL_VERSION |
Builds |
|---|---|---|
lint-d12, test-php-min-d12-stable, test-php-max-d12-stable |
12 |
Newest stable 12.x, or the newest pre-release until 12.0.0 ships |
test-php-min-d12-legacy |
12.0.0 |
Newest 12.0.x, the floor a ^12 requirement promises |
test-php-max-d12-canary |
12@beta |
Newest beta, release candidate or stable, so the next minor shows up early |
The jobs follow Drupal releases with no edits: until 12.0.0 ships they all build the newest Drupal 12 pre-release, and after that canary moves on to the 12.1 pre-releases while legacy stays on 12.0.x. Drupal 12 builds use Drush's 14.x development branch until Drush 14.0.0 is tagged, and they install drupal/core from source, since its packages leave out the tests directories your tests need.
Drupal 12 also needs 3 changes in your own code, which no template merge makes:
-
Add
^12tocore_version_requirementin your*.info.yml. -
Declare
string|falseas the return type ofgetMinkDriverArgs()if your FunctionalJavascript tests extend the base class the template generated. -
Keep both forms of test metadata: doc-comment annotations for PHPUnit 9.6 on Drupal 10, and PHP attributes for PHPUnit 12 on Drupal 12.
Builds pin Drupal core and apply your patches
Every build now pins Drupal core to 1 exact release and lets each other dependency take its most stable release that fits, so composer.dev.json and your composer.json only say which versions are acceptable:
DRUPAL_VERSION=11
│
▼
drupal/core* pinned to 1 exact release, the newest stable 11.x,
and printed in the build log
│
▼
other dependencies minimum-stability: dev, prefer-stable: true
each takes its most stable release that fits, and falls back
to a pre-release or development branch only when nothing
stable supports that core; the build log lists every branch
│
▼
extra.patches applied by cweagans/composer-patches 2.x
a patch that no longer applies fails the build
DRUPAL_VERSION takes values such as 11, 11.1.0, 11@beta or 12, but no longer @dev, since a development branch isn't a release.
The build also installs cweagans/composer-patches 2.x. From 4.14.0 to 4.19.0 it didn't, so unless your project required the plugin itself, Composer skipped every patch you declared without a word. Those patches apply now, and a patch that went stale while it was skipped fails the build until you fix or drop it.
Deployments that never rewind a branch
In 4.19.0, pushing a release tag force-pushed the tagged commit over a branch of your Drupal.org repository, so a tag behind that branch's tip rewound it. A late or re-run test run could do the same, the first deployment of a new branch failed, and the Deploy workflow failed on every run until deployment was set up. 5.x fixes all 4:
| Event | 4.19.0 | 5.x |
|---|---|---|
| Release tag pushed | Force-pushes the tagged commit over a branch | Pushes the tag only and leaves branches alone |
| Older commit deployed late or re-run | Force-pushes it over the newer branch tip | Skipped with a notice |
| First deployment of a branch | Fails | Creates the branch |
No DEPLOY_REMOTE secret |
Every Deploy run fails |
Skipped with a notice |
DEPLOY_BRANCH now applies to branch pushes only. If your release process relied on a tag push to update a branch, push the branch as well.
GitHub Actions is the only CI
CircleCI support is gone, along with the installer's CI provider question, so every project gets the same GitHub Actions workflows: test.yml, deploy.yml, draft-release-notes.yml and assign-author.yml. A project already on GitHub Actions has nothing to do. A project on CircleCI moves its settings to GitHub Actions, under Settings -> Secrets and variables -> Actions:
-
The private deployment key becomes the
DEPLOY_SSH_KEYsecret, and its fingerprint isn't needed anymore. -
DEPLOY_REMOTE,DEPLOY_USER_NAME,DEPLOY_USER_EMAILandDEPLOY_PROCEEDbecome secrets, andDEPLOY_BRANCHbecomes a repository variable. -
CODECOV_TOKENbecomes a secret, and eachCI_*_IGNORE_FAILUREtoggle becomes a repository variable. -
Each
ci/circleci: <job>check in branch protection becomes the GitHub Actions job of the same name.
Then stop building the project in CircleCI, or every push gets a failing "CircleCI Pipeline" check. CircleCI is gone has the details, including which branches deploy from GitHub Actions.
Upgrading a 4.x project
A 4.x project can't update itself to 5.x: its AGENTS.md fetches the update skill from the old .scaffold/ path, which returns 404, and curl -sSL saves that error page as the skill. Fetch the new skill once by hand, from the project root:
rm -rf .claude/skills/update-consumer-drupal-extension-scaffold
mkdir -p .claude/skills/update-consumer-eddy
curl -fsSL -o .claude/skills/update-consumer-eddy/SKILL.md \
https://raw.githubusercontent.com/drevops/eddy/main/.eddy/skills/update-consumer-eddy/SKILL.mdCommit your work in progress first, since the update replaces most of the project root. Then start Claude Code in the project and run /update-consumer-eddy. The skill opens a pull request with the 5.x files, drops .devtools/ and the Cloudflare hooks, and rewrites AGENTS.md, so every later update works as usual. It leaves 3 things to you: moving your .devtools/ ed...
4.19.0 - last 4.x release
What's new since 4.18.0
This is the last 4.x release. The next release will be 5.0.0.
Breaking changes
-
Renamed the 'init.php' prompt variables from 'PROMPTY_' to 'DEX_'. @AlexSkrypnyk (#521)
php init.phpnow reads pre-filled answers fromDEX_*variables instead of the prompt library's defaultPROMPTY_*prefix, soPROMPTY_*variables are ignored. Rename everyPROMPTY_prefix toDEX_in any script or CI job that runsinit.php, and set the newDEX_EXAMPLEStoo, since a run with no terminal now cancels when any prompt is left unanswered.php init.php --helplists the full set, and runs that answer the prompts by hand aren't affected. -
[#510] Renamed the 'QRCODE' login opt-in to 'LOGIN_QRCODE' and made the 'qrcode' command render on invocation. @AlexSkrypnyk (#513)
make loginandahoy loginno longer readQRCODE, so aQRCODE=1set in.envor your shell stops adding a QR code under the login link after updating. Rename it toLOGIN_QRCODE, and keep in mind the wrappers only check that it's non-empty, so unset it to turn the code off rather than setting it to0. The./.devtools/qrcode <url>command itself now renders without any opt-in, and a missingqrencodefails with an install hint instead of being silently skipped.
Highlights
-
[#522] Updated the bundled prompt library to '0.7.0' so unsupported prompt values are rejected. @AlexSkrypnyk (#523)
Non-interactiveinit.phpruns used to act on any value they were given: an unsupported Drupal version such as12left the project with no CI jobs for any Drupal version, and a tools typo such asphpcsxremoved all 11 tools, with the run still exiting as a success. Unsupported values are now rejected before anything is written, with an error listing the accepted options. A run with no terminal and an unanswered prompt also cancels in under a second instead of hanging until the job times out. -
[#517] Added an example scripts prompt to 'init.php' and fixed the Drupal version default. @AlexSkrypnyk (#520)
Accepting every default inphp init.phpused to abort withAt least one Drupal version is required.because the Target Drupal versions prompt started with nothing checked. Drupal 11 is now pre-selected, so a run on defaults completes. A new Keep example lifecycle scripts prompt (DEX_EXAMPLESwhen scripted) defaults to No and deletes the 4scripts/*-example.shhooks every new project used to inherit, keepingscripts/itself and the Cloudflare tunnel scripts. -
[#508] Fixed Selenium pinning port 4444 and 'MINK_DRIVER_ARGS_WEBDRIVER' overriding the environment. @AlexSkrypnyk (#514)
WithWEBDRIVER_BACKEND=selenium, the container now claims the first free port from 4444 and saves it to.env, as the local Chrome backend already did. It's also named after that port (selenium-<port>), so 2 projects can run FunctionalJavascript tests side by side without one removing the other's container.phpunit.xmlandphpunit.d10.xmlno longer forceMINK_DRIVER_ARGS_WEBDRIVER, so a test that doesn't extend the shipped FunctionalJavascript base class can set its own endpoint from the environment. -
[#509] Deployed the commit that CI tested instead of the default branch. @AlexSkrypnyk (#512)
The GitHub Actions deploy workflow checked out without a ref, so a successful test run on a non-default branch published the default branch's code under that branch's name. It now checks out the exact commit the test run used, so a release tag deploys the tagged commit, and only push events from your own repository reach the deploy job, which keeps pull request and fork runs away from the deployment key. CircleCI already deployed the right commit and is unchanged. -
[#506] Stripped the scaffold example extension on update and stopped discarding project lifecycle scripts. @AlexSkrypnyk (#507)
Theupdate-consumer-drupal-extension-scaffoldskill wiped the project root and never putscripts/back, so every scaffold update deleted the project's own lifecycle hooks. It now restoresscripts/alongsidesrc/,tests/andconfig/, then removes the scaffold's example extension (service, form, tests, schema, assets and*-example.shhooks), deleting only files git doesn't track, so project code that grew out of an example stays put. It also skips draft releases and uses the newest published tag verbatim.
Other changes
-
Update dependency prettier to ^3.9.9 @renovate[bot] (#536)
-
Update selenium/standalone-chromium:latest Docker digest to 08fd293 @renovate[bot] (#534)
-
Update dependency ubuntu to v26 @renovate[bot] (#535)
-
Update dependency prettier to ^3.9.8 @renovate[bot] (#533)
-
Update codecov/codecov-action digest to 303a32d @renovate[bot] (#532)
-
Update dependency prettier to ^3.9.7 @renovate[bot] (#531)
-
Update codecov/codecov-action digest to 0b35c9e @renovate[bot] (#530)
-
Update zizmorcore/zizmor-action action to v0.6.4 @renovate[bot] (#529)
-
Update selenium/standalone-chromium:latest Docker digest to fcf9eef @renovate[bot] (#528)
-
[#524] Declared the CI runner roles centrally so each tool step reads its own flag. @AlexSkrypnyk (#527)
GitHub Actions and CircleCI now declareCI_RUNNER_INDEX,CI_RUNNER_TOTALand aCI_IS_<TOOL>_RUNNERflag for Jest and PHPUnit once per job, and each tool's steps read their flag instead of a hand-written condition. Behaviour is unchanged by default, but moving a tool to another runner or sharding it is now 1 edit to its flag, and the README's new "Distributing tools across CI runners" section shows how on both providers. -
Update zizmorcore/zizmor-action action to v0.6.3 @renovate[bot] (#526)
-
Fixed the update skill's 'init.php' invocation leaving 3 prompts unanswered. @AlexSkrypnyk (#521)
The update skill's documentedinit.phpcommand never set the Drupal version, tools or Cloudflare tunnel variables, and with no terminal to answer those prompts the run spun forever instead of failing. It now sets every prompt variable, in the same order the prompts appear. -
[#511] Stopped 'login' re-inlining the 'drush' invocation in both wrappers. @AlexSkrypnyk (#515)
ahoy loginnow callsahoy drush uli, and theMakefilekeeps the whole Drush invocation in aDRUSHvariable (replacingDRUSH_URI), so changing how Drush or the site URL is resolved is 1 edit per wrapper.ahoy drushalso forwards its arguments quoted, so an argument containing spaces reaches Drush intact, as inahoy drush php:eval 'print "a b c"'.
Full Changelog: 4.18.0...4.19.0
4.18.0
What's new since 4.17.0
Breaking changes
-
[#499] Fixed Drupal 10 static analysis rejecting PHPUnit attribute classes. @AlexSkrypnyk (#501)
Drupal 10 builds failedmake lintwith nine PHPStanattribute.notFounderrors, becausePHPUnit\Framework\Attributes\*first exists in PHPUnit 10 and Drupal 10 resolves PHPUnit 9.6 with no path to a newer one. The fix scopes a PHPStan ignore to those attribute classes and splits linting into a per-Drupal-major matrix, which renames the GitHub Actions check fromlinttolint-d10andlint-d11. Iflintis a required status check in branch protection, replace it with both new job names, or the rule will wait forever on a check that no longer runs. -
[#339] Unified 'chromedriver-*' and 'selenium-*' commands into 'browser-start' and 'browser-stop'. @AlexSkrypnyk (#462)
The four backend-specific commandschromedriver-start,chromedriver-stop,selenium-startandselenium-stopare gone from bothmakeandahoy, replaced bybrowser-startandbrowser-stop, which pick the backend fromWEBDRIVER_BACKENDand own the Selenium Docker handling that was previously inlined as shell in both runners. Replace any scripted call to the four old names withbrowser-start/browser-stop; the backend is now chosen by the environment variable rather than by the command you type. -
[#339] Made local Chrome via 'chromedriver' the default WebDriver backend for FunctionalJavascript tests. @AlexSkrypnyk (#460)
FunctionalJavascript tests previously required the Docker Selenium container every time; the default backend is now the locally installed Chrome, driven by a version-matchedchromedriver, so a local run needs no Docker and the endpoint port is auto-discovered from 4444 and persisted to.envso several projects can test at once. To keep the container, setWEBDRIVER_BACKEND=selenium- the shipped GitHub Actions and CircleCI configurations already pin it, so only local runs and consumer-authored pipelines change. -
[#395] Dropped PHP 8.2 support and raised the minimum to 8.3. @AlexSkrypnyk (#455)
Thecomposer.jsonfloor moves from>=8.2to>=8.3, with the PHPCStestVersion, the Rector PHP set, the CircleCI default image and the CI matrix all following, so the tested matrix is now PHP 8.3, 8.4 and 8.5. PHP 8.2 is security-support-only upstream and already sat below Drupal 11's own minimum, so move any 8.2 environment to 8.3 or newer before upgrading.
Highlights
-
[#509] Deployed the commit that CI tested instead of the default branch. @AlexSkrypnyk (#512)
The deploy workflow triggers onworkflow_runand checked out without pinning a ref, so it force-pushed the tip of the default branch to a destination branch named after the triggering run - the name and the content described different commits. The checkout is now pinned to the triggering run's head SHA, so a release tag deploys the tagged commit CI actually tested, and the job is gated on same-repository push events so no tree this repository did not produce can reach the deployment key. -
[#506] Stripped the scaffold example extension on update and stopped discarding project lifecycle scripts. @AlexSkrypnyk (#507)
The update procedure wiped the project root and restored onlysrc/,tests/andconfig/, so a project's ownassemble-*.sh/provision-*.sh/start-*.sh/stop-*.shhooks were destroyed on every scaffold update -scripts/is now restored with the rest. A new step also deletes the bundled example extension thatinit.phphad merely renamed, guarded so a file goes only when it is both untracked and on the enumerated example list, leaving anything git already tracks untouched. -
[#432] Added an opt-in login-link QR code and a Cloudflare init opt-out. @AlexSkrypnyk (#459)
make loginandahoy logincan render the one-time login link as a terminal QR code, so it can be scanned straight from a phone instead of retyped; nothing is drawn unless you opt in andqrencodeis installed.init.phpalso gains a Cloudflare tunnel opt-out prompt, so declining strips thescripts/*-cloudflared.shhooks while the tunnel-agnosticTUNNEL_URLhandling stays for ngrok, Tailscale or anything similar. -
[#456] Suppressed verbose '.devtools' command output unless DEBUG is set. @AlexSkrypnyk (#458)
A normalahoy buildprinted around 540 lines, almost all of it Composer, npm and Drush noise. Tool output is now captured and echoed only when the command fails, dropping a build to roughly 60 clean[TASK]/[ OK ]lines, while your own front-end build andscripts/*lifecycle hooks stay visible because they are meaningful rather than noise. SetDEBUG=1to stream everything live again. -
[#384] Made PHPStan config compatible with Drupal.org CI. @AlexSkrypnyk (#453)
Drupal.org's GitLab CI analyses from insideweb/modules/custom/<module>/, a working directory where the scaffold's path-scopedignoreErrorsentry never matched, so every legitimate suppression was skipped and surfaced as a failure. Dropping that path scope lets generated extensions pass PHPStan on Drupal.org CI, and the README documents the one override a consumer needs when wiring up their own.gitlab-ci.yml:_PHPUNIT_EXTRA: '--no-coverage'. -
[#431] Added start/stop lifecycle hooks and Cloudflare tunnel support. @AlexSkrypnyk (#454)
Lifecycle hooks now cover all four phases:scripts/start-*.shruns after the server starts andscripts/stop-*.shbefore it stops, joining the existing assemble and provision hooks. A newresolve_site_url()helper prefers aTUNNEL_URLread from.envand falls back tohttp://host:port, so the local site can be exposed publicly through a tunnel - opt-in Cloudflare quick-tunnel hooks ship as a working reference, and the core stays generic enough for ngrok or Tailscale.
Other changes
-
[#511] Stopped 'login' re-inlining the 'drush' invocation in both wrappers. @AlexSkrypnyk (#515)
Thelogincommand re-inlined the Drush binary path and the site-URL resolution that thedrushcommand sitting directly above it already encapsulated, so the same invocation was written four times across the two wrappers - including a rawbuild/vendor/bin/drushcall in the very files that teach consumers to use the wrappers instead. Each wrapper now spells it once, andahoy drushforwards its arguments as"$@"rather than unquoted$*, so an argument containing spaces survives as one argument. -
[#510] Made the 'qrcode' command render on invocation and report a missing 'qrencode'. @AlexSkrypnyk (#513)
.devtools/qrcodewas documented on the command surface but printed nothing on a normal machine, because the opt-in gate lived inside the rendering helper and so silenced the deliberate caller along with the automatic one. Invoking the command now always renders, theloginwrappers keep their own gate under the renamedLOGIN_QRCODEvariable, and a missingqrencodebinary now fails with an install hint instead of returning silently. -
[#508] Fixed Selenium pinning port 4444 and 'MINK_DRIVER_ARGS_WEBDRIVER' overriding the environment. @AlexSkrypnyk (#514)
The Selenium backend pinned port 4444 and named its container the fixed stringselenium, so a second project'sdocker rm -fdestroyed the first project's still-running container. It now claims a free port from 4444 and names the containerselenium-<port>, matching what the chromedriver backend already did. Droppingforce="true"onMINK_DRIVER_ARGS_WEBDRIVERalso means a test that does not extend the shipped base class can export its own driver args. -
[#504] Migrated the deprecated 'version-resolver.default' field to a resolver category. @AlexSkrypnyk (#505)
Release Drafter v7 folded version resolution intocategoriesand warns on every run that the top-levelversion-resolverblock is deprecated. The configuration now declares an unconditionalversion-resolvercategory carrying theminorincrement, which contributes to the resolved version without rendering a heading, so the published notes stay byte-identical. Without it, the next draft would silently fall back to the built-inpatchdefault once the field is removed upstream - easy to miss, since drafts are created without human involvement. -
[#500] Fixed the deploy workflow clearing a valid branch name when a tag shares that name. @AlexSkrypnyk (#502)
The guard that blanks the head branch on a tag push tested whether a tag of that name existed anywhere in the repository, so pushing to a branch that happened to collide with an existing tag name deployed to the default branch instead of the intended one. It now matches by commit identity withgit tag --points-at, so the branch is cleared only when a tag of that name sits on the triggering commit; annotated tags are peeled, so both tag kinds are covered. -
[#492] Unified the spelling of 'JavaScript' across commands, tests and fixtures. @AlexSkrypnyk (#498)
Jsmeant two different things depending on context - Jest intest-js, and an abbreviation ofFunctionalJavascriptin class names such asYourExtensionSmokeJsTest. The language is now spelled out in full in every identifier, withtest-javascriptcanonical andtest-jskept as a working alias in both wrappers. Pinning Ahoy to 2.5.0 in CI along the way revived all nine declared aliases, which the previous 2.1.1 pin silently discarded because it predates alias support. -
[#493, #494] Documented missing '.devtools' entries and corrected PHPUnit README paths. @AlexSkrypnyk (#497)
.devtools/README.mddocumented only 6 of its 9 entries, omittingbrowser,infoandqrcode- all three reachable from the public command surface - and `phpuni...
4.17.0
What's new since 4.16.4
- [#415] Added Zizmor GitHub Actions security analysis and hardened workflows. @AlexSkrypnyk (#430)
- [#426] Added Drupal version selection to the 'init' command with CI matrix pruning. @AlexSkrypnyk (#429)
- [#425] Added 'AGENTS.md' hard rule to use command wrappers, not tool binaries directly. @AlexSkrypnyk (#428)
- [#417] Updated 'palantirnet/drupal-rector' to '^1@beta' with Drupal 11 rule set for D12 compatibility. @AlexSkrypnyk (#427)
- [#419] Updated bundled Prompty library to 0.6.0. @AlexSkrypnyk (#424)
- Moved CSpell scan control into '.cspell.json'. @AlexSkrypnyk (#423)
- [#420] Added a separate CircleCI lint job to mirror GitHub Actions. @AlexSkrypnyk (#422)
- [#414] Replaced the 18-job CI matrix with 6 role-based corners. @AlexSkrypnyk (#416)
Full Changelog: 4.16.4...4.17.0
4.16.4
What's new since 4.16.3
- Updated CI to use latest stable and pinned legacy Drupal core versions. @AlexSkrypnyk (#413)
Full Changelog: 4.16.3...4.16.4
4.16.3
What's new since 4.16.2
- Added a selectable development tools step to the 'init.php' installer. @AlexSkrypnyk (#412)
- Update all dependencies to ^3.8.4 @renovate[bot] (#411)
Full Changelog: 4.16.2...4.16.3
@AlexSkrypnyk, @renovate[bot] and renovate[bot]
4.16.2
What's new since 4.16.1
- Made twig-cs-fixer follow symlinks so symlinked templates are linted. @AlexSkrypnyk (#410)
- Update all dependencies to f3e473d @renovate[bot] (#409)
- Update all dependencies to v7 @renovate[bot] (#408)
- Update all dependencies to fb8b358 @renovate[bot] (#407)
- Update all dependencies to df4cb1c @renovate[bot] (#406)
Full Changelog: 4.16.1...4.16.2
@AlexSkrypnyk, @renovate[bot] and renovate[bot]