Commit Graph
10945 Commits
Author SHA1 Message Date
John Smith 9fe2829c72 chore(toolchain): pin Node 20 via .nvmrc to match CI 2026-09-22 21:17:36 -04:00
John Smith 3cf8c55652 feat(ai): hint missing API key on 401 provider errors 2026-09-22 21:17:18 -04:00
John Smith a2ab62bb75 feat(ai): configurable per-request timeout for BYOK endpoints 2026-09-22 21:14:22 -04:00
John Smith c259837e08 feat(ai): cancel in-flight model turns on suspend 2026-09-22 21:11:00 -04:00
John Smith d2c38753ef fix(ai): pass AbortSignal directly to axios in sendChatCompletion 2026-09-22 21:05:41 -04:00
John Smith 6a74a67c09 chore: record docs/HERETEK-ROADMAP.md fork divergence 2026-09-22 20:55:27 -04:00
John Smith 6d7edb4b6e docs: add Heretek roadmap and researched feature demand 2026-09-22 20:33:40 -04:00
John Smith 1367174ef4 fix: mark type-only imports so the editor dev build compiles
Babel keeps value-form named imports of Flow types (GLTF from
three/examples/jsm/loaders/GLTFLoader; User/Auth from firebase/auth),
and react-scripts sets strictExportPresence, so the dev server failed
to compile with 7 'export not found' errors (also present on upstream
master, which no CI job catches since nothing builds the editor
bundle).

Use inline 'type' qualifiers (existing repo convention) and record the
4 newly divergent upstream-owned paths in fork-divergence.json.
2026-09-22 20:28:08 -04:00
John Smith 48ed4e38d0 chore(maintenance): make fork divergence and static-analysis scope deliberate
Two problems made this fork expensive to maintain: scanner noise nobody
could act on, and divergence from upstream that nothing tracked.

Code scanning reported 3,518 open alerts. 3,449 were fallow findings and
2,399 of those sat in vendored bundles `.fallow.toml` never listed
(jolt-physics.wasm.js 436, box2djs/box2d.js 328, the Firebase SDK 655,
Recast, PeerJS, draco). Listing them plus raising the CRAP thresholds from
the defaults to evidence-based values takes fallow from 3,449 findings to
155, all in maintained code. The remaining 69 were CodeQL: 8 third-party
actions are now pinned to full commit SHAs with `# vN` comments (so
Dependabot keeps updating them) and all 10 workflows declare an explicit
least-privilege `permissions:` block.

SonarCloud's 2,845 open issues are mostly not this fork's code — 2,526 sit
in files byte-identical to upstream. The real defect was configuration:
~200 lines of `sonar.issue.ignore.multicriteria.e1..e88` in
.sonarcloud.properties, plus scripts/sonarcloud-apply-suppressions.sh, were
inert. That key is a Project Settings UI setting and cannot be read from
that file under automatic analysis, so two phases of remediation work
chased config the server never saw. Both are deleted; the exclusions that
do work are kept and extended. `sonar.test.inclusions` no longer declares
production source directories as test inclusions.

Divergence is now bounded and checked. `fork-divergence.json` is a
checked-in allowlist of the 111 modified, 51 fork-only and 7
upstream-missing paths, and `scripts/check-fork-divergence.js` fails CI on
divergence that is not listed or on stale entries. It reads upstream
through the GitHub trees API because 4ian/GDevelop is ~1.7GB and this runs
on every PR. Restoring Extensions/Physics3DBehavior/tests/
Physics3DRuntimeBehavior.spec.js — deleted by an earlier SonarCloud pass to
silence one rule — removes one entry each.

Repairs found along the way: every `// nosonar` marker sat on the line
before the statement SonarCloud flags, where the directive does nothing;
each is now on the exact reported line. Four garbled comment fragments left
in multiplayertools.ts by the same pass are gone. A two-line re-export shim
with no importers (AiGeneration/CustomAIClient.js) is deleted.

`scripts/sonarcloud-drift.js` now writes its outputs to $GITHUB_OUTPUT and
seeds its own baseline, so the weekly drift job's ceiling can actually fire;
it previously ran behind `continue-on-error` against a threshold that
predated the exclusions and was unreachable.

Root documentation collapses to MAINTENANCE.md. The three SonarCloud phase
plans and the Dependabot plan described steps that were proven impossible
and are deleted; AI_GAME_STUDIO_ASSESSMENT.md is a design record and stays.

Verified: newIDE/app 176/176 suites and 1,922 tests pass; GDevelop.js 33/33
suites and 1,177 tests pass; GDJS Karma 1,287 pass with the same 9
pre-existing failures (Firebase network tests) reproduced on a pristine
tree. check-format lists 37 files against the documented 41-file baseline,
so no new violations. Lockfile, drift and divergence guards all exit 0.
2026-09-22 20:01:28 -04:00
John Smith f72bb71f60 fix: align plan tool test with W11 dependsOn semantics
create_or_update_plan omits `dependsOn` when the caller did not send it
(08a49e2f5, W11), but the spec still expected it normalized to []. Lock
in both cases instead: omitted stays absent, provided is kept and
trimmed. This is the failure blocking PR #148 CI; the spec was stale on
master itself.
2026-09-22 17:29:03 -04:00
John Smith f34e40d4ee Merge remote-tracking branch 'origin/upstream-sync-2026-09-22' 2026-09-22 17:27:45 -04:00
John Smith 63e9df37b6 fix: unblock Karma engine suite and add useInstancing round-trip test
Closes the verification gap tracked in #146 for 08a49e2f5.

- Upgrade GDJS/tests karma stack (karma 6.4.4, karma-mocha 2,
  karma-chrome-launcher 3): the socket.io-parser ^4.2.7 override from
  186ae04ac forces socket.io 4.x, which is incompatible with karma 1.7
  ("SocketIO is not a constructor"). Supersedes #110.
- Guard process.env in FirebaseExtension.spec.js: uncaught
  ReferenceError in the browser aborts karma 6 runs.
- Fix stale tilemap culling test: 08a49e2f5 deliberately made nested
  tile maps draw in full (no wrong-window culling); the test still
  asserted the pre-remediation behavior.
- Add Model3DObjectConfiguration.spec.js: useInstancing set to true
  round-trips through C++ serialization; false default preserved.

Verified on Node 20.20.2 / Chrome Headless 153:
GDJS/tests 1287/1296 passed (3DCulling, Model3DInstancing and
tilemapCulling green; remaining failures are Firebase e2e without a
valid GD_TEST_FIREBASE_API_KEY and 1-ulp float-equality flakes in
untouched files). GDevelop.js Jest: 33/33 suites, 1177 passed.
2026-09-22 17:21:34 -04:00
John Smith 08a49e2f55 fix: remediate audit of studio pipeline, 3D culling, and instancing
16-reviewer audit of ae815f489 (103 findings) remediated in six groups.

1. Lazy THREE init (runtimeobject.ts): scratch Box3/Matrix4/Euler allocated on
   first use, so a 2D-only export (never loads three.js) boots.

2. Culling correctness: computeAABB uses |size|/2 half-extents and places the box
   at the true rotation pivot C' = P + R*(C-P); custom-object children union
   conservative boxes; the frustum is rebuilt in the boxes' space (right-multiply
   _threeGroup.matrixWorld) with a numeric cache incl. camera-Z; hide/cull route
   through setCullingVisible/applyRenderVisibility (no detached-carrier writes);
   custom-object children and nested tile maps no longer cull with a wrong window.

3. Studio pipeline wedge (Utils.js + Studio/*): lock release over all calls,
   working marks only editor calls, spawn failures reach the model, plan merge on
   objects (JSON.parse bug), one persistent LoopGuard with real call_id +
   re-arming + recordSuccess, RequestWriteGate self-retry + supersede-rejects,
   UseStudioRuntime fire-and-forget gate write + recomputed plan + sent check,
   FinalizeSubAgents terminal-'error' + executed-but-unsent + turn-cap + enriched
   report, send-returns-boolean, BYOK cache write-through, suspension cascade,
   turn-cap dispatch, stand-alone cannot spawn.

4. Instancing: useInstancing now serializes (C++); the pool grows without null.add
   and collapses deleted slots; the instance matrix is normalized
   (carrier * correction) and rewritten on rotation/hide; animated/skinned/morph/
   multi-mesh models rejected; per-slot shadows; layer moves re-acquire.

5. BYOK role enforcement: studioRoleId persisted and re-applied every turn (tools +
   prompt); dispatch filters tools outside the role; readOnly roles skip edit
   approval.

6. Warnings + Info: mutating-tool classification, hasOwnProperty role guards,
   cache-message merge, spawn arg caps, per-batch GDD note, fan-out cap, plan
   dependsOn-omission + caps + duplicate-id + fail-closed + trimmed ids, tilemap
   rotated/mirror bail + window margin + null-map guard, pool dispose wired to
   unloadScene, schema description required, plus doc/comment corrections.

Verified: engine builds clean; boot + computeAABB (13/13) + Model3DInstancePool
(9/9) harnesses pass; Jest green for src/AiGeneration + src/AI (175), CustomAIClient
(27, incl. the critical second-turn role regression), PlanStore (25),
FinalizeSubAgents (21), LoopGuard (18), RequestWriteGate (11), Roles (9).
2026-09-22 15:31:25 -04:00
John Smith ae815f489b feat(ai): local multi-agent game studio + engine culling and instancing
Answers the two questions the fork asked, then acts on both.

Assessment (AI_GAME_STUDIO_ASSESSMENT.md): a literal Anno-1800-scale 3D
city builder is not achievable on this engine - no instancing, no 3D
culling, Android is a Cordova WebView around the same HTML5 runtime, and a
15 MB per-resource cloud-build ceiling. A 2D isometric city builder of
Anno-1602/1701 scope is reachable today. The hosted backend already is a
multi-agent company; the BYOK path can reach none of it (no plan tool, no
sub-agent tool, no role prompts, no local spawner, no loop guard).

Studio (phases 2-5, 9-11), all under newIDE/app/src/AiGeneration/Studio/:
* Roles.js - manager/designer/developer/tester: prompts, exact tool
  subsets, read-only invariant, turn caps.
* PlanStore.js - create_or_update_plan is real under BYOK and returns the
  shape getLatestActivePlan/OrchestratorPlan already read; the dispatcher
  merges a new plan over the existing one so a re-plan cannot strip a field
  another writer set.
* SpawnSubAgents.js + customCreateSubAgentAiRequest - spawn_agent (the BYOK
  tool schema goes 29 -> 39 tools) and a real child AiRequest carrying the
  role's prompt and tool subset.
* FinalizeSubAgents.js + UseStudioRuntime.js - a finished child's report is
  written onto its parent's function_call_output and the plan task flips.
* RequestWriteGate.js - one gate owns writes to an AiRequest, with named
  block reasons and latest-wins per-request serialization.
* LoopGuard.js - a local circuit breaker (repeated identical calls, error
  storms, turn count) with a steer -> constrain ladder. Ported from
  chaitanyagiri/munder-difflin (MIT) src/main/breaker.ts, incl. its #377
  whole-arguments sha256 key; no MD source is vendored.
* One in-flight model turn per request id, and the two in-place mutators
  made whole-replace so a concurrent turn cannot discard them.

Engine (phases 6-8):
* 3D culling: gdjs.Object3DCulling shared AABB maths, a per-layer frustum
  cache, and a 3D branch in both _updateObjectsPreRender implementations.
  Capability-checked, because CustomRuntimeObject3D does not extend
  RuntimeObject3D.
* Instancing: opt-in Model3D "Use instancing" property + Model3DInstancePool,
  one InstancedMesh per (resource, material, layer) for single non-skinned
  meshes; every other model silently keeps the clone path.
* TileMap culling generalised to TileMap (not just SimpleTileMap) and to
  tilemaps nested in custom objects, with bounds clamped to the map.

Two bugs found by running the loop end-to-end rather than by tests: the
instance pool was page-global (handing out slots on a discarded scene's
mesh), and buildSubAgentReport read only `output_text` while the local path
emits `text`, so every local sub-agent reported "(no report)".
2026-09-22 11:19:22 -04:00
BillyOutlast ba375973ab docs: add AGENTS.md repository guidelines
Synthesize an agent-facing guide for this fork from four independent
read-only surveys of the source tree, test surface, build/config, and
scripts/docs, then verified against the checkout before commit.

Covers the eight required sections plus two additions specific to this
repository:

- Generated-file boundary table (libGD.js, glue.cpp, types.d.ts,
  locales/**, theme variables, codemod-frozen JsExtension.js) and the
  vendored list, since hand-editing those is the highest-frequency
  mistake here.
- Fork Divergence: the three concentrated upstream-conflict zones (BYOK
  AI client, client-side unlock switch, auto-updater feed) and the five
  BYOK paths the upstream-sync workflow protects by name - renaming or
  moving them silently disables the integrity guard.

Also records the measured red baseline on clean master, so a change is
not blamed for it: `cd GDJS && npm run check-format` lists 41 files and
`npm run check-types` reports 322 errors (305 THREE, 17 Spine/pixi).
Neither is gated by the fork's ci.yml, which runs both inside
newIDE/app only.

Verification: all cited paths confirmed present; every documented npm
script confirmed against its package.json; extension counts checked
against Extensions/CMakeLists.txt (48 dirs, 31 JsExtension.js, 17 C++).
2026-09-22 08:22:06 -04:00
heretek-sync-bot[bot] 403c1c3d4d chore(sync): sync upstream 4ian/GDevelop changes 2026-09-22 10:46:54 +00:00
BillyOutlast 5a0a22ed54 ci(upstream-sync): replace the false "read-only token" claim with the evidence
The step comment and the user-facing warning both asserted "org policy forces
a read-only GITHUB_TOKEN". That is wrong, and it was steering readers toward
buying a SYNC_PAT they do not need. Replaced with what was actually measured.

Verified by probe against this repo, all as app/github-actions with
secrets.GITHUB_TOKEN:
  REST POST /pulls                     -> OK (created a PR)
  gh pr create                         -> OK (created a PR)
  gh pr create on upstream-sync-*      -> OK (created a PR)

while the repo reports:
  default_workflow_permissions     = write
  can_approve_pull_request_reviews = true
  runtime grant                    = Contents:write + PullRequests:write
  git push with that token         = succeeds
  SYNC_PAT                         = not set

So the token can create PRs here; the failure is real but unexplained. The
comment now says so instead of blaming a policy that does not apply.

Failure behaviour is unchanged: the run still degrades to a compare URL
rather than failing. Only the explanation changed.
2026-09-21 22:36:20 -04:00
BillyOutlast 12fbe878c4 ci: remove diagnostic probes; correct the read-only-token claim; keep issues:write
Probe results (all from this repo, token = secrets.GITHUB_TOKEN, actor
app/github-actions):

  REST    POST /repos/{o}/{r}/pulls   => OK   (PR #142)
  GraphQL gh pr create                => OK   (PR #143)
  gh pr create on an existing
    upstream-sync-* branch            => OK   (PRs #144, #145)

So GITHUB_TOKEN CAN create pull requests here, by either API. The recorded
conclusion "org policy forces read-only GITHUB_TOKEN" is wrong:

  repo default_workflow_permissions     = write
  repo can_approve_pull_request_reviews = true
  runtime grant                         = Contents:write, PullRequests:write
  git push with the same token          = succeeds
  SYNC_PAT                              = not set (verified at runtime)

No SYNC_PAT is needed.

Kept issues:write, which the conflict path genuinely needs for
`gh issue create` and which the workflow never declared.

Also removes the stale in-workflow comment asserting the org-policy claim.
Still open: why `gh pr create` fails inside upstream-sync.yml but succeeds
from an equivalent probe. All probes are deleted; the difference is not the
token, the API, the branch, or the permissions block.
2026-09-21 22:32:07 -04:00
BillyOutlast 3cf4b7b372 ci: probe replicating the exact upstream-sync PR step (throwaway)
REST, GraphQL, and gh pr create all succeed from a probe with
secrets.GITHUB_TOKEN, but the real sync step still fails with
'GraphQL: Resource not accessible by integration'.

This replicates the exact step: same GH_TOKEN expression, same branch, same
call - then repeats it with the token unset/plain, to isolate whether the
SYNC_PAT expression or the branch name is responsible.
2026-09-21 22:28:58 -04:00
BillyOutlast cb94cef079 ci: grant issues:write to upstream-sync
The only permission difference between my successful probe run and the failing
sync run: the probe had Issues:write, the sync workflow did not.

The conflict path calls `gh issue create`, which is why issues:write is needed.
Adding it also restores parity with the probe, which created PRs fine via both
REST and GraphQL using the same GITHUB_TOKEN.
2026-09-21 22:26:07 -04:00
BillyOutlast a421dd3d53 ci(debug): log whether SYNC_PAT is configured (temporary)
Evidence so far:
  - GITHUB_TOKEN CAN create PRs here: REST PR #142 and gh pr create PR #143,
    both authored by app/github-actions
  - so 'org policy forces read-only GITHUB_TOKEN' is wrong
  - the only difference in the failing step is its GH_TOKEN expression:
      secrets.SYNC_PAT != '' && secrets.SYNC_PAT || secrets.GITHUB_TOKEN
  - repo secret list is empty, but ORG secrets are unreadable to me (403)

If an unreadable org-level SYNC_PAT exists and is empty/invalid, that
expression selects it and PR creation fails while the token itself is fine.

This prints only a boolean, never the value. Remove after the run.
2026-09-21 22:21:59 -04:00
BillyOutlast a673e2e288 ci: remove REST vs GraphQL probe (throwaway, answered)
Result: BOTH paths succeed when the step actually runs.
  REST    POST /pulls        => OK (PR #142)
  GraphQL gh pr create       => OK (PR #143)

So GITHUB_TOKEN CAN create pull requests in this repo, via either API. The
'org policy forces read-only GITHUB_TOKEN' conclusion is definitively wrong.
2026-09-21 22:21:18 -04:00
BillyOutlast d2478fab49 ci: probe REST vs GraphQL PR creation (throwaway)
Narrowing the real difference. My earlier probe used REST
(gh api -X POST /pulls) and succeeded - PR #141 was created. upstream-sync
uses gh pr create, which goes through GraphQL createPullRequest, and fails
with 'Resource not accessible by integration'.

This runs BOTH against this repo in one job and prints results to stdout,
since the step summary is not retrievable through the API.
2026-09-21 22:18:32 -04:00
BillyOutlast ac1904a937 ci: remove issue probe (flawed - it deleted the issue it created)
The probe ran 'gh issue delete' on cleanup, so absence of the issue proves
nothing about whether creation succeeded. Superseded by an end-to-end run of
the real workflow, which is the decisive test.
2026-09-21 22:14:09 -04:00
BillyOutlast 41ec9436bd ci: probe whether GITHUB_TOKEN can create issues (throwaway)
The PR probe proved GITHUB_TOKEN creates pull requests fine (PR #141,
author app/github-actions), so 'org policy forces read-only' is wrong for PRs.

upstream-sync's CONFLICT path calls gh issue create, not gh pr create, and the
repo's earlier probe tested issue creation. This isolates whether issue
permissions differ from pull-request permissions.
2026-09-21 22:12:20 -04:00
BillyOutlast 4fab9d74e0 ci: remove token capability probe (throwaway)
Probe result: GITHUB_TOKEN CAN create pull requests in this repo.

  step 2 contents:write push        => ok
  step 3 REST POST /pulls           => ok   (created PR #141)
  step 4 gh pr create               => ok
  PR #141 author                    => app/github-actions

So the recorded conclusion 'org policy forces read-only GITHUB_TOKEN' is
WRONG, and no SYNC_PAT is needed. The upstream-sync failure has a different,
still-unidentified cause.
2026-09-21 22:11:30 -04:00
BillyOutlast ea186bf8bd ci: add throwaway probe to diagnose GITHUB_TOKEN PR-creation failure
Settles a misdiagnosis. The recorded conclusion was "org policy forces
read-only GITHUB_TOKEN", but the evidence does not support it:

  repo default_workflow_permissions     = write
  repo can_approve_pull_request_reviews = true
  workflow permissions block            = contents:write, pull-requests:write
  token granted at runtime              = Contents:write, PullRequests:write
  git push with that same token         = SUCCEEDS

Yet `gh pr create` fails with "Resource not accessible by integration
(createPullRequest)". So "read-only" is wrong and the real cause is unknown.

The probe isolates each capability so the failing one is unambiguous:
  1. token identity (GET /user) and effective repo permissions
  2. contents:write push (control - known to work)
  3. REST POST /pulls (the API gh uses underneath)
  4. `gh pr create` (the exact command upstream-sync runs)

workflow_dispatch only, so it cannot fire on push. Touches nothing on master:
it pushes a probe/* branch and force-deletes it, plus closes any PR it opened.
Delete this file once the run summary has been read.
2026-09-21 22:08:46 -04:00
960167c27f sync: upstream 4ian/GDevelop (3 commits: external layouts, translations, gameplay-test fix) (#140)
* Add support for external layouts for agents (#9121)

(cherry picked from commit 09685bfa88)

* [Auto PR] Update translations (#9122)

(cherry picked from commit c6d0921103)

* Fix gameplay test being mistakenly erased and improve layer error messages (#9124)

(cherry picked from commit b9109cfbaa)

---------

Co-authored-by: Florian Rival <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-09-21 21:51:01 -04:00
BillyOutlast 9e9f1f99ca docs: land the final remediation plan (rescued before deleting its branch) (#139)
The plan document on master is stale: four follow-up doc commits were pushed to
`chore/ci-remediation` after PR #124 had already been squash-merged, so they
never reached master. The branch is about to be deleted, so rescue them here.

What master was missing:

- the corrected `Upload SARIF` analysis. Master still says "three distinct
  bugs"; there were **four**. #137's per-run category stamping fixed the
  collision, then code scanning rejected the file on content
  (`locationFromSarifResult: expected at least one location`) because the
  `fallow/dupes` run's 239 results carry no `locations`. #138 dropped them.
- the verified acceptance table (all six criteria, with evidence) in place of
  the old unverified numbered list.
- the before/after `Outcome` table.

Only the document is taken. The rest of that branch is stale and would revert
13 merged PRs — e.g. it restores `newIDE/app/patches/wavesurfer.js+7.12.6.patch`
which was deliberately deleted, and reverts `dotenv` to ^18.0.0. Verified the
diff touches no code: `git diff master -- . ':!DEPENDABOT*'` is empty.
2026-09-21 21:41:07 -04:00
BillyOutlast 9f30b8d9ea ci(fallow): drop location-less SARIF results so code scanning accepts the upload (#138)
Fourth and final failure in this job. #137 fixed the category collision (that
step now succeeds — the log shows "Give each SARIF run a unique category" ✔ and
only `Upload SARIF` failing), but code scanning then rejected the file on
content:

  ##[error]Code Scanning could not process the submitted SARIF file:
  locationFromSarifResult: expected at least one location, ...

Cause: fallow's `fallow/dupes` run reports code duplication as 239 results, and
**none of them carry a `locations` array** — there is no file/line for code
scanning to annotate:

  run[0]: results=17    without locations=0
  run[1]: results=239   without locations=239     <- fallow/dupes
  run[2]: results=400   without locations=0

Code scanning requires at least one location per result, so one bad run fails
the whole upload. Drop those results and the run itself when nothing usable
remains; keep the location-bearing findings.

Also drops the now-redundant `category: fallow` input from #134 — it applies to
the whole upload, not to runs inside the file, so it never addressed the actual
collision.

Verified against real output from the pinned CLI ([email protected].0, 3 runs,
426 KB):

  runs: 3 -> 2; dropped 239 location-less result(s);
  categories: fallow/run-0, fallow/run-1
  unique categories: true; results without locations: 0; results kept: 417

Duplication findings are not lost from the project — they remain in the
`audit` job's summary and the archived fallow.log. They simply cannot be
represented as code-scanning alerts.
2026-09-21 21:21:22 -04:00
BillyOutlast bff8eaf40e ci(fallow): stamp a unique category on each SARIF run (#137)
Corrects the diagnosis in #134. That PR added `category: fallow` to the upload
step, but `Upload SARIF` still fails on master with the same message:

  ##[error]The CodeQL Action does not support uploading multiple SARIF runs
  with the same category.

The `category:` input applies to the whole upload, not to runs inside the file.
The real cause is in the SARIF fallow produces: it emits THREE runs and two of
them carry no `automationDetails`, so they both fall back to the default
category and collide with each other.

  run[0] automationDetails=None
  run[1] automationDetails={'id': 'fallow/dupes'}
  run[2] automationDetails=None

Code scanning keys analyses on each run's `automationDetails.id`, so the fix is
to stamp a distinct id on every run before uploading.

Verified against real output from the pinned CLI (`[email protected].0`, 426 KB, 3
runs): the step rewrites them to `fallow/run-0`, `fallow/run-1`,
`fallow/run-2` — three unique ids. The absent-file path (the failure mode #124
fixed) exits 0 with a notice rather than crashing, since a scan that produced no
SARIF should not mask the original error.
2026-09-21 21:14:12 -04:00
dependabot[bot]andBillyOutlast ece6135dc9 Bump the weekly-deps group across 1 directory with 14 updates (#135)
* Bump the weekly-deps group across 1 directory with 14 updates

Bumps the weekly-deps group with 14 updates in the /newIDE/app directory:

| Package | From | To |
| --- | --- | --- |
| [@material-ui/core](https://github.com/mui-org/material-ui/tree/HEAD/packages/material-ui) | `4.11.0` | `4.12.4` |
| [@material-ui/icons](https://github.com/mui-org/material-ui/tree/HEAD/packages/material-ui-icons) | `4.9.1` | `4.11.3` |
| [baseline-browser-mapping](https://github.com/web-platform-dx/baseline-browser-mapping) | `2.11.23` | `2.11.25` |
| [classnames](https://github.com/JedWatson/classnames) | `2.2.5` | `2.5.1` |
| [fontfaceobserver](https://github.com/bramstein/fontfaceobserver) | `2.0.13` | `2.3.0` |
| [pixi.js-legacy](https://github.com/pixijs/pixijs) | `7.4.2` | `7.4.3` |
| [posthog-js](https://github.com/PostHog/posthog-js) | `1.275.2` | `1.434.2` |
| [react-color](https://github.com/casesandberg/react-color) | `2.13.8` | `2.19.3` |
| [react-measure](https://github.com/souporserious/react-measure) | `2.3.0` | `2.5.2` |
| [react-virtualized](https://github.com/bvaughn/react-virtualized) | `9.21.1` | `9.22.6` |
| [wavesurfer.js](https://github.com/katspaugh/wavesurfer.js) | `7.12.6` | `7.12.12` |
| [@storybook/addons](https://github.com/storybookjs/storybook/tree/HEAD/code/deprecated/addons) | `7.4.6` | `7.6.17` |
| [iso-639-1](https://github.com/meikidd/iso-639-1) | `3.1.5` | `3.1.6` |
| [serve-handler](https://github.com/vercel/serve-handler) | `6.1.6` | `6.1.7` |



Updates `@material-ui/core` from 4.11.0 to 4.12.4
- [Release notes](https://github.com/mui-org/material-ui/releases)
- [Changelog](https://github.com/mui/material-ui/blob/v4.12.4/CHANGELOG.md)
- [Commits](https://github.com/mui-org/material-ui/commits/v4.12.4/packages/material-ui)

Updates `@material-ui/icons` from 4.9.1 to 4.11.3
- [Release notes](https://github.com/mui-org/material-ui/releases)
- [Changelog](https://github.com/mui/material-ui/blob/v4.11.3/CHANGELOG.md)
- [Commits](https://github.com/mui-org/material-ui/commits/v4.11.3/packages/material-ui-icons)

Updates `baseline-browser-mapping` from 2.11.23 to 2.11.25
- [Release notes](https://github.com/web-platform-dx/baseline-browser-mapping/releases)
- [Commits](https://github.com/web-platform-dx/baseline-browser-mapping/compare/v2.11.23...v2.11.25)

Updates `classnames` from 2.2.5 to 2.5.1
- [Changelog](https://github.com/JedWatson/classnames/blob/main/HISTORY.md)
- [Commits](https://github.com/JedWatson/classnames/compare/v2.2.5...v2.5.1)

Updates `fontfaceobserver` from 2.0.13 to 2.3.0
- [Commits](https://github.com/bramstein/fontfaceobserver/compare/v2.0.13...v2.3.0)

Updates `pixi.js-legacy` from 7.4.2 to 7.4.3
- [Release notes](https://github.com/pixijs/pixijs/releases)
- [Commits](https://github.com/pixijs/pixijs/compare/v7.4.2...v7.4.3)

Updates `posthog-js` from 1.275.2 to 1.434.2
- [Release notes](https://github.com/PostHog/posthog-js/releases)
- [Changelog](https://github.com/PostHog/posthog-js/blob/main/CHANGELOG.md)
- [Commits](https://github.com/PostHog/posthog-js/compare/[email protected]@1.434.2)

Updates `react-color` from 2.13.8 to 2.19.3
- [Release notes](https://github.com/casesandberg/react-color/releases)
- [Commits](https://github.com/casesandberg/react-color/commits)

Updates `react-measure` from 2.3.0 to 2.5.2
- [Changelog](https://github.com/souporserious/react-measure/blob/main/CHANGELOG.md)
- [Commits](https://github.com/souporserious/react-measure/compare/v2.3.0...v2.5.2)

Updates `react-virtualized` from 9.21.1 to 9.22.6
- [Release notes](https://github.com/bvaughn/react-virtualized/releases)
- [Changelog](https://github.com/bvaughn/react-virtualized/blob/master/CHANGELOG.md)
- [Commits](https://github.com/bvaughn/react-virtualized/compare/9.21.1...9.22.6)

Updates `wavesurfer.js` from 7.12.6 to 7.12.12
- [Release notes](https://github.com/katspaugh/wavesurfer.js/releases)
- [Changelog](https://github.com/katspaugh/wavesurfer.js/blob/main/CHANGELOG.md)
- [Commits](https://github.com/katspaugh/wavesurfer.js/compare/7.12.6...7.12.12)

Updates `@storybook/addons` from 7.4.6 to 7.6.17
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/v7.6.17/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v7.6.17/code/deprecated/addons)

Updates `iso-639-1` from 3.1.5 to 3.1.6
- [Release notes](https://github.com/meikidd/iso-639-1/releases)
- [Changelog](https://github.com/meikidd/iso-639-1/blob/master/CHANGELOG.md)
- [Commits](https://github.com/meikidd/iso-639-1/commits/v3.1.6)

Updates `serve-handler` from 6.1.6 to 6.1.7
- [Release notes](https://github.com/vercel/serve-handler/releases)
- [Commits](https://github.com/vercel/serve-handler/compare/6.1.6...6.1.7)

---
updated-dependencies:
- dependency-name: "@material-ui/core"
  dependency-version: 4.12.4
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: weekly-deps
- dependency-name: "@material-ui/icons"
  dependency-version: 4.11.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: weekly-deps
- dependency-name: baseline-browser-mapping
  dependency-version: 2.11.25
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: weekly-deps
- dependency-name: classnames
  dependency-version: 2.5.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: weekly-deps
- dependency-name: fontfaceobserver
  dependency-version: 2.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: weekly-deps
- dependency-name: pixi.js-legacy
  dependency-version: 7.4.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: weekly-deps
- dependency-name: posthog-js
  dependency-version: 1.434.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: weekly-deps
- dependency-name: react-color
  dependency-version: 2.19.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: weekly-deps
- dependency-name: react-measure
  dependency-version: 2.5.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: weekly-deps
- dependency-name: react-virtualized
  dependency-version: 9.22.6
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: weekly-deps
- dependency-name: wavesurfer.js
  dependency-version: 7.12.12
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: weekly-deps
- dependency-name: "@storybook/addons"
  dependency-version: 7.6.17
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: weekly-deps
- dependency-name: iso-639-1
  dependency-version: 3.1.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: weekly-deps
- dependency-name: serve-handler
  dependency-version: 6.1.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: weekly-deps
...

Signed-off-by: dependabot[bot] <[email protected]>

* chore: merge master, regenerate newIDE/app lockfile, align spine pixi override

Two fixes on top of the Dependabot bump.

1. Lockfile desync. Dependabot's regeneration left 51 missing and 15 invalid
   entries (@pixi/*, @firebase/*), so `npm ci` hard-failed before any test ran.
   Regenerated against master.

2. The `@esotericsoftware/spine-pixi-v7` override pinned @pixi/* to 7.4.2 while
   this PR moves pixi.js-legacy to 7.4.3, producing a mixed-generation runtime
   (spine's peerDependencies are @pixi/* ^7.2.4). Aligned the override to 7.4.3;
   the tree now resolves a single @pixi/core generation.

Also confirms the grouping fix from #124 works: this PR is the safe subset of
#123. three, react-monaco-editor, flow-bin and spine-pixi-v7 are no longer
absorbed into the weekly group and stay at their master versions.

Verified: npm ci --dry-run rc=0 with 0 sync errors; check-lockfiles.js exits 0;
adm-zip resolves 0.6.1; the security override floors (js-yaml, qs, fast-uri)
are newer than master's, not regressions.

* fix(app): drop the wavesurfer patch obsoleted by 7.12.8

This PR moves wavesurfer.js 7.12.6 -> 7.12.12, and `patch-package` then fails:

  **ERROR** Failed to apply patch for package wavesurfer.js at path
      node_modules/wavesurfer.js
  This error was caused because wavesurfer.js has changed since you made the
  patch file for it.

The patch is version-pinned (`wavesurfer.js+7.12.6.patch`) and rewrote
`container instanceof HTMLElement` to also accept any `nodeType === 1` node, so
that a container from another realm (an iframe) would be accepted. Upstream
fixed exactly that in 7.12.8 — "fix: accept container elements from other
realms (iframes)" (#4319) — and 7.12.12 ships the equivalent check:

  t instanceof HTMLElement || "object" == typeof t && null !== t &&
  t.nodeType === Node.ELEMENT_NODE && "object" == typeof t.style

So the patch is obsoleted, not merely broken. Removing it, rather than
regenerating it, is the correct fix: keeping it would re-apply a workaround for
a bug that no longer exists and keep re-breaking on every wavesurfer bump.

Verified:
- patch applies at 7.12.6 (✔) and fails at 7.12.12 — reproduced in a scratch
  install with only the patch file present
- with the patch removed, the full CI install chain succeeds (rc=0):
  `patch-package && cd ../../GDJS && npm install && ... import-resources`,
  all five remaining patches ✔, theme resources generated
- npm ci --dry-run: rc=0, 0 sync errors

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: BillyOutlast <[email protected]>
2026-09-21 21:14:05 -04:00
dependabot[bot]andBillyOutlast d5218282fe Bump dotenv from 18.0.0 to 18.0.1 in /newIDE/electron-app/app in the weekly-deps group (#127)
* Bump dotenv in /newIDE/electron-app/app in the weekly-deps group

Bumps the weekly-deps group in /newIDE/electron-app/app with 1 update: [dotenv](https://github.com/motdotla/dotenv).


Updates `dotenv` from 18.0.0 to 18.0.1
- [Changelog](https://github.com/motdotla/dotenv/blob/master/CHANGELOG.md)
- [Commits](https://github.com/motdotla/dotenv/compare/v18.0.0...v18.0.1)

---
updated-dependencies:
- dependency-name: dotenv
  dependency-version: 18.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: weekly-deps
...

Signed-off-by: dependabot[bot] <[email protected]>

* fix(lockfile): regenerate newIDE/electron-app/app lockfile against master

Dependabot's regeneration for dotenv 18.0.0 -> 18.0.1 dropped hoisted peer dependencies,
leaving the lockfile out of sync with package.json (npm ci hard-fails).
Restored master's lockfile and reapplied the bump; see #136 for the
root cause and evidence.

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: BillyOutlast <[email protected]>
2026-09-21 21:03:48 -04:00
dependabot[bot]andBillyOutlast 6833fd9877 Bump dotenv from 18.0.0 to 18.0.1 in /newIDE/electron-app in the weekly-deps group (#126)
* Bump dotenv in /newIDE/electron-app in the weekly-deps group

Bumps the weekly-deps group in /newIDE/electron-app with 1 update: [dotenv](https://github.com/motdotla/dotenv).


Updates `dotenv` from 18.0.0 to 18.0.1
- [Changelog](https://github.com/motdotla/dotenv/blob/master/CHANGELOG.md)
- [Commits](https://github.com/motdotla/dotenv/compare/v18.0.0...v18.0.1)

---
updated-dependencies:
- dependency-name: dotenv
  dependency-version: 18.0.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: weekly-deps
...

Signed-off-by: dependabot[bot] <[email protected]>

* fix(lockfile): regenerate newIDE/electron-app lockfile against master

Dependabot's regeneration for dotenv 18.0.0 -> 18.0.1 dropped hoisted peer dependencies,
leaving the lockfile out of sync with package.json (npm ci hard-fails).
Restored master's lockfile and reapplied the bump; see #136 for the
root cause and evidence.

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: BillyOutlast <[email protected]>
2026-09-21 21:03:42 -04:00
dependabot[bot]andBillyOutlast 53e6c68604 Bump patch-package from 6.5.1 to 8.0.1 in /GDJS (#129)
* Bump patch-package from 6.5.1 to 8.0.1 in /GDJS

Bumps [patch-package](https://github.com/ds300/patch-package) from 6.5.1 to 8.0.1.
- [Release notes](https://github.com/ds300/patch-package/releases)
- [Changelog](https://github.com/ds300/patch-package/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ds300/patch-package/commits)

---
updated-dependencies:
- dependency-name: patch-package
  dependency-version: 8.0.1
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>

* fix(lockfile): regenerate GDJS lockfile against master

Dependabot's regeneration for patch-package 6.5.1 -> 8.0.1 dropped hoisted peer dependencies,
leaving the lockfile out of sync with package.json (npm ci hard-fails).
Restored master's lockfile and reapplied the bump; see #136 for the
root cause and evidence.

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: BillyOutlast <[email protected]>
2026-09-21 21:03:34 -04:00
dependabot[bot]andBillyOutlast f4d96173f8 Bump @types/node from 26.6.1 to 26.6.2 in /GDJS in the weekly-deps group (#128)
* Bump @types/node from 26.6.1 to 26.6.2 in /GDJS in the weekly-deps group

Bumps the weekly-deps group in /GDJS with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@types/node` from 26.6.1 to 26.6.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 26.6.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: weekly-deps
...

Signed-off-by: dependabot[bot] <[email protected]>

* fix(lockfile): regenerate GDJS lockfile against master

Dependabot's regeneration for @types/node 26.6.1 -> 26.6.2 dropped hoisted peer dependencies,
leaving the lockfile out of sync with package.json (npm ci hard-fails).
Restored master's lockfile and reapplied the bump; see #136 for the
root cause and evidence.

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: BillyOutlast <[email protected]>
2026-09-21 21:03:29 -04:00
dependabot[bot]andBillyOutlast e0506db9ce Bump @types/node from 26.6.1 to 26.6.2 in /GDevelop.js in the weekly-deps group (#130)
* Bump @types/node in /GDevelop.js in the weekly-deps group

Bumps the weekly-deps group in /GDevelop.js with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@types/node` from 26.6.1 to 26.6.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 26.6.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: weekly-deps
...

Signed-off-by: dependabot[bot] <[email protected]>

* chore: merge master and regenerate GDevelop.js lockfile

Dependabot's lockfile dropped hoisted peer dependencies; regenerated
against master so npm ci resolves. Root cause in #136.

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: BillyOutlast <[email protected]>
2026-09-21 21:03:25 -04:00
BillyOutlast 2a78c8132a ci(fallow): give the SARIF upload a category so it stops colliding with CodeQL (#134)
Follow-up to #124. That PR fixed the flag error (`--output` is an alias of
`--format`, so `--format sarif --output fallow.sarif` aborted and no file was
written) — `Run fallow full scan` now succeeds on master and does produce
fallow.sarif. The next step then failed instead:

  ##[error]The CodeQL Action does not support uploading multiple SARIF runs
  with the same category. Please update your workflow to upload a single run
  per category.

Code scanning keys analyses by `category`, and with no explicit category this
upload lands in the same default bucket as CodeQL's own run for the same
commit. Setting `category: fallow` keeps the two separable and lets the upload
complete.

Verified against the action's own input schema: `category` is an optional
string used "by Code Scanning for matching the analyses".
2026-09-21 21:03:20 -04:00
dependabot[bot] 30d9025bbf Bump grunt-contrib-clean from 1.1.0 to 2.0.1 in /GDevelop.js (#131)
Bumps [grunt-contrib-clean](https://github.com/gruntjs/grunt-contrib-clean) from 1.1.0 to 2.0.1.
- [Release notes](https://github.com/gruntjs/grunt-contrib-clean/releases)
- [Changelog](https://github.com/gruntjs/grunt-contrib-clean/blob/main/CHANGELOG)
- [Commits](https://github.com/gruntjs/grunt-contrib-clean/compare/v1.1.0...v2.0.1)

---
updated-dependencies:
- dependency-name: grunt-contrib-clean
  dependency-version: 2.0.1
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-21 21:00:20 -04:00
dependabot[bot] a042c7793f Bump extend from 2.0.2 to 3.0.2 in /GDevelop.js (#132)
Bumps [extend](https://github.com/justmoon/node-extend) from 2.0.2 to 3.0.2.
- [Changelog](https://github.com/justmoon/node-extend/blob/main/CHANGELOG.md)
- [Commits](https://github.com/justmoon/node-extend/compare/v2.0.2...v3.0.2)

---
updated-dependencies:
- dependency-name: extend
  dependency-version: 3.0.2
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-21 21:00:14 -04:00
dependabot[bot] e8f233aa8b Bump mocha from 1.21.5 to 12.0.2 in /GDJS/tests (#133)
Bumps [mocha](https://github.com/mochajs/mocha) from 1.21.5 to 12.0.2.
- [Release notes](https://github.com/mochajs/mocha/releases)
- [Changelog](https://github.com/mochajs/mocha/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mochajs/mocha/compare/1.21.5...v12.0.2)

---
updated-dependencies:
- dependency-name: mocha
  dependency-version: 12.0.2
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-21 21:00:08 -04:00
BillyOutlast a8a82aeb76 ci: fix fallow SARIF upload, upstream-sync token dead end, guard coverage; refresh vuln docs (#124)
* ci: fix fallow SARIF, upstream-sync token dead end, guard coverage; refresh vuln docs

Four independent defects found while reviewing the open Dependabot queue.

fallow.yml
- `--format` and `--output` are the SAME option (`--output` is a documented
  alias of `--format`), so `--format sarif --output fallow.sarif` aborted with
  "the argument '--format <FORMAT>' cannot be used multiple times" and never
  wrote the file. The following `upload-sarif` step then failed with
  "Path does not exist: fallow.sarif", reddening `Fallow full scan` on master
  and on every PR. Use `--output-file` for the path.
- Pin the CLI to 3.27.0. A bare `npx fallow` resolves the `latest` dist-tag at
  run time and was observed returning 3.3.0 on one run and 3.27.0 on another,
  so the full scan could silently disagree with the `audit` job (which pins
  3.27.0 through the action's `version:` input).

upstream-sync.yml
- Org policy forces a read-only GITHUB_TOKEN and no SYNC_PAT secret exists, so
  `gh pr create` can never succeed ("Resource not accessible by integration")
  and the run failed with exit 1 every day. The branch is already pushed by
  that point, so degrade to a warning plus a ready-to-click compare URL in the
  step summary instead of failing.

check-lockfiles.js
- `newIDE/visual-tests/package-lock.json` existed on disk but was absent from
  the guard's list (10 lockfiles, 9 guarded). Added.

dependabot.yml
- Drop the `ignore:` block pinning electron to 32.x. Both manifests are now on
  the current release line (newIDE/electron-app 44.4.3, GDJS/Runtime/Electron
  44.3.0), so the block only suppressed legitimate updates.
- `exclude-patterns` on the newIDE/app weekly group: for 0.x packages a
  "minor" bump is breaking by semver convention, so the group silently carried
  migrations like three 0.160->0.186 and spine-pixi-v7 4.2->4.3 alongside real
  patch bumps. One such group PR grew into a 19-package migration.
- Raise newIDE/app's `open-pull-requests-limit` 5 -> 10; 6 PRs are already
  open there, so new ones were being suppressed at the source.

KNOWN_VULNS.md
- Rewritten against the live API and the manifests. The previous revision
  claimed the fork stays on electron 32.x with 47 advisories (it is on 44.4.3),
  and that all non-electron vulnerabilities were remediated (the API reports
  49 open alerts: 22 high, 25 medium, 2 low, across 18 packages).
- Documented two guard gaps: the `tar` floor (`< 6.2.1`) is bypassed by the
  guard's same-major rule while advisories cover `<= 7.5.17`, and
  newIDE/visual-tests was unguarded.
- Recorded the four no-patch advisories as accepted risk.

DEPENDABOT_PR_REMEDIATION_PLAN.md
- Full review of the 32 open PRs: 6 root causes, all reproduced locally, with
  fixes verified before being proposed.

* fix(deps): repair three lockfiles already desynced on master; gate lockfile sync in CI

`npm ci` hard-fails when package.json and package-lock.json disagree, but CI
only installed the directories some later job happened to need. Three lockfiles
had rotted on master without anything noticing:

  GDJS                        16 missing packages (@pixi/* 7.4.3)
  newIDE/electron-app/app      6 missing + 3 invalid (electron 44.4.3, @electron/get)
  SharedLibs/TileMapHelper    36 missing + 2 invalid (@webassemblyjs/*, terser)

Each only failed the moment someone tried to install in that directory — which
is how the GDJS one stayed invisible while PR #121 was being reviewed for an
unrelated reason.

Regenerated all three with `npm install --package-lock-only`. All ten manifests
now install clean under `npm ci --dry-run`:

  GDevelop.js GDJS GDJS/tests newIDE/app newIDE/electron-app
  newIDE/electron-app/app newIDE/web-app newIDE/visual-tests
  SharedLibs/TileMapHelper SharedLibs/ThreeAddons      -> rc=0, 0 sync errors

Added a `lockfile-sync` matrix job over all ten directories so drift fails on
the PR that causes it. `--ignore-scripts` keeps postinstall hooks
(patch-package, import-resources) out of it — the job only asserts that the
lockfile resolves.

`node scripts/security/check-lockfiles.js` still exits 0.

* fix(deps): bump adm-zip 0.6.0 -> 0.6.1, closing 2 high advisories

`[email protected]` is vulnerable to GHSA-7q85-xj36-vmfc (high, patched in 0.6.1).
It is a *direct* dependency declared as `^0.6.0` in both manifests, so 0.6.1 was
already permitted — the lockfiles were simply pinned at the vulnerable 0.6.0 and
never re-resolved.

Verified the overrides already present in both manifests (`^0.6.0`) are harmless
here: a fresh resolution with or without them yields 0.6.1. Raising the override
to `^0.6.1` is NOT the fix — npm rejects it with EOVERRIDE because the override
would conflict with the direct dependency. Regenerating is the correct fix.

  newIDE/app/package-lock.json          adm-zip 0.6.0 -> 0.6.1
  newIDE/electron-app/package-lock.json adm-zip 0.6.0 -> 0.6.1

Closes 2 of the 22 open high-severity alerts. The remaining `adm-zip` medium
advisory (GHSA-vwc7-r8mq-g2x9) has no patch and stays documented as accepted
risk in KNOWN_VULNS.md.

All ten manifests verified: `npm ci --dry-run` rc=0, 0 sync errors, and
`node scripts/security/check-lockfiles.js` exits 0.

* docs: record execution status for the PR remediation plan

Queue 32 -> 25 open; 8 merged. Adds the evidence used to justify each merge,
the repo fixes landed in PR #124, the three master lockfiles found already
desynced (GDJS, newIDE/electron-app/app, SharedLibs/TileMapHelper) and the
adm-zip 0.6.0 -> 0.6.1 bump that closed 2 high advisories.

Also records the rebase mechanics blocker: PRs 18/26/37/39/40/104 do not move
on '@dependabot rebase' because they were edited by hand; only #40 reports it.

* Merge master into chore/ci-remediation

Master advanced 10 merges (our own dependency PRs), so the lockfiles this
branch regenerated were stale against it. The merge reverted
newIDE/electron-app/package-lock.json to master's pre-regeneration copy;
regenerated it again (adm-zip stays 0.6.1).

All ten manifests verified in the merged state: npm ci --dry-run rc=0,
0 sync errors, guard exits 0.

* ci: run lockfile-sync as one job, not a 10-way matrix

Each matrix entry was a dry-run resolve taking a few seconds, so the 10-way
matrix bought ~30s of wall clock at the cost of 10 runners. The queue
contention that produced was starving the slower build-libgd and Jest jobs,
which dominate the workflow anyway.

Now a single job loops the same ten directories, continues past a failure so
one run reports every drifted manifest, and exits 1 at the end. Verified both
paths locally: on a good tree it prints "All lockfiles in sync." and exits 0;
with one drifted manifest it prints the per-directory ❌ with the npm
Missing:/Invalid: lines, keeps checking the rest, and exits 1.
2026-09-21 20:51:37 -04:00
dependabot[bot]andBillyOutlast 78bb74b3a0 Bump grunt-contrib-compress from 1.6.0 to 2.0.0 in /GDevelop.js (#26)
* Bump grunt-contrib-compress from 1.6.0 to 2.0.0 in /GDevelop.js

Bumps [grunt-contrib-compress](https://github.com/gruntjs/grunt-contrib-compress) from 1.6.0 to 2.0.0.
- [Release notes](https://github.com/gruntjs/grunt-contrib-compress/releases)
- [Changelog](https://github.com/gruntjs/grunt-contrib-compress/blob/main/CHANGELOG)
- [Commits](https://github.com/gruntjs/grunt-contrib-compress/commits/v2.0.0)

---
updated-dependencies:
- dependency-name: grunt-contrib-compress
  dependency-version: 2.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>

* fix(deps): pin adm-zip >=0.6.0 in GDevelop.js so the lockfile guard passes

grunt-contrib-compress 1.6.0 -> 2.0.0 pulls [email protected] transitively, which
trips the lockfile security guard:

  GDevelop.js/package-lock.json: [email protected] matches < 0.6.0

master's GDevelop.js does not carry adm-zip at all, so the override is inert
there (verified: regenerating master with the override present yields no adm-zip
entry). With the bump applied it resolves 0.6.1 and the guard is clean.

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: BillyOutlast <[email protected]>
2026-09-21 20:42:41 -04:00
dependabot[bot]andBillyOutlast f0963134d1 Bump chokidar from 4.0.3 to 5.0.0 in /newIDE/electron-app/app (#114)
Bumps [chokidar](https://github.com/paulmillr/chokidar) from 4.0.3 to 5.0.0.
- [Release notes](https://github.com/paulmillr/chokidar/releases)
- [Commits](https://github.com/paulmillr/chokidar/compare/4.0.3...5.0.0)

---
updated-dependencies:
- dependency-name: chokidar
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: BillyOutlast <[email protected]>
2026-09-21 20:36:38 -04:00
dependabot[bot] 73254cb799 Bump prettier from 1.15.3 to 3.9.8 in /newIDE/electron-app (#116)
Bumps [prettier](https://github.com/prettier/prettier) from 1.15.3 to 3.9.8.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/1.15.3...3.9.8)

---
updated-dependencies:
- dependency-name: prettier
  dependency-version: 3.9.8
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-21 20:31:55 -04:00
dependabot[bot] 11d32cf3e1 Bump archiver from 2.1.1 to 8.0.0 in /newIDE/electron-app/app (#115)
Bumps [archiver](https://github.com/archiverjs/node-archiver) from 2.1.1 to 8.0.0.
- [Release notes](https://github.com/archiverjs/node-archiver/releases)
- [Changelog](https://github.com/archiverjs/node-archiver/blob/master/CHANGELOG.md)
- [Commits](https://github.com/archiverjs/node-archiver/compare/2.1.1...8.0.0)

---
updated-dependencies:
- dependency-name: archiver
  dependency-version: 8.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-21 20:31:49 -04:00
dependabot[bot] 5937afc4eb Bump dotenv from 16.6.1 to 18.0.0 in /newIDE/electron-app/app (#119)
Bumps [dotenv](https://github.com/motdotla/dotenv) from 16.6.1 to 18.0.0.
- [Changelog](https://github.com/motdotla/dotenv/blob/master/CHANGELOG.md)
- [Commits](https://github.com/motdotla/dotenv/compare/v16.6.1...v18.0.0)

---
updated-dependencies:
- dependency-name: dotenv
  dependency-version: 18.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-21 20:31:44 -04:00
dependabot[bot] 46df076bc7 Bump dotenv from 16.6.1 to 18.0.0 in /newIDE/electron-app (#113)
Bumps [dotenv](https://github.com/motdotla/dotenv) from 16.6.1 to 18.0.0.
- [Changelog](https://github.com/motdotla/dotenv/blob/master/CHANGELOG.md)
- [Commits](https://github.com/motdotla/dotenv/compare/v16.6.1...v18.0.0)

---
updated-dependencies:
- dependency-name: dotenv
  dependency-version: 18.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-21 20:31:37 -04:00
dependabot[bot] e9ad28141a Bump @types/node from 14.18.63 to 26.6.1 in /GDJS (#122)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 14.18.63 to 26.6.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 26.6.1
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-21 20:31:21 -04:00
dependabot[bot] 95e5414f05 Bump @types/node from 20.19.43 to 26.6.1 in /GDevelop.js (#120)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.19.43 to 26.6.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 26.6.1
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-21 20:31:17 -04:00