Skip to content

Real upgrades on Windows, yarn, bun and pnpm catalogs - #7

Merged
hazeliscoding merged 13 commits into
mainfrom
feat/hops
Nov 8, 2026
Merged

hazeliscoding merged 13 commits into
mainfrom
feat/hops

Conversation

@hazeliscoding

@hazeliscoding hazeliscoding commented Nov 8, 2026 •

Copy link
Copy Markdown
Owner

Summary

Real upgrades on Windows, yarn, bun and pnpm catalogs, proven by running the plan's own commands with no agent and no login.

  • Scripted upgrades: evals/hop.mjs takes 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.
  • pnpm catalogs: the plan stopped refusing them. 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 and reinstalls. pnpm update couldn't do it: on 12.16.1 it replaced catalog: with a plain version.
  • yarn and bun: the plan reads their lockfiles, and both have fixtures and agent cases.

What the real runs found and fixed

Where What failed Fix
Windows, pnpm 12 Cannot resolve this pnpm shim without a shell The runner accepts pnpm 12's native binary, .mjs, and corepack's shim, still with no shell
yarn 4 yarn ng update stopped at "Installing a temporary Angular CLI" with no error The runner has npm run the target CLI from its own cache, as pnpm's dlx does
Linux, yarn Could not find npm next to Node npm is found where Linux and macOS keep it
yarn 4, Angular 22 Could not resolve "@angular/cdk/overlay" The plan lists a newly required peer to install, with its version, since yarn won't add it
Windows runners EEXIST installing yarn Pinned tools go in a folder of their own

Checked

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.

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.
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
hazeliscoding marked this pull request as ready for review November 8, 2026 03:36
@hazeliscoding
hazeliscoding merged commit ca059cd into main Nov 8, 2026
14 checks passed
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