hermes-agent/website/docs/getting-started
ethernet b812c34fb9 feat: manage npm 12 as a pinned runtime, ordered by `extends`
npm 12.0.2 is newer than the npm bundled inside pinned node 26.7.0, and
supersedes it. That relationship needs two things to be true at once, so
the pin table states it once and both are derived:

    "npm": { "extends": ["node"], ... }

Install AFTER node, because staging npm runs the node it extends. Sort
BEFORE node on PATH, because node's own bin/npm shim would otherwise win
and serve 11.19.0.

Deriving the order also removes a duplicated literal. The PATH order was
`_PATH_ORDER` in runtime_env.py AND `MANAGED_TOOL_ORDER` in
backend-env.ts, kept equal by a test that read the TypeScript source as
text -- an antipattern AGENTS.md bans outright, and the only tool the
duplication left available. The provisioner now records the derived order
in runtimes.json, both languages read it as data, and the source-reading
test is replaced by a real round-trip.

npm is not a relocatable archive: its bin/npm resolves npm-cli.js from
dirname(process.execPath), so unpacking it on PATH finds node's bundled
copy and dies with MODULE_NOT_FOUND. It is staged by running node's
bundled npm against the pinned tarball with --offline, which keeps the
bytes digest-verified while letting npm write the per-platform launchers
itself (POSIX shims in bin/, .cmd/.ps1 in the prefix root on Windows).

The tarball's bytes do not vary by platform, so `files` accepts a single
"any" key rather than six identical rows that would drift.

Also fixes a wrong comment in stage-agent-payloads.mjs claiming payloads
are cross-built on a linux runner. desktop-bundled-release.yml is a
runner-per-target matrix, as resolveTargets' own header says.
2026-08-13 14:00:32 -04:00
..
_category_.json
installation.md feat: manage npm 12 as a pinned runtime, ordered by `extends` 2026-08-13 14:00:32 -04:00
learning-path.md
nix-setup.md
platform-support.md
quickstart.md
termux.md
updating.md