Repository navigation
Real upgrades on Windows, yarn, bun and pnpm catalogs - #7
Merged
Merged
Conversation
With nothing installed yet, a yarn or bun project's versions came from the bottom of each range, so an app on 20.3 read as 20.0. yarn.lock is read in both yarn 1's format and yarn 2's, with the app's own range picking the right entry when a package is in the tree twice. bun.lock is read from its top-level, hoisted entries.
The same small app as clean-path, on yarn 4 with the node_modules linker and on bun 1.4. The fixture builder and the grader's clean install now handle both.
evals/hop.mjs takes a fixture app through each major the way the skill would, with no agent: the plan's printed command, anything the plan lists that the update left behind, a commit, then the build, tests and running app against how they were at the start. It needs no login, so the new Hops workflow runs it on every change to the scripts and weekly: npm and pnpm on Windows, npm on Linux as a control, and yarn and bun.
…eloper's environment Windows runners already have a yarn in npm's global folder, so installing over it failed with EEXIST. And yarn and pnpm read GITHUB_ACTIONS as well as CI, then refuse to write a lockfile, which stopped the yarn fixture before its first install. Fixture builds and scripted upgrades now run without those variables, as on someone's machine.
Angular's CLI can't change a catalog: through 21 it skips a catalog: package and still exits 0, and from 22 it stops with manual steps. pnpm update can't either: on 12.16.1 it replaced catalog: in package.json with a plain version. So the pnpm runner copies the catalog's versions into package.json, lets ng update run with its peer checks and migrations, writes the new versions back into the catalog with their quoting and comments, puts package.json back on catalog:, and reinstalls. A failed update leaves the catalog as it was. A catalog it can't edit safely is refused before anything changes.
The plan stopped refusing them, since the pnpm runner now moves the catalog. It says so in a note, and names any other project in the workspace whose lockfile entries use the same catalog, because moving it moves them too, without their migrations.
…it through for real The case used to grade a stop. It now expects Angular 21 in one commit, with Angular still coming from the workspace's catalog and the catalog itself on 21. The Hops workflow takes the same fixture through the plan's commands on pnpm 12.
On a Windows runner, the pnpm runner stopped with "Cannot resolve this pnpm shim without a shell": under pnpm exec, npm_execpath named pnpm 12's native binary, which only a .js path passed, and corepack's .cmd shim names its script twice. It now runs a native pnpm directly, accepts .mjs, and treats a path named twice as one. Still no shell.
A failed hop still printed the plan's reachable major as reached.
On yarn 4, `yarn ng update` printed "Installing a temporary Angular CLI versioned 21.2.29 to perform the update" and stopped with no error: asked to update, an older CLI installs a newer one with the project's own manager, and that install failed silently. The plan's yarn command now runs the same runner as pnpm, through plain node, and npm runs the target CLI from its own cache with Angular's version dispatch scoped to it, as pnpm's dlx does. npm's script is run directly, with no shell.
# Conflicts: # ROADMAP.md
On a Linux runner, the yarn path stopped with "Could not find npm next to Node": only Windows keeps npm beside node.exe. Linux and macOS keep it in lib/ beside bin/, and outside Windows npm on the path is a script Node can start without a shell.
On yarn 4, ng-select 24 failed the build with: Could not resolve "@angular/cdk/overlay". npm, pnpm and bun install a required peer on their own, and yarn doesn't. The plan already named the new peer, and now lists it under the major with the version that fits, so the skill installs it the way it installs any package the update leaves behind. A framework package keeps in step with core. A peer with no release to install is reported, not guessed.
hazeliscoding
marked this pull request as ready for review
November 8, 2026 03:36
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.
Summary
Real upgrades on Windows, yarn, bun and pnpm catalogs, proven by running the plan's own commands with no agent and no login.
evals/hop.mjstakes a fixture app through each major the way the skill would: the plan's printed command, anything the plan lists that the update left behind, a commit, then the build, tests and running app against how they were at the start. The new Hops workflow runs it on every change to the scripts and weekly. It holds no secret.package.json, letsng updaterun with its peer checks and migrations, writes the new versions back into the catalog and reinstalls.pnpm updatecouldn't do it: on 12.16.1 it replacedcatalog:with a plain version.What the real runs found and fixed
Cannot resolve this pnpm shim without a shell.mjs, and corepack's shim, still with no shellyarn ng updatestopped at "Installing a temporary Angular CLI" with no errorCould not find npm next to NodeCould not resolve "@angular/cdk/overlay"EEXISTinstalling yarnChecked
The final Hops run passes on every row: npm and pnpm on Windows, npm on Linux, yarn 4.18.1, bun 1.4.4 and a pnpm catalog, each from Angular 20 to 22 with the build, tests and running app passing after every major.