openvibers/openvibe.host Commits
pnpm-build: install with --config.confirmModulesPurge=false. When pnpm decides node_modules must be rebuilt (made under other settings, as production's Games checkout was), it asks first; under ovhost nothing answers, so it installed nothing and exited 0. Games 8200c2c's new dependency (openvibe-shared) never appeared, the deploy failed its dependency check and restored the checkout (nothing restarted). Reproduced in a copy of the production checkout; with the flag the install rebuilds node_modules and links the dependency, and the next install does not ask again.
Changes
@@@ -143,7 +143,7 @@ overrides them.Strategy defaults: `static-build` also sets `install: npm ci, always`, `build: [["node", "build.js"]]` and`nginx: { repoVhosts: "deploy/nginx/*.conf", installOnDeploy: true }`; `pnpm-build` sets--`packages: ["apps/*", "packages/*"]`, `install: pnpm install --frozen-lockfile, always` and++`packages: ["apps/*", "packages/*"]`, `install: pnpm install --frozen-lockfile --config.confirmModulesPurge=false, always` (pnpm's purge prompt has no one to answer it) and`build: [["pnpm", "build"]]`; `release-layout` installs with `npm ci --omit=dev`.A release-layout entry's `repo` is the release root (`/opt/openvibe.live`); an entry that names the link@@@ -66,7 +66,10 @@ const PRESETS = {},'pnpm-build': {packages: ['apps/*', 'packages/*'],-- install: { command: ['pnpm', 'install', '--frozen-lockfile'], always: true, lockfile: 'pnpm-lock.yaml', restoreLockfile: false, workspace: true },++ // --config.confirmModulesPurge=false: when pnpm decides node_modules must be rebuilt (made under other settings),++ // it asks first; with no terminal nothing answers, it installs nothing and exits 0 (Games, 2026-09-27: a new++ // dependency never appeared, the deploy failed its dependency check and was restored).++ install: { command: ['pnpm', 'install', '--frozen-lockfile', '--config.confirmModulesPurge=false'], always: true, lockfile: 'pnpm-lock.yaml', restoreLockfile: false, workspace: true },build: [['pnpm', 'build']],},'release-layout': { install: { command: NPM_CI } },@@@ -233,7 +233,7 @@ runTests([assert.strictEqual(r.code, 0, r.out);assert.strictEqual(host.repo.head, to);const pnpm = host.calls.filter((c) => c.cmd === 'pnpm');-- assert.deepStrictEqual(pnpm.map((c) => c.args.join(' ')), ['install --frozen-lockfile', 'build']);++ assert.deepStrictEqual(pnpm.map((c) => c.args.join(' ')), ['install --frozen-lockfile --config.confirmModulesPurge=false', 'build'], 'never waits on pnpm\'s purge prompt');assert.ok(pnpm.every((c) => c.as === 'ubuntu' && c.cwd === '/opt/openvibe.games'));assert.ok(host.calls.filter((c) => c.cmd === 'git').every((c) => c.as === 'ubuntu'), 'git as the checkout owner, never root');const check = host.nodeChecks()[0];
@@ -143,7 +143,7 @@ overrides them.
@@ -143,7 +143,7 @@ overrides them.
Strategy defaults: `static-build` also sets `install: npm ci, always`, `build: [["node", "build.js"]]` and
Strategy defaults: `static-build` also sets `install: npm ci, always`, `build: [["node", "build.js"]]` and
`nginx: { repoVhosts: "deploy/nginx/*.conf", installOnDeploy: true }`; `pnpm-build` sets
`nginx: { repoVhosts: "deploy/nginx/*.conf", installOnDeploy: true }`; `pnpm-build` sets
-`packages: ["apps/*", "packages/*"]`, `install: pnpm install --frozen-lockfile, always` and
+`packages: ["apps/*", "packages/*"]`, `install: pnpm install --frozen-lockfile --config.confirmModulesPurge=false, always` (pnpm's purge prompt has no one to answer it) and
`build: [["pnpm", "build"]]`; `release-layout` installs with `npm ci --omit=dev`.
`build: [["pnpm", "build"]]`; `release-layout` installs with `npm ci --omit=dev`.
A release-layout entry's `repo` is the release root (`/opt/openvibe.live`); an entry that names the link
A release-layout entry's `repo` is the release root (`/opt/openvibe.live`); an entry that names the link
@@ -66,7 +66,10 @@ const PRESETS = {
@@ -66,7 +66,10 @@ const PRESETS = {
},
},
'pnpm-build': {
'pnpm-build': {
packages: ['apps/*', 'packages/*'],
packages: ['apps/*', 'packages/*'],
- install: { command: ['pnpm', 'install', '--frozen-lockfile'], always: true, lockfile: 'pnpm-lock.yaml', restoreLockfile: false, workspace: true },
+ // --config.confirmModulesPurge=false: when pnpm decides node_modules must be rebuilt (made under other settings),
+ // it asks first; with no terminal nothing answers, it installs nothing and exits 0 (Games, 2026-09-27: a new
+ // dependency never appeared, the deploy failed its dependency check and was restored).
+ install: { command: ['pnpm', 'install', '--frozen-lockfile', '--config.confirmModulesPurge=false'], always: true, lockfile: 'pnpm-lock.yaml', restoreLockfile: false, workspace: true },
build: [['pnpm', 'build']],
build: [['pnpm', 'build']],
},
},
'release-layout': { install: { command: NPM_CI } },
'release-layout': { install: { command: NPM_CI } },
@@ -233,7 +233,7 @@ runTests([
@@ -233,7 +233,7 @@ runTests([
assert.strictEqual(r.code, 0, r.out);
assert.strictEqual(r.code, 0, r.out);
assert.strictEqual(host.repo.head, to);
assert.strictEqual(host.repo.head, to);
const pnpm = host.calls.filter((c) => c.cmd === 'pnpm');
const pnpm = host.calls.filter((c) => c.cmd === 'pnpm');
- assert.deepStrictEqual(pnpm.map((c) => c.args.join(' ')), ['install --frozen-lockfile', 'build']);
+ assert.deepStrictEqual(pnpm.map((c) => c.args.join(' ')), ['install --frozen-lockfile --config.confirmModulesPurge=false', 'build'], 'never waits on pnpm\'s purge prompt');
assert.ok(pnpm.every((c) => c.as === 'ubuntu' && c.cwd === '/opt/openvibe.games'));
assert.ok(pnpm.every((c) => c.as === 'ubuntu' && c.cwd === '/opt/openvibe.games'));
assert.ok(host.calls.filter((c) => c.cmd === 'git').every((c) => c.as === 'ubuntu'), 'git as the checkout owner, never root');
assert.ok(host.calls.filter((c) => c.cmd === 'git').every((c) => c.as === 'ubuntu'), 'git as the checkout owner, never root');
const check = host.nodeChecks()[0];
const check = host.nodeChecks()[0];