Skip to content

Commit 15b1272

Browse files
authored
Merge branch 'trunk' into stu-1525-add-curl-installer
2 parents e23ebc1 + f11d82f commit 15b1272

102 files changed

Lines changed: 4285 additions & 1225 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/CODEOWNERS‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Ruby dependency surface
2+
Gemfile* @Automattic/apps-infra-tooling
3+
.bundle/ @Automattic/apps-infra-tooling
4+
.rubocop*.yml @Automattic/apps-infra-tooling
5+
fastlane/ @Automattic/apps-infra-tooling
6+
7+
# CI and automation
8+
.buildkite/ @Automattic/apps-infra-tooling
9+
.github/workflows/ @Automattic/apps-infra-tooling
10+
.github/dependabot.yml @Automattic/apps-infra-tooling
11+
12+
# Toolchain and environment pins
13+
.ruby-version @Automattic/apps-infra-tooling
14+
.xcode-version @Automattic/apps-infra-tooling
15+
.nvmrc @Automattic/apps-infra-tooling
16+
17+
# Secrets
18+
.configure-files/ @Automattic/apps-infra-tooling

‎.github/dependabot.yml‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,3 +283,13 @@ updates:
283283
directory: "/"
284284
schedule:
285285
interval: "weekly"
286+
287+
# Enable version updates for Ruby gems
288+
- package-ecosystem: "bundler"
289+
directory: "/"
290+
schedule:
291+
interval: "daily"
292+
groups:
293+
ruby-minor-and-patch:
294+
update-types: [minor, patch]
295+
open-pull-requests-limit: 5

‎.github/workflows/build-php-cli-binaries.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ jobs:
117117
# Linux runs SPC inside the spc-gnu-docker container, which ships
118118
# its own PHP + Composer; host PHP is only needed for the macOS path.
119119
if: runner.os == 'macOS'
120-
uses: shivammathur/setup-php@7c071dfe9dc99bdf297fa79cb49ea005b9fcadbc # 2.37.1
120+
uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # 2.37.2
121121
with:
122122
coverage: none
123123
tools: composer:v2
@@ -544,7 +544,7 @@ jobs:
544544
uses: actions/checkout@v6
545545

546546
- name: Setup Ruby
547-
uses: ruby/setup-ruby@afeafc3d1ab54a631816aba4c914a0081c12ff2f # v1.310.0
547+
uses: ruby/setup-ruby@89f90524b88a01fe6e0b732220432cc6142926af # v1.313.0
548548
with:
549549
bundler-cache: true
550550

‎.github/workflows/claude-pr-review.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ jobs:
2929
fetch-depth: 1
3030

3131
- name: Comprehensive PR Review
32-
uses: anthropics/claude-code-action@fbda2eb1bdc90d319b8d853f5deb53bca199a7c1 # v1.0.140
32+
uses: anthropics/claude-code-action@0cb4f3e5e764d2e00407d29b6bf0aa9df0976d88 # v1.0.146
3333
with:
3434
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
3535
track_progress: true

‎.github/workflows/claude.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@ jobs:
2626
fetch-depth: 0
2727

2828
- name: Run Claude
29-
uses: anthropics/claude-code-action@fbda2eb1bdc90d319b8d853f5deb53bca199a7c1 # v1.0.140
29+
uses: anthropics/claude-code-action@0cb4f3e5e764d2e00407d29b6bf0aa9df0976d88 # v1.0.146
3030
with:
3131
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

‎AGENTS.md‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,11 @@ WordPress Studio - Electron desktop app for managing local WordPress sites. Buil
5858

5959
**Files**: React components (PascalCase), utils (camelCase), tests (.test.ts/.tsx)
6060
**Class names (`cx`)**: Use `cx()` (`apps/studio/src/lib/cx.ts`) only to join classes with conditions (e.g. `cx( 'base', isActive && 'active' )`). For a single static string, pass the bare string instead of wrapping it — `className="h-full"`, not `className={ cx( 'h-full' ) }`. Enforced (and auto-fixed) by the `studio/no-redundant-cx` ESLint rule (`tools/eslint-plugin-studio`).
61-
**Theming / colors (renderer CSS)**: Studio supports light + dark via `@media (prefers-color-scheme: dark)`. For any **color** (text, background, border, fill, brand/theme, error/running states) **MUST** use Studio's dark-aware `--color-frame-*` tokens defined in `apps/studio/src/index.css` (e.g. `--color-frame-text`, `--color-frame-bg`, `--color-frame-surface`, `--color-frame-border`, `--color-frame-theme`, `--color-frame-error`). **NEVER** use `--wpds-color-*` tokens for color — they ship light-only fallbacks from `@wordpress/ui` and render broken (invisible text, wrong borders) in dark mode. Non-color `--wpds-*` tokens (`--wpds-dimension-*`, `--wpds-typography-*`, `--wpds-border-width-*`, `--wpds-elevation-*`, `--wpds-cursor-*`) are theme-independent and fine to use. When a needed color has no `--color-frame-*` token, add one (with both light and dark values) rather than reaching for `--wpds-color-*`.
61+
**Theming / colors (renderer CSS)**: Each app in `apps/` has its own dark-mode strategy — identify which app a file belongs to before picking color tokens:
62+
- **`apps/studio` (legacy renderer)**: supports light + dark via `@media (prefers-color-scheme: dark)`. For any **color** (text, background, border, fill, brand/theme, error/running states) **MUST** use Studio's dark-aware `--color-frame-*` tokens defined in `apps/studio/src/index.css` (e.g. `--color-frame-text`, `--color-frame-bg`, `--color-frame-surface`, `--color-frame-border`, `--color-frame-theme`, `--color-frame-error`). **NEVER** use `--wpds-color-*` tokens for color here — no app-wide color `ThemeProvider` wraps this app (only density-scoped ones inside Studio Code), so they fall back to light-only values from `@wordpress/ui` and render broken (invisible text, wrong borders) in dark mode. When a needed color has no `--color-frame-*` token, add one (with both light and dark values) rather than reaching for `--wpds-color-*`. As of June 2026 there is no plan to refactor `apps/studio` onto `ThemeProvider` — it may be replaced entirely.
63+
- **`apps/ui` (agentic UI)**: the whole canvas is wrapped in `ThemeProvider` (`apps/ui/src/app/app-providers.tsx`), so the rule is the **opposite** — always use `--wpds-color-*` variables for color; they adapt to the active theme. Do not use `--color-frame-*` tokens here.
64+
- Non-color `--wpds-*` tokens (`--wpds-dimension-*`, `--wpds-typography-*`, `--wpds-border-width-*`, `--wpds-elevation-*`, `--wpds-cursor-*`) are theme-independent and fine to use in any app.
65+
6266
**IPC Handlers** (`apps/studio/src/ipc-handlers.ts`): **MUST** `export async function handlerName(event, ...args): Promise<ReturnType>` | Handler names in `apps/studio/src/constants.ts` | All handlers MUST be async and return Promises
6367
**Storage**: **CRITICAL** - Always use file locking when writing config. Each config file has its own lockfile and helpers: `lockAppdata()` / `unlockAppdata()` for `app.json` (`apps/studio/src/storage/user-data.ts`), `lockCliConfig()` / `unlockCliConfig()` for `cli.json` (`apps/cli/lib/cli-config/core.ts`), and `lockSharedConfig()` / `unlockSharedConfig()` for `shared.json` (`tools/common/lib/shared-config.ts`).
6468
**i18n**: `@wordpress/i18n` (`__()` function), `tools/common/translations/`, `<I18nProvider>` (renderer), `loadTranslations()` (CLI)
@@ -97,7 +101,7 @@ If you've built a substantial new feature — especially one generated with AI a
97101

98102
## Common Pitfalls
99103

100-
**CRITICAL - Dark Mode Color Tokens**: Renderer CSS must use `--color-frame-*` tokens for all colors, never `--wpds-color-*`. The wpds color tokens have hardcoded light fallbacks and do not respond to dark mode, so components look correct in light mode but break in dark (regression fixed in "Fix Dark theme for Studio Code"). Always test new/changed UI in BOTH color schemes before declaring done — macOS: System Settings → Appearance → Dark.
104+
**CRITICAL - Dark Mode Color Tokens**: The right color tokens depend on the app. In `apps/studio`, use `--color-frame-*` tokens for all colors, never `--wpds-color-*` — without a `ThemeProvider`, the wpds color tokens keep their hardcoded light fallbacks and do not respond to dark mode, so components look correct in light mode but break in dark (regression fixed in "Fix Dark theme for Studio Code"). In `apps/ui`, do the opposite: use `--wpds-color-*` tokens — the app-wide `ThemeProvider` makes them adapt to the active theme. In all apps, always test new/changed UI in BOTH color schemes before declaring done — macOS: System Settings → Appearance → Dark.
101105

102106
**CRITICAL - WordPress Core Files**: Do NOT edit WordPress core files within site directories. Studio uses WordPress Playground (PHP WASM), and core modifications won't persist or function correctly.
103107

‎Gemfile‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
source 'https://rubygems.org'
44

5-
gem 'fastlane', '~> 2.232'
5+
gem 'fastlane', '~> 2.236'
66
gem 'fastlane-plugin-wpmreleasetoolkit', '~> 14.2'
77

8-
gem 'aws-sdk-cloudfront', '~> 1.87'
8+
gem 'aws-sdk-cloudfront', '~> 1.150'
99

10-
gem 'rubocop', '~> 1.42', require: false
10+
gem 'rubocop', '~> 1.87', require: false

‎Gemfile.lock‎

Lines changed: 58 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -9,31 +9,31 @@ GEM
99
ast (2.4.3)
1010
atomos (0.1.3)
1111
aws-eventstream (1.4.0)
12-
aws-partitions (1.1223.0)
13-
aws-sdk-cloudfront (1.141.0)
14-
aws-sdk-core (~> 3, >= 3.241.4)
12+
aws-partitions (1.1259.0)
13+
aws-sdk-cloudfront (1.150.0)
14+
aws-sdk-core (~> 3, >= 3.248.0)
1515
aws-sigv4 (~> 1.5)
16-
aws-sdk-core (3.243.0)
16+
aws-sdk-core (3.252.0)
1717
aws-eventstream (~> 1, >= 1.3.0)
1818
aws-partitions (~> 1, >= 1.992.0)
1919
aws-sigv4 (~> 1.9)
2020
base64
2121
bigdecimal
2222
jmespath (~> 1, >= 1.6.1)
2323
logger
24-
aws-sdk-kms (1.122.0)
25-
aws-sdk-core (~> 3, >= 3.241.4)
24+
aws-sdk-kms (1.129.0)
25+
aws-sdk-core (~> 3, >= 3.248.0)
2626
aws-sigv4 (~> 1.5)
27-
aws-sdk-s3 (1.215.0)
28-
aws-sdk-core (~> 3, >= 3.243.0)
27+
aws-sdk-s3 (1.225.1)
28+
aws-sdk-core (~> 3, >= 3.248.0)
2929
aws-sdk-kms (~> 1)
3030
aws-sigv4 (~> 1.5)
3131
aws-sigv4 (1.12.1)
3232
aws-eventstream (~> 1, >= 1.0.2)
3333
babosa (1.0.4)
34-
base64 (0.2.0)
34+
base64 (0.3.0)
3535
benchmark (0.5.0)
36-
bigdecimal (4.0.1)
36+
bigdecimal (4.1.2)
3737
buildkit (1.6.1)
3838
sawyer (>= 0.6)
3939
chroma (0.2.0)
@@ -77,20 +77,20 @@ GEM
7777
faraday-net_http_persistent (1.2.0)
7878
faraday-patron (1.0.0)
7979
faraday-rack (1.0.0)
80-
faraday-retry (1.0.3)
80+
faraday-retry (1.0.4)
8181
faraday_middleware (1.2.1)
8282
faraday (~> 1.0)
83-
fastimage (2.4.0)
84-
fastlane (2.232.2)
85-
CFPropertyList (>= 2.3, < 4.0.0)
86-
abbrev (~> 0.1.2)
83+
fastimage (2.4.1)
84+
fastlane (2.236.1)
85+
CFPropertyList (>= 2.3, < 5.0.0)
86+
abbrev (~> 0.1)
8787
addressable (>= 2.8, < 3.0.0)
8888
artifactory (~> 3.0)
8989
aws-sdk-s3 (~> 1.197)
9090
babosa (>= 1.0.3, < 2.0.0)
91-
base64 (~> 0.2.0)
91+
base64 (~> 0.2)
9292
benchmark (>= 0.1.0)
93-
bundler (>= 1.17.3, < 5.0.0)
93+
bundler (>= 2.4.0, < 5.0.0)
9494
colored (~> 1.2)
9595
commander (~> 4.6)
9696
csv (~> 3.3)
@@ -101,22 +101,23 @@ GEM
101101
faraday-cookie_jar (~> 0.0.6)
102102
faraday_middleware (~> 1.0)
103103
fastimage (>= 2.1.0, < 3.0.0)
104-
fastlane-sirp (>= 1.0.0)
104+
fastlane-sirp (>= 1.1.0)
105105
gh_inspector (>= 1.1.2, < 2.0.0)
106106
google-apis-androidpublisher_v3 (~> 0.3)
107107
google-apis-playcustomapp_v1 (~> 0.1)
108-
google-cloud-env (>= 1.6.0, <= 2.1.1)
108+
google-cloud-env (>= 1.6.0, < 2.3.0)
109109
google-cloud-storage (~> 1.31)
110110
highline (~> 2.0)
111111
http-cookie (~> 1.0.5)
112112
json (< 3.0.0)
113-
jwt (>= 2.1.0, < 3)
113+
jwt (>= 2.10.3, < 4)
114114
logger (>= 1.6, < 2.0)
115115
mini_magick (>= 4.9.4, < 5.0.0)
116+
multi_json (~> 1.12)
116117
multipart-post (>= 2.0.0, < 3.0.0)
117-
mutex_m (~> 0.3.0)
118+
mutex_m (~> 0.3)
118119
naturally (~> 2.2)
119-
nkf (~> 0.2.0)
120+
nkf (~> 0.2)
120121
optparse (>= 0.1.1, < 1.0.0)
121122
ostruct (>= 0.1.0)
122123
plist (>= 3.1.0, < 4.0.0)
@@ -131,12 +132,12 @@ GEM
131132
xcodeproj (>= 1.13.0, < 2.0.0)
132133
xcpretty (~> 0.4.1)
133134
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
134-
fastlane-plugin-wpmreleasetoolkit (14.6.0)
135+
fastlane-plugin-wpmreleasetoolkit (14.7.0)
135136
buildkit (~> 1.5)
136137
chroma (= 0.2.0)
137138
diffy (~> 3.3)
138139
dotenv (~> 2.8)
139-
fastlane (~> 2.231)
140+
fastlane (~> 2.235)
140141
gettext (~> 3.5)
141142
git (~> 1.3)
142143
google-cloud-storage (~> 1.31)
@@ -149,8 +150,7 @@ GEM
149150
rake (>= 12.3, < 14.0)
150151
rake-compiler (~> 1.0)
151152
xcodeproj (~> 1.22)
152-
fastlane-sirp (1.0.0)
153-
sysrandom (~> 1.0)
153+
fastlane-sirp (1.1.0)
154154
fiddle (1.1.8)
155155
forwardable (1.4.0)
156156
gettext (3.5.2)
@@ -163,7 +163,7 @@ GEM
163163
git (1.19.1)
164164
addressable (~> 2.8)
165165
rchardet (~> 1.8)
166-
google-apis-androidpublisher_v3 (0.96.0)
166+
google-apis-androidpublisher_v3 (0.102.0)
167167
google-apis-core (>= 0.15.0, < 2.a)
168168
google-apis-core (0.18.0)
169169
addressable (~> 2.5, >= 2.5.1)
@@ -173,19 +173,20 @@ GEM
173173
mutex_m
174174
representable (~> 3.0)
175175
retriable (>= 2.0, < 4.a)
176-
google-apis-iamcredentials_v1 (0.26.0)
176+
google-apis-iamcredentials_v1 (0.27.0)
177177
google-apis-core (>= 0.15.0, < 2.a)
178178
google-apis-playcustomapp_v1 (0.17.0)
179179
google-apis-core (>= 0.15.0, < 2.a)
180-
google-apis-storage_v1 (0.61.0)
180+
google-apis-storage_v1 (0.63.0)
181181
google-apis-core (>= 0.15.0, < 2.a)
182-
google-cloud-core (1.8.0)
182+
google-cloud-core (1.9.0)
183183
google-cloud-env (>= 1.0, < 3.a)
184184
google-cloud-errors (~> 1.0)
185-
google-cloud-env (2.1.1)
185+
google-cloud-env (2.2.2)
186+
base64 (~> 0.2)
186187
faraday (>= 1.0, < 3.a)
187-
google-cloud-errors (1.5.0)
188-
google-cloud-storage (1.58.0)
188+
google-cloud-errors (1.6.0)
189+
google-cloud-storage (1.61.0)
189190
addressable (~> 2.8)
190191
digest-crc (~> 0.4)
191192
google-apis-core (>= 0.18, < 2)
@@ -194,12 +195,14 @@ GEM
194195
google-cloud-core (~> 1.6)
195196
googleauth (~> 1.9)
196197
mini_mime (~> 1.0)
197-
googleauth (1.11.2)
198+
google-logging-utils (0.2.0)
199+
googleauth (1.17.0)
198200
faraday (>= 1.0, < 3.a)
199-
google-cloud-env (~> 2.1)
200-
jwt (>= 1.4, < 3.0)
201-
multi_json (~> 1.11)
201+
google-cloud-env (~> 2.2)
202+
google-logging-utils (~> 0.1)
203+
jwt (>= 1.4, < 4.0)
202204
os (>= 0.9, < 2.0)
205+
pstore (~> 0.1)
203206
signet (>= 0.16, < 2.a)
204207
highline (2.0.3)
205208
http-cookie (1.0.8)
@@ -208,8 +211,8 @@ GEM
208211
mutex_m
209212
java-properties (0.3.0)
210213
jmespath (1.6.2)
211-
json (2.19.2)
212-
jwt (2.10.3)
214+
json (2.19.9)
215+
jwt (3.2.0)
213216
base64
214217
language_server-protocol (3.17.0.5)
215218
lint_roller (1.1.0)
@@ -218,12 +221,12 @@ GEM
218221
logger (1.7.0)
219222
mini_magick (4.13.2)
220223
mini_mime (1.1.5)
221-
multi_json (1.19.1)
224+
multi_json (1.21.1)
222225
multipart-post (2.4.1)
223226
mutex_m (0.3.0)
224227
nanaimo (0.4.0)
225228
naturally (2.3.0)
226-
nkf (0.2.0)
229+
nkf (0.3.0)
227230
nokogiri (1.19.3-aarch64-linux-gnu)
228231
racc (~> 1.4)
229232
nokogiri (1.19.3-aarch64-linux-musl)
@@ -247,8 +250,8 @@ GEM
247250
optparse (0.8.1)
248251
os (1.1.4)
249252
ostruct (0.6.3)
250-
parallel (1.27.0)
251-
parser (3.3.10.1)
253+
parallel (1.28.0)
254+
parser (3.3.11.1)
252255
ast (~> 2.4.1)
253256
racc
254257
plist (3.7.2)
@@ -259,33 +262,34 @@ GEM
259262
progress_bar (1.3.4)
260263
highline (>= 1.6)
261264
options (~> 2.3.0)
265+
pstore (0.2.1)
262266
public_suffix (7.0.5)
263267
racc (1.8.1)
264268
rainbow (3.1.1)
265-
rake (13.3.1)
269+
rake (13.4.2)
266270
rake-compiler (1.3.1)
267271
rake
268-
rchardet (1.10.0)
269-
regexp_parser (2.11.3)
272+
rchardet (1.10.2)
273+
regexp_parser (2.12.0)
270274
representable (3.2.0)
271275
declarative (< 0.1.0)
272276
trailblazer-option (>= 0.1.1, < 0.2.0)
273277
uber (< 0.2.0)
274-
retriable (3.4.0)
278+
retriable (3.8.0)
275279
rexml (3.4.4)
276280
rouge (3.28.0)
277-
rubocop (1.84.1)
281+
rubocop (1.87.0)
278282
json (~> 2.3)
279283
language_server-protocol (~> 3.17.0.2)
280284
lint_roller (~> 1.1.0)
281-
parallel (~> 1.10)
285+
parallel (>= 1.10)
282286
parser (>= 3.3.0.2)
283287
rainbow (>= 2.2.2, < 4.0)
284288
regexp_parser (>= 2.9.3, < 3.0)
285289
rubocop-ast (>= 1.49.0, < 2.0)
286290
ruby-progressbar (~> 1.7)
287291
unicode-display_width (>= 2.4.0, < 4.0)
288-
rubocop-ast (1.49.0)
292+
rubocop-ast (1.49.1)
289293
parser (>= 3.3.7.2)
290294
prism (~> 1.7)
291295
ruby-progressbar (1.13.0)
@@ -295,16 +299,14 @@ GEM
295299
addressable (>= 2.3.5)
296300
faraday (>= 0.17.3, < 3)
297301
security (0.1.5)
298-
signet (0.21.0)
302+
signet (0.22.0)
299303
addressable (~> 2.8)
300304
faraday (>= 0.17.5, < 3.a)
301305
jwt (>= 1.5, < 4.0)
302-
multi_json (~> 1.10)
303306
simctl (1.6.10)
304307
CFPropertyList
305308
naturally
306309
singleton (0.3.0)
307-
sysrandom (1.0.5)
308310
terminal-notifier (2.0.0)
309311
terminal-table (3.0.2)
310312
unicode-display_width (>= 1.1.1, < 3)
@@ -340,10 +342,10 @@ PLATFORMS
340342
x86_64-linux-musl
341343

342344
DEPENDENCIES
343-
aws-sdk-cloudfront (~> 1.87)
344-
fastlane (~> 2.232)
345+
aws-sdk-cloudfront (~> 1.150)
346+
fastlane (~> 2.236)
345347
fastlane-plugin-wpmreleasetoolkit (~> 14.2)
346-
rubocop (~> 1.42)
348+
rubocop (~> 1.87)
347349

348350
BUNDLED WITH
349351
2.6.8

‎apps/cli/ai/skills/block-content/SKILL.md‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,5 +89,4 @@ Do not use `--post_content-file=<host path>`. `wp_cli` runs inside the PHP-WASM
8989

9090
## Validation
9191

92-
- Run `validate_html_blocks` after every write or edit that creates or changes block content. If it reports invalid `core/html` blocks, rewrite only those blocks as editable core or plugin blocks, then call `validate_html_blocks` again before editor validation.
93-
- Run `validate_and_fix_blocks` after `validate_html_blocks` passes. Call it with `filePath` whenever the content lives in a file; safe editor serialization fixes are applied directly to that file. If it says an auto-fix was applied, do not manually replace markup or call validation again unless you intentionally change block markup afterward. Use the diff only to inspect structural changes for CSS impact. Classes added or removed by the validator can affect layout and styling.
92+
- Run `validate_blocks` after every write or edit that creates or changes block content. Call it with `filePath` whenever the content lives in a file. It first runs a static `core/html` policy check: if that reports invalid `core/html` blocks, editor validation is skipped — rewrite only those blocks as editable core or plugin blocks, then call `validate_blocks` again. Once the policy passes it validates in the live editor and applies safe serialization fixes directly to the file. If it says an auto-fix was applied, do not manually replace markup or call validation again unless you intentionally change block markup afterward. Use the diff only to inspect structural changes for CSS impact. Classes added or removed by the validator can affect layout and styling.

0 commit comments

Comments
 (0)