Skip to content

Dependency updates: every advisory outside fchub-stream - #108

Merged
vcode-sh merged 13 commits into
mainfrom
chore/dependency-updates
Aug 7, 2026
Merged

Dependency updates: every advisory outside fchub-stream#108
vcode-sh merged 13 commits into
mainfrom
chore/dependency-updates

Conversation

@vcode-sh

@vcode-sh vcode-sh commented Aug 7, 2026

Copy link
Copy Markdown
Owner

Every open advisory outside fchub-stream is now closed. Seven commits, one workspace each, so a bad bump can be reverted without taking the rest down with it.

Workspace Advisories After Verified by
fluentcart-mcp 2 0 2823 unit, 225 acceptance, 22 conformance, 194 routes
fchub-thank-you 11 0 23 phpunit, phpcs clean
fchub-portal-extender 4 0 build + manifest resolution
fchub-memberships 1883 phpunit / 11978 assertions, 349 vitest
cartshift 612 phpunit, 176 vitest
web-docs 22 audit findings 8 223/223 pages, biome, catalogue check
workflows inputs read by hand; see below

The uncomfortable part

Ten of the twenty advisories came from plugins/fchub-thank-you/admin — a Vue and Vite build whose output nothing loads. Assets.php:11 enqueues assets/js/fchub-thank-you-admin.js, a hand-written file with no build step, and no PHP anywhere references assets/dist. Zero dist files are tracked.

So half the repository's security surface was a pipeline with no consumer. The bumps here are real and the advisories are genuinely closed, but deleting that app would have closed more of them than this PR does.

What I did not take

Three web-docs majors need source changes, not a lockfile, and a security sweep is the wrong place to make them:

  • lucide-react 1.x removes the Github and Twitter icons that contact/page.tsx and layout.shared.tsx import
  • react-day-picker 10 reshapes ClassNames; calendar.tsx fails typecheck
  • recharts 3 breaks nine types in chart.tsx via the Tooltip and Legend prop changes

They stay on the old majors, which is why lodash is still listed against recharts.

fumadocs-mdx 15 was rejected once on a peer mismatch and retried after fumadocs-core moved — it installed clean the second time and took js-yaml and picomatch with it. Worth the second look.

TypeScript went 5.9 to 7.0. I expected that to fail and it did not: build, lint, catalogue check and a bare tsc --noEmit all pass. Nothing in here exercises the TS 7 changes.

Of the eight left in web-docs

Four are a postcss pinned exactly at 8.5.23 inside Next's own published package.json, line 88. No override in this project can reach it and 16.3.0 is the newest stable, so it clears when Next ships a patch and not before. One is a dangling esbuild@0.27.3 from a vite optional peer that refuses to dedupe against the 0.28.1 already present — dead weight, nothing invokes it. The rest trace back to the two reverted majors.

Actions

Five majors across nine workflows: checkout v4→v7, setup-node v4→v7, upload-artifact v4→v7, download-artifact v4→v8, cache v4→v6. Every changed callsite's inputs were read rather than assumed — no reliance on the removed merge-multiple model, no restore-keys, nothing that moved.

This PR is the first thing that actually runs them. ci.yml triggers on pull_request, so nothing before now has exercised these pins. If a release workflow was going to break, it breaks here rather than at the next tag, which is the entire reason to look at the checks before merging.

Deliberately not in this branch

cartshift's rebuilt bundle. The new Vite emits fresh content hashes across ~140 files, and cartshift/1.3.0-selective-migration is unmerged with its own bundle built against the old one. Committing it here buys a merge conflict and nothing else; the bundle is rebuilt at release anyway.

fchub-stream, entirely. It is discontinued. Its fourteen Dependabot pull requests are closed and its three advisories remain open, which is a decision to be made on the security tab rather than in a diff.

fast-uri 3.1.4 -> 3.1.5 (CVE-2026-18446, host confusion via backslash
authority introducer) and hono 4.12.32 -> 4.12.34 (CVE-2026-69207, ReDoS
in the CORS middleware), both through the existing overrides. biome
2.5.5 -> 2.5.7 alongside.

qs, ip-address and express-rate-limit were already ahead of what
Dependabot asked for. TypeScript 5.9 -> 7.0 and @types/node 24 -> 26 were
left alone; a security bump is no place for a compiler major.

2823 unit, 225 acceptance, 22 conformance runs, 194 routes. npm audit
clean with and without dev.
vite 6.4.1 -> 8.2.1 with @vitejs/plugin-vue 5.2.4 -> 6.0.8, which drags
postcss, picomatch, brace-expansion and yaml up with it; esbuild becomes
an explicit devDependency because vite 8 no longer bundles it.
php_codesniffer 3.13.5 -> 3.13.6 for CVE-2026-67434.

The vite major carries no enqueue risk, for an uncomfortable reason:
Assets.php loads assets/js/fchub-thank-you-admin.js, a hand-written file
with no build step, and no PHP anywhere references assets/dist. The Vue
app that produced ten of this repository's twenty advisories is wired to
nothing.

npm audit 5 -> 0. phpunit 23/23, phpcs clean. Pre-existing typecheck and
biome failures confirmed identical on the old tree; not this change.
vite 5.4.21 -> 8.2.1, @vitejs/plugin-vue 5.2.4 -> 6.0.8, esbuild 0.21.5
-> 0.28.1 as an explicit devDependency. npm audit 2 -> 0.

The rebuild changes every content hash, so the committed bundle churns.
Safe here because AdminMenu.php resolves entries through
assets/dist/.vite/manifest.json at runtime rather than hardcoding hashed
names — verified the emitted manifest still has the shape the PHP reads,
including the style.css pseudo-entry fallback, and that both files exist
on disk.
Element Plus 2.13.5 -> 2.14.3, Vue 3.5.30 -> 3.5.40, tiptap 3.28 ->
3.29.2, vue-router 5.0.3 -> 5.2.0, lucide 1.25 -> 1.28, plus the dev
group: vitest 3.2.7 -> 4.1.10, jsdom 26 -> 30, playwright 1.55 -> 1.62,
vite 8.0.16 -> 8.2.0. phpunit 13.0.5 -> 13.3.0.

The lockfile needed regenerating from scratch — an in-place install hit
an ERESOLVE between @tiptap/extension-link and starter-kit's pinned peer.
js-cookie needed nothing: the existing override already sits at 3.0.8,
above what Dependabot asked for.

349 vitest, 1883 phpunit / 11978 assertions, build clean, audit clean.
Bundle hashes churn because the Vue and Vite bumps change them.
checkout v4 -> v7, setup-node v4 -> v7, upload-artifact v4 -> v7,
download-artifact v4 -> v8, cache v4 -> v6, docker/login-action 4.5.2 ->
4.6.0, across nine workflows.

Five majors, so every changed callsite's inputs were read rather than
assumed: upload-artifact passes only name/path/if-no-files-found/
retention-days; download-artifact only name/path/run-id/github-token, no
reliance on the removed merge-multiple model; cache only path/key;
checkout fetch-depth and one sparse-checkout; setup-node node-version and
cache. All nine still parse.

Untested until a PR runs them — ci.yml triggers on pull_request only.
vue 3.5.30 -> 3.5.41, vite 8.0.16 -> 8.2.1, @vitejs/plugin-vue 6.0.5 ->
6.0.8. All inside existing caret ranges, so package.json is unchanged.

176 vitest, 612 phpunit. Deliberately no version bump and no touch to
versions.json — 1.3.0 was tagged from a branch that is not merged yet.
next 16.2.11 -> 16.3.0, postcss 8.5.8 -> 8.5.26, fumadocs-mdx 14.2.9 ->
15.2.2, fumadocs-core 16.6.10 -> 16.14.1, vite 7.3.1 -> 8.2.1,
@types/node 25 -> 26, typescript 5.9.3 -> 7.0.2.

fumadocs-mdx 15 was rejected once on a peer mismatch, then retried after
fumadocs-core moved and installed clean — that one bump closes js-yaml
and picomatch, five findings. TypeScript across two majors passes build,
lint and a raw tsc --noEmit; nothing here exercises the TS 7 changes.

Three majors reverted because they need source changes, not a lockfile:
lucide-react 1.x drops the Github and Twitter icons two pages import,
react-day-picker 10 reshapes ClassNames, recharts 3 breaks nine types in
chart.tsx. Those belong in their own change.

Of the 8 left, 4 are a postcss pinned exactly at 8.5.23 inside next's own
published package.json — not reachable from our lockfile, and 16.3.0 is
the newest stable. 223/223 pages build, biome clean, catalogue in sync.
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

The workflow contract tests pin action majors on purpose, and they did
exactly their job: bumping download-artifact to v8 broke assertions still
expecting v4. Updated all eight pins to match — checkout v7, setup-node
v7, upload-artifact v7, download-artifact v8, cache v6. 30/30 contract
tests pass.

jsdom goes back to 26.1.0. Thirty starts no forks worker on CI's Node 24
— undici's CacheStorage throws inside jsdom/lib/api.js and all 47 test
files fail to launch. It passed locally on Node 26, which is the whole
argument for opening the pull request before trusting a green local run.
No advisory drove that bump, so reverting costs nothing. 349 tests pass
again.
Node pins were a museum: 20, 22, 24 and an exact 24.13.0 scattered across
ten workflows. All now 26, and the two exact pins 26.7.0. Nothing old
kept.

That reverses yesterday's jsdom decision, correctly. Thirty failed on CI
Node 24 — undici's CacheStorage threw and no forks worker started — and
the engines range was never the problem, since '24' resolves to 24.19.0,
above its ^24.15.0 floor. It was a real Node 24 incompatibility. On 26 it
passes: 349 tests.

@modelcontextprotocol/conformance 0.2.0-alpha.10 -> alpha.11, which is
what sdk-current was failing on. It exists to catch exactly the pin a
previous pass declined to move. 2823 unit tests, 22 conformance runs,
zero failures.

fluentcart-mcp still declares engines >=24.0.0 — the published package
supports Node 24, but nothing now tests that floor.
The Node bump broke something the sed could not see. mcp-promote and
mcp-release do not merely set up Node — they assert the toolchain at
runtime, test node --version and npm --version, because the publishing
path carries provenance and a surprise interpreter is exactly what that
control exists to stop. Changing the setup-node pin alone would have left
those assertions demanding v24.13.0 and failed at release time, which is
the worst possible moment to find out.

So all of it moves together: setup-node 26.7.0, the runtime assertions to
v26.7.0, and npm to 11.19.0 — the version Node 26.7.0 actually ships,
checked against the Node dist index rather than assumed. mcp-release
installs its publishing CLI explicitly, so that pin moved from 11.15.0 to
11.19.0 too.

Four contract tests pinned the old values and now pin the new ones.
Between them and the workflow contracts they caught every stale pin in
this sweep, which is a good argument for their existence.

npm 12.0.2 is out and deliberately not taken. It is a major on the
Trusted Publishing path, where npm publish --provenance semantics live.
That wants its own change and a real release to prove it.

30/30 workflow contracts, 404/405 tooling — the one failure is the stale
gitignored dist-packages fixture from 31 July, absent in CI.
The contract pins a source-tree digest, so bumping conformance to
alpha.11 staled it and the package gate refused the branch. Two lines
move: the conformance version and the digest. Tool and category counts
are untouched at 291 and 20, so versions.json still agrees with it —
checked, not assumed.

A previous pass left this alone on the grounds that it is release
tooling. It is, but the gate runs on every pull request precisely so a
dependency change cannot reach a tag with a contract that describes a
different tree.
The manifest embeds the same source-tree digest the contract measures,
and a test exists solely to tie the two together — so regenerating one
without the other is a desync the gate catches, which it did. Manifest
regenerated: same two lines, digest and conformance version, still 25
advertised tools at v2.2.0.

One release-truth expectation moved to alpha.11 with it. The registry
fixtures under tests/fixtures/sdk keep saying alpha.10 on purpose: they
are a synthetic registry that exercises the selection logic, and editing
them to agree with reality would delete the thing they test.
Version Consistency has been red on main since the commit that added
GET /admin/fc-space-groups, which registered the route and updated
neither the reference table nor the count the checker pins. Both halves
now close: the table gains a row saying what the endpoint does and that
it returns an empty list when FluentCommunity is inactive — read off
DynamicOptionsController::fcSpaceGroups rather than guessed — and the
registered-route count moves 99 to 100.

Unrelated to the dependency work; fixed here because it was the only
remaining red check and it was never this branch's doing.
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.

1 participant