Stop Dependabot proposing npm updates it cannot lock - #135
Merged
Conversation
`packages/squad-cli` and `packages/squad-sdk` had their own `package-ecosystem: npm` entries in dependabot.yml. They are workspace members of `workspaces: packages/*` and have no `package-lock.json` of their own, so a directory-scoped entry makes Dependabot edit the member's `package.json` and nothing else. The manifest and the single root lockfile then disagree, `npm ci` refuses with EUSAGE, and every check that installs first fails for a reason that has nothing to do with the dependency being bumped. That produced three of the open PRs — #111, #112 and #26 — all reporting `mergeable: MERGEABLE` while being uninstallable. The root `/` entry already updates every member manifest together with the lockfile, which is the only combination npm will install, so the two entries are removed rather than fixed. Lands the upgrades those PRs were trying to make, this time with the lockfile: - esbuild ^0.25.0 -> ^0.28.2 in squad-cli (#112) - @opentelemetry/{exporter-metrics-otlp-grpc,exporter-trace-otlp-grpc,sdk-node} ^0.219.0 -> ^0.221.0 in squad-sdk (#111) The lockfile diff is large because those two trees are large — 60 @opentelemetry and 26 @esbuild entries move. A no-op `npm install --package-lock-only` on dev changes 4 lines, so the churn is the upgrade, not a reformat.
Contributor
🛫 PR Readiness Check
PR Scope: 🔧 Infrastructure
|
| Status | Check | Details |
|---|---|---|
| ✅ | Single commit | 1 commit — clean history |
| ✅ | Not in draft | Ready for review |
| ❌ | Branch up to date | dev is 2 commit(s) ahead — rebase recommended |
| ❌ | Copilot review | No Copilot review yet — it may still be processing |
| ✅ | Changeset present | No source files changed — changeset not required |
| ✅ | Scope clean | No .squad/ or docs/proposals/ files |
| ✅ | No merge conflicts | No merge conflicts |
| ✅ | Copilot threads resolved | No Copilot review threads |
| ✅ | CI passing | All checks passing |
Files Changed (4 files, +6501 −6055)
| File | +/− |
|---|---|
.github/dependabot.yml |
+9 −38 |
package-lock.json |
+6485 −6010 |
packages/squad-cli/package.json |
+2 −2 |
packages/squad-sdk/package.json |
+5 −5 |
Total: +6501 −6055
This check runs automatically on every push. Fix any ❌ items and push again.
See CONTRIBUTING.md and PR Requirements for details.
Contributor
🔒 Security Review🔒 Security review: 2 info.
Automated security review — informational only. |
Contributor
🟡 Impact Analysis — PR #135Risk tier: 🟡 MEDIUM 📊 Summary
🎯 Risk Factors
📦 Modules Affectedci-workflows (1 file)
root (1 file)
squad-cli (1 file)
squad-sdk (1 file)
|
This was referenced Sep 1, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes the root cause behind three of the stale Dependabot PRs, and lands the two upgrades they were trying to make.
The bug
.github/dependabot.ymldeclared/packages/squad-cliand/packages/squad-sdkas their ownpackage-ecosystem: npmentries. Both are members ofworkspaces: packages/*and neither has apackage-lock.jsonof its own:package.jsonpackage-lock.json//docs/packages/squad-cli/packages/squad-sdkA directory-scoped entry therefore makes Dependabot edit that member's manifest and nothing else. The manifest and the single root lockfile then disagree, and
npm cirefuses:Every check that installs before it does anything fails, for a reason unrelated to the dependency being bumped. #111, #112 and #26 were all in this state, and all three reported
mergeable: MERGEABLEthroughout — GitHub has no opinion about whether a lockfile installs.The
/entry already updates every member manifest together with the root lockfile — that is what #130 did — so the two entries are removed rather than repaired.The upgrades
Landed here with a correct lockfile, superseding the PRs that could not carry one:
esbuild^0.25.0→^0.28.2in squad-cli — supersedes deps: bump esbuild from 0.25.12 to 0.28.2 in /packages/squad-cli in the minor-patch group across 1 directory #112@opentelemetry/{exporter-metrics-otlp-grpc,exporter-trace-otlp-grpc,sdk-node}^0.219.0→^0.221.0in squad-sdk — supersedes deps: bump the minor-patch group across 1 directory with 3 updates #111#26 (
typescriptin squad-sdk) is also obsoleted by the config change, but its content is not landed here — see below.On the lockfile diff size
~6,500 lines, which deserves an explanation rather than a shrug. The churn is concentrated in exactly the two trees being upgraded — 60
@opentelemetryand 26@esbuildentries move — and a control run ofnpm install --package-lock-onlyagainst unmodifieddevchanges 4 lines, so this is the upgrade rather than a reformat by a different npm.The two unrelated normalisations npm applied to
squad-sdk/package.json(unescaping—, dropping an emptydependencies: {}) have been reverted, so that manifest's diff is three version lines and nothing else.Validation
Local, on this branch:
npm ci→ exit 0, and leaves every tracked dependency file unmodifiednpm run build→ exit 0npm run check(check:docs + lint + test) → exit 0, 289 files / 7549 tests passedOne note for anyone running the suite locally:
test/lab-grader.test.tsasserts the grader child process sees no*TOKEN*environment variables, so it fails under any shell that has one set — running inside Claude Code, for instance. CI has none, and it passes there. Unrelated to this change, but it will waste someone's afternoon eventually.What this does not fix
typescript6 → 7 (#33, #26) stays open.typescript-eslintpeer-requirestypescript >=4.8.4 <6.1.0at its newest release (8.69.0), so TS 7 has no supported version of the lint toolchain to move to.