From 339d4ccab37683f3d032240af219ba54573dd851 Mon Sep 17 00:00:00 2001 From: Amaad Martin Date: Thu, 30 Jul 2026 16:10:34 -0700 Subject: [PATCH 1/2] fix: regenerate package-lock.json so the committed lock is a fixed point `node_modules/adm-zip` carried a stale `"dev": true` flag. adm-zip is a runtime `dependencies` entry of `core/package.json` and is imported by shipped source (`core/src/skills/loader.ts`); it is only a devDependency of the `dev` workspace. The lock had recorded the dev-only view, so an `--omit=dev` resolve driven by this lock would drop a package that runtime code imports. Produced with `npm install --package-lock-only`, not by hand-editing. The installed tree is unchanged: the flag only affects `--omit=dev` installs, and CI installs with dev dependencies included. --- package-lock.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index c38b48387..3c6c2da77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5207,7 +5207,6 @@ "version": "0.5.17", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.17.tgz", "integrity": "sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=12.0" From 4f431910869b042af42c64bea8a0d14e3ff5be71 Mon Sep 17 00:00:00 2001 From: Amaad Martin Date: Thu, 30 Jul 2026 16:11:06 -0700 Subject: [PATCH 2/2] ci: fail validation when package-lock.json is not a fixed point npm ci makes the install deterministic, but it only checks that the lock can satisfy the declared ranges -- it exits 0 on a lock that the resolver would still rewrite. That is exactly the drift class that went unnoticed here, so the switch alone does not close the hole. Re-resolve the lock and fail on any diff. Runs immediately after the install so a drifted lock fails in seconds rather than after the full build-and-test cycle. Gated to ubuntu-latest: lock content is OS-independent, while the platform-constrained optional nodes and the absence of .gitattributes make the other two legs pure downside. The remedy for a failure is the command the guard itself runs: `npm install --package-lock-only`, then commit the result. --- .github/workflows/validation.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/validation.yaml b/.github/workflows/validation.yaml index aa48fb336..e222a0f0a 100644 --- a/.github/workflows/validation.yaml +++ b/.github/workflows/validation.yaml @@ -31,6 +31,13 @@ jobs: - name: Install dependencies run: npm ci + # Lock content is OS-independent, so one leg is enough coverage. + - name: Check package-lock.json is up to date + if: matrix.os == 'ubuntu-latest' + run: | + npm install --package-lock-only + git diff --exit-code package-lock.json + - name: Check for secrets leaks run: npx secretlint "**/*"