@pleri/olam-cli 0.1.69 → 0.1.72
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-version.d.ts +16 -0
- package/dist/cli-version.d.ts.map +1 -0
- package/dist/cli-version.js +39 -0
- package/dist/cli-version.js.map +1 -0
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +2 -0
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/host-cp.d.ts.map +1 -1
- package/dist/commands/host-cp.js +10 -0
- package/dist/commands/host-cp.js.map +1 -1
- package/dist/commands/runbooks.d.ts +13 -0
- package/dist/commands/runbooks.d.ts.map +1 -0
- package/dist/commands/runbooks.js +189 -0
- package/dist/commands/runbooks.js.map +1 -0
- package/dist/commands/world-snapshot.d.ts +1 -0
- package/dist/commands/world-snapshot.d.ts.map +1 -1
- package/dist/commands/world-snapshot.js +126 -1
- package/dist/commands/world-snapshot.js.map +1 -1
- package/dist/commands/worldspec/compile.d.ts +20 -0
- package/dist/commands/worldspec/compile.d.ts.map +1 -0
- package/dist/commands/worldspec/compile.js +130 -0
- package/dist/commands/worldspec/compile.js.map +1 -0
- package/dist/commands/worldspec/index.d.ts +12 -0
- package/dist/commands/worldspec/index.d.ts.map +1 -0
- package/dist/commands/worldspec/index.js +23 -0
- package/dist/commands/worldspec/index.js.map +1 -0
- package/dist/commands/worldspec/init.d.ts +15 -0
- package/dist/commands/worldspec/init.d.ts.map +1 -0
- package/dist/commands/worldspec/init.js +166 -0
- package/dist/commands/worldspec/init.js.map +1 -0
- package/dist/commands/worldspec/schema.d.ts +11 -0
- package/dist/commands/worldspec/schema.d.ts.map +1 -0
- package/dist/commands/worldspec/schema.js +55 -0
- package/dist/commands/worldspec/schema.js.map +1 -0
- package/dist/commands/worldspec/validate.d.ts +15 -0
- package/dist/commands/worldspec/validate.d.ts.map +1 -0
- package/dist/commands/worldspec/validate.js +66 -0
- package/dist/commands/worldspec/validate.js.map +1 -0
- package/dist/exit-codes.d.ts +32 -0
- package/dist/exit-codes.d.ts.map +1 -1
- package/dist/exit-codes.js +32 -0
- package/dist/exit-codes.js.map +1 -1
- package/dist/image-digests.json +5 -5
- package/dist/index.js +4726 -1231
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.js +1424 -321
- package/host-cp/compose.yaml +6 -0
- package/host-cp/src/global-config-source.mjs +71 -0
- package/host-cp/src/listening-server-poller.mjs +1 -1
- package/host-cp/src/plan-orchestrator.mjs +20 -1
- package/host-cp/src/port-bridge-manager.mjs +1 -1
- package/host-cp/src/server.mjs +46 -7
- package/host-cp/src/version-status.mjs +36 -0
- package/package.json +4 -2
- package/dist/__tests__/audit-publish-deps-contract.test.d.ts +0 -26
- package/dist/__tests__/audit-publish-deps-contract.test.d.ts.map +0 -1
- package/dist/__tests__/audit-publish-deps-contract.test.js +0 -86
- package/dist/__tests__/audit-publish-deps-contract.test.js.map +0 -1
- package/dist/__tests__/auth-status.test.d.ts +0 -2
- package/dist/__tests__/auth-status.test.d.ts.map +0 -1
- package/dist/__tests__/auth-status.test.js +0 -291
- package/dist/__tests__/auth-status.test.js.map +0 -1
- package/dist/__tests__/auth-upgrade.test.d.ts +0 -9
- package/dist/__tests__/auth-upgrade.test.d.ts.map +0 -1
- package/dist/__tests__/auth-upgrade.test.js +0 -397
- package/dist/__tests__/auth-upgrade.test.js.map +0 -1
- package/dist/__tests__/bootstrap-tag-mcp-auth.test.d.ts +0 -22
- package/dist/__tests__/bootstrap-tag-mcp-auth.test.d.ts.map +0 -1
- package/dist/__tests__/bootstrap-tag-mcp-auth.test.js +0 -63
- package/dist/__tests__/bootstrap-tag-mcp-auth.test.js.map +0 -1
- package/dist/__tests__/cli-mcp-revoke.test.d.ts +0 -8
- package/dist/__tests__/cli-mcp-revoke.test.d.ts.map +0 -1
- package/dist/__tests__/cli-mcp-revoke.test.js +0 -124
- package/dist/__tests__/cli-mcp-revoke.test.js.map +0 -1
- package/dist/__tests__/config.test.d.ts +0 -2
- package/dist/__tests__/config.test.d.ts.map +0 -1
- package/dist/__tests__/config.test.js +0 -95
- package/dist/__tests__/config.test.js.map +0 -1
- package/dist/__tests__/create-app-urls.test.d.ts +0 -2
- package/dist/__tests__/create-app-urls.test.d.ts.map +0 -1
- package/dist/__tests__/create-app-urls.test.js +0 -102
- package/dist/__tests__/create-app-urls.test.js.map +0 -1
- package/dist/__tests__/docker-host.test.d.ts +0 -14
- package/dist/__tests__/docker-host.test.d.ts.map +0 -1
- package/dist/__tests__/docker-host.test.js +0 -109
- package/dist/__tests__/docker-host.test.js.map +0 -1
- package/dist/__tests__/enter.test.d.ts +0 -2
- package/dist/__tests__/enter.test.d.ts.map +0 -1
- package/dist/__tests__/enter.test.js +0 -90
- package/dist/__tests__/enter.test.js.map +0 -1
- package/dist/__tests__/help-output.test.d.ts +0 -2
- package/dist/__tests__/help-output.test.d.ts.map +0 -1
- package/dist/__tests__/help-output.test.js +0 -74
- package/dist/__tests__/help-output.test.js.map +0 -1
- package/dist/__tests__/host-cp-gh-token.test.d.ts +0 -9
- package/dist/__tests__/host-cp-gh-token.test.d.ts.map +0 -1
- package/dist/__tests__/host-cp-gh-token.test.js +0 -119
- package/dist/__tests__/host-cp-gh-token.test.js.map +0 -1
- package/dist/__tests__/host-cp.test.d.ts +0 -9
- package/dist/__tests__/host-cp.test.d.ts.map +0 -1
- package/dist/__tests__/host-cp.test.js +0 -327
- package/dist/__tests__/host-cp.test.js.map +0 -1
- package/dist/__tests__/image-presence.test.d.ts +0 -2
- package/dist/__tests__/image-presence.test.d.ts.map +0 -1
- package/dist/__tests__/image-presence.test.js +0 -44
- package/dist/__tests__/image-presence.test.js.map +0 -1
- package/dist/__tests__/install-root.test.d.ts +0 -2
- package/dist/__tests__/install-root.test.d.ts.map +0 -1
- package/dist/__tests__/install-root.test.js +0 -119
- package/dist/__tests__/install-root.test.js.map +0 -1
- package/dist/__tests__/keys.test.d.ts +0 -9
- package/dist/__tests__/keys.test.d.ts.map +0 -1
- package/dist/__tests__/keys.test.js +0 -145
- package/dist/__tests__/keys.test.js.map +0 -1
- package/dist/__tests__/logs.test.d.ts +0 -9
- package/dist/__tests__/logs.test.d.ts.map +0 -1
- package/dist/__tests__/logs.test.js +0 -124
- package/dist/__tests__/logs.test.js.map +0 -1
- package/dist/__tests__/mcp-import.test.d.ts +0 -11
- package/dist/__tests__/mcp-import.test.d.ts.map +0 -1
- package/dist/__tests__/mcp-import.test.js +0 -134
- package/dist/__tests__/mcp-import.test.js.map +0 -1
- package/dist/__tests__/protocol-version.test.d.ts +0 -2
- package/dist/__tests__/protocol-version.test.d.ts.map +0 -1
- package/dist/__tests__/protocol-version.test.js +0 -170
- package/dist/__tests__/protocol-version.test.js.map +0 -1
- package/dist/__tests__/ps.test.d.ts +0 -2
- package/dist/__tests__/ps.test.d.ts.map +0 -1
- package/dist/__tests__/ps.test.js +0 -172
- package/dist/__tests__/ps.test.js.map +0 -1
- package/dist/__tests__/registry-allowlist.test.d.ts +0 -2
- package/dist/__tests__/registry-allowlist.test.d.ts.map +0 -1
- package/dist/__tests__/registry-allowlist.test.js +0 -129
- package/dist/__tests__/registry-allowlist.test.js.map +0 -1
- package/dist/__tests__/services.test.d.ts +0 -8
- package/dist/__tests__/services.test.d.ts.map +0 -1
- package/dist/__tests__/services.test.js +0 -185
- package/dist/__tests__/services.test.js.map +0 -1
- package/dist/__tests__/status-app-urls.test.d.ts +0 -2
- package/dist/__tests__/status-app-urls.test.d.ts.map +0 -1
- package/dist/__tests__/status-app-urls.test.js +0 -125
- package/dist/__tests__/status-app-urls.test.js.map +0 -1
- package/dist/__tests__/upgrade-gh-token-contract.test.d.ts +0 -19
- package/dist/__tests__/upgrade-gh-token-contract.test.d.ts.map +0 -1
- package/dist/__tests__/upgrade-gh-token-contract.test.js +0 -63
- package/dist/__tests__/upgrade-gh-token-contract.test.js.map +0 -1
- package/dist/__tests__/upgrade.test.d.ts +0 -9
- package/dist/__tests__/upgrade.test.d.ts.map +0 -1
- package/dist/__tests__/upgrade.test.js +0 -586
- package/dist/__tests__/upgrade.test.js.map +0 -1
- package/dist/commands/__tests__/__fixtures__/upgrade-helpers.d.ts +0 -6
- package/dist/commands/__tests__/__fixtures__/upgrade-helpers.d.ts.map +0 -1
- package/dist/commands/__tests__/__fixtures__/upgrade-helpers.js +0 -26
- package/dist/commands/__tests__/__fixtures__/upgrade-helpers.js.map +0 -1
- package/dist/commands/__tests__/begin.test.d.ts +0 -7
- package/dist/commands/__tests__/begin.test.d.ts.map +0 -1
- package/dist/commands/__tests__/begin.test.js +0 -72
- package/dist/commands/__tests__/begin.test.js.map +0 -1
- package/dist/commands/__tests__/bootstrap.test.d.ts +0 -2
- package/dist/commands/__tests__/bootstrap.test.d.ts.map +0 -1
- package/dist/commands/__tests__/bootstrap.test.js +0 -370
- package/dist/commands/__tests__/bootstrap.test.js.map +0 -1
- package/dist/commands/__tests__/carry-uncommitted.test.d.ts +0 -14
- package/dist/commands/__tests__/carry-uncommitted.test.d.ts.map +0 -1
- package/dist/commands/__tests__/carry-uncommitted.test.js +0 -83
- package/dist/commands/__tests__/carry-uncommitted.test.js.map +0 -1
- package/dist/commands/__tests__/clean.test.d.ts +0 -9
- package/dist/commands/__tests__/clean.test.d.ts.map +0 -1
- package/dist/commands/__tests__/clean.test.js +0 -105
- package/dist/commands/__tests__/clean.test.js.map +0 -1
- package/dist/commands/__tests__/crystallize.test.d.ts +0 -2
- package/dist/commands/__tests__/crystallize.test.d.ts.map +0 -1
- package/dist/commands/__tests__/crystallize.test.js +0 -133
- package/dist/commands/__tests__/crystallize.test.js.map +0 -1
- package/dist/commands/__tests__/diagnose.test.d.ts +0 -9
- package/dist/commands/__tests__/diagnose.test.d.ts.map +0 -1
- package/dist/commands/__tests__/diagnose.test.js +0 -108
- package/dist/commands/__tests__/diagnose.test.js.map +0 -1
- package/dist/commands/__tests__/openHostCpUrl.test.d.ts +0 -2
- package/dist/commands/__tests__/openHostCpUrl.test.d.ts.map +0 -1
- package/dist/commands/__tests__/openHostCpUrl.test.js +0 -63
- package/dist/commands/__tests__/openHostCpUrl.test.js.map +0 -1
- package/dist/commands/__tests__/refresh.test.d.ts +0 -13
- package/dist/commands/__tests__/refresh.test.d.ts.map +0 -1
- package/dist/commands/__tests__/refresh.test.js +0 -170
- package/dist/commands/__tests__/refresh.test.js.map +0 -1
- package/dist/commands/__tests__/status.test.d.ts +0 -8
- package/dist/commands/__tests__/status.test.d.ts.map +0 -1
- package/dist/commands/__tests__/status.test.js +0 -62
- package/dist/commands/__tests__/status.test.js.map +0 -1
- package/dist/commands/__tests__/stop.test.d.ts +0 -5
- package/dist/commands/__tests__/stop.test.d.ts.map +0 -1
- package/dist/commands/__tests__/stop.test.js +0 -30
- package/dist/commands/__tests__/stop.test.js.map +0 -1
- package/dist/commands/__tests__/update.test.d.ts +0 -7
- package/dist/commands/__tests__/update.test.d.ts.map +0 -1
- package/dist/commands/__tests__/update.test.js +0 -224
- package/dist/commands/__tests__/update.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.all-three.test.d.ts +0 -19
- package/dist/commands/__tests__/upgrade.all-three.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.all-three.test.js +0 -80
- package/dist/commands/__tests__/upgrade.all-three.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.compose-path.test.d.ts +0 -20
- package/dist/commands/__tests__/upgrade.compose-path.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.compose-path.test.js +0 -140
- package/dist/commands/__tests__/upgrade.compose-path.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.history.test.d.ts +0 -15
- package/dist/commands/__tests__/upgrade.history.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.history.test.js +0 -199
- package/dist/commands/__tests__/upgrade.history.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.lock.test.d.ts +0 -15
- package/dist/commands/__tests__/upgrade.lock.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.lock.test.js +0 -253
- package/dist/commands/__tests__/upgrade.lock.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.olam-tag.test.d.ts +0 -21
- package/dist/commands/__tests__/upgrade.olam-tag.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.olam-tag.test.js +0 -114
- package/dist/commands/__tests__/upgrade.olam-tag.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.poll.test.d.ts +0 -14
- package/dist/commands/__tests__/upgrade.poll.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.poll.test.js +0 -136
- package/dist/commands/__tests__/upgrade.poll.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.recreate.test.d.ts +0 -17
- package/dist/commands/__tests__/upgrade.recreate.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.recreate.test.js +0 -83
- package/dist/commands/__tests__/upgrade.recreate.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.rollback.test.d.ts +0 -12
- package/dist/commands/__tests__/upgrade.rollback.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.rollback.test.js +0 -255
- package/dist/commands/__tests__/upgrade.rollback.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.sha-capture.test.d.ts +0 -12
- package/dist/commands/__tests__/upgrade.sha-capture.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.sha-capture.test.js +0 -63
- package/dist/commands/__tests__/upgrade.sha-capture.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.smoke.test.d.ts +0 -19
- package/dist/commands/__tests__/upgrade.smoke.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.smoke.test.js +0 -87
- package/dist/commands/__tests__/upgrade.smoke.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.swap.test.d.ts +0 -19
- package/dist/commands/__tests__/upgrade.swap.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.swap.test.js +0 -312
- package/dist/commands/__tests__/upgrade.swap.test.js.map +0 -1
- package/dist/commands/__tests__/world-upgrade.test.d.ts +0 -8
- package/dist/commands/__tests__/world-upgrade.test.d.ts.map +0 -1
- package/dist/commands/__tests__/world-upgrade.test.js +0 -73
- package/dist/commands/__tests__/world-upgrade.test.js.map +0 -1
- package/dist/lib/__tests__/symlink-reconcile.test.d.ts +0 -2
- package/dist/lib/__tests__/symlink-reconcile.test.d.ts.map +0 -1
- package/dist/lib/__tests__/symlink-reconcile.test.js +0 -106
- package/dist/lib/__tests__/symlink-reconcile.test.js.map +0 -1
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Verifies Phase 2a A4 sequential build orchestration: `olam upgrade` invokes
|
|
3
|
-
* `bash build-auth.sh` → `bash build-devbox.sh` → `bash build-host-cp.sh` in
|
|
4
|
-
* that order with `OLAM_TAG=olam-next` env, and the devbox step uses inherit
|
|
5
|
-
* stdio (live tee) for cold-cache visibility.
|
|
6
|
-
*
|
|
7
|
-
* The CLI source is read as text and parsed for the load-bearing invariants:
|
|
8
|
-
* - Build scripts listed in correct order
|
|
9
|
-
* - OLAM_TAG=olam-next env propagated
|
|
10
|
-
* - Devbox uses tee (inherit stdio) per F13 audit fix
|
|
11
|
-
* - Other two use silent runStep capture
|
|
12
|
-
*
|
|
13
|
-
* Direct integration testing (spawning real `bash build-*.sh`) lives at
|
|
14
|
-
* tests/integration/build-scripts-olam-tag.sh — manual smoke; not in CI.
|
|
15
|
-
*
|
|
16
|
-
* Run: `cd packages/cli && npx vitest run src/commands/__tests__/upgrade.all-three.test.ts`
|
|
17
|
-
*/
|
|
18
|
-
import { describe, it, expect } from 'vitest';
|
|
19
|
-
import * as fs from 'node:fs';
|
|
20
|
-
import * as path from 'node:path';
|
|
21
|
-
import { REPO_ROOT } from './__fixtures__/upgrade-helpers.js';
|
|
22
|
-
const UPGRADE_TS = path.join(REPO_ROOT, 'packages', 'cli', 'src', 'commands', 'upgrade.ts');
|
|
23
|
-
describe('Phase 2a A4 — sequential build orchestration', () => {
|
|
24
|
-
let body;
|
|
25
|
-
it('reads the upgrade.ts source', () => {
|
|
26
|
-
body = fs.readFileSync(UPGRADE_TS, 'utf-8');
|
|
27
|
-
expect(body.length).toBeGreaterThan(1000);
|
|
28
|
-
});
|
|
29
|
-
it('declares OLAM_TAG=olam-next env for the build steps', () => {
|
|
30
|
-
body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
|
|
31
|
-
expect(body).toMatch(/OLAM_TAG:\s*['"]olam-next['"]/);
|
|
32
|
-
});
|
|
33
|
-
it('lists the three build scripts in correct order (auth → devbox → host-cp) inside buildScripts[]', () => {
|
|
34
|
-
body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
|
|
35
|
-
// Scope the order check to the buildScripts array literal (other mentions
|
|
36
|
-
// of build-host-cp.sh exist in the file's doc comment + the printed plan).
|
|
37
|
-
const arrayMatch = body.match(/buildScripts:[\s\S]*?=\s*\[[\s\S]*?\];/);
|
|
38
|
-
expect(arrayMatch).not.toBeNull();
|
|
39
|
-
const arrayBody = arrayMatch[0];
|
|
40
|
-
const authIdx = arrayBody.indexOf('build-auth.sh');
|
|
41
|
-
const devboxIdx = arrayBody.indexOf('build-devbox.sh');
|
|
42
|
-
const hostCpIdx = arrayBody.indexOf('build-host-cp.sh');
|
|
43
|
-
expect(authIdx).toBeGreaterThan(0);
|
|
44
|
-
expect(devboxIdx).toBeGreaterThan(authIdx);
|
|
45
|
-
expect(hostCpIdx).toBeGreaterThan(devboxIdx);
|
|
46
|
-
});
|
|
47
|
-
it('marks the devbox step as tee:true (inherit stdio) for cold-cache visibility (F13 fix)', () => {
|
|
48
|
-
body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
|
|
49
|
-
// The devbox entry in the buildScripts array should have tee: true.
|
|
50
|
-
// Look for the literal "build-devbox.sh" entry and verify the same line
|
|
51
|
-
// (or nearby) sets tee: true.
|
|
52
|
-
const devboxLine = body
|
|
53
|
-
.split('\n')
|
|
54
|
-
.find((line) => line.includes('build-devbox.sh') && line.includes('tee'));
|
|
55
|
-
expect(devboxLine).toBeDefined();
|
|
56
|
-
expect(devboxLine).toMatch(/tee:\s*true/);
|
|
57
|
-
});
|
|
58
|
-
it('marks auth + host-cp steps as tee:false (silent runStep)', () => {
|
|
59
|
-
body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
|
|
60
|
-
const lines = body.split('\n');
|
|
61
|
-
const authLine = lines.find((line) => line.includes('build-auth.sh') && line.includes('tee'));
|
|
62
|
-
const hostCpLine = lines.find((line) => line.includes('build-host-cp.sh') && line.includes('tee'));
|
|
63
|
-
expect(authLine).toMatch(/tee:\s*false/);
|
|
64
|
-
expect(hostCpLine).toMatch(/tee:\s*false/);
|
|
65
|
-
});
|
|
66
|
-
it('uses spawnSync with stdio: inherit for the tee branch', () => {
|
|
67
|
-
body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
|
|
68
|
-
// The tee branch should call spawnSync with stdio: 'inherit'.
|
|
69
|
-
expect(body).toMatch(/spawnSync\([\s\S]*?stdio:\s*['"]inherit['"]/);
|
|
70
|
-
});
|
|
71
|
-
it('failure path exits with code 1 on any build script failure', () => {
|
|
72
|
-
body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
|
|
73
|
-
// The orchestration loop should set process.exitCode = 1 on failure.
|
|
74
|
-
// Look for the buildScripts loop body containing the exitCode = 1 pattern.
|
|
75
|
-
const loopMatch = body.match(/for\s*\(\s*const\s+step\s+of\s+buildScripts[\s\S]*?\n\s*\}\n/);
|
|
76
|
-
expect(loopMatch).not.toBeNull();
|
|
77
|
-
expect(loopMatch[0]).toMatch(/process\.exitCode\s*=\s*1/);
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
//# sourceMappingURL=upgrade.all-three.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.all-three.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/upgrade.all-three.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;AAE5F,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;IAC5D,IAAI,IAAY,CAAC;IAEjB,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,IAAI,KAAK,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gGAAgG,EAAE,GAAG,EAAE;QACxG,IAAI,KAAK,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,0EAA0E;QAC1E,2EAA2E;QAC3E,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACxE,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,UAAW,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uFAAuF,EAAE,GAAG,EAAE;QAC/F,IAAI,KAAK,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,oEAAoE;QACpE,wEAAwE;QACxE,8BAA8B;QAC9B,MAAM,UAAU,GAAG,IAAI;aACpB,KAAK,CAAC,IAAI,CAAC;aACX,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,IAAI,KAAK,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9F,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACnG,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACzC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,IAAI,KAAK,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,8DAA8D;QAC9D,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,IAAI,KAAK,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,qEAAqE;QACrE,2EAA2E;QAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAC7F,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,CAAC,SAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Regression test for: findComposeFile() resolves bundled path, not cwd.
|
|
3
|
-
*
|
|
4
|
-
* Before this fix, upgrade.ts used `path.join(process.cwd(), 'packages/host-cp/compose.yaml')`
|
|
5
|
-
* at three callsites, which broke `olam upgrade` when run from outside the
|
|
6
|
-
* monorepo root (the npm-installed binary case).
|
|
7
|
-
*
|
|
8
|
-
* Two test layers:
|
|
9
|
-
* 1. Source-text invariants — all three callsites in upgrade.ts now use
|
|
10
|
-
* findComposeFile() from host-cp.ts; that function prioritises the
|
|
11
|
-
* bundled (import.meta.url-relative) path over process.cwd().
|
|
12
|
-
* 2. Subprocess functional — spawns an inline Node.js ESM script that
|
|
13
|
-
* re-runs the findComposeFile candidate logic with a controlled cwd
|
|
14
|
-
* (a plain tmpdir with no monorepo structure) and a fake bundled file,
|
|
15
|
-
* asserting the bundled path is returned.
|
|
16
|
-
*
|
|
17
|
-
* Run: `cd packages/cli && npx vitest run src/commands/__tests__/upgrade.compose-path.test.ts`
|
|
18
|
-
*/
|
|
19
|
-
export {};
|
|
20
|
-
//# sourceMappingURL=upgrade.compose-path.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.compose-path.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/upgrade.compose-path.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG"}
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Regression test for: findComposeFile() resolves bundled path, not cwd.
|
|
3
|
-
*
|
|
4
|
-
* Before this fix, upgrade.ts used `path.join(process.cwd(), 'packages/host-cp/compose.yaml')`
|
|
5
|
-
* at three callsites, which broke `olam upgrade` when run from outside the
|
|
6
|
-
* monorepo root (the npm-installed binary case).
|
|
7
|
-
*
|
|
8
|
-
* Two test layers:
|
|
9
|
-
* 1. Source-text invariants — all three callsites in upgrade.ts now use
|
|
10
|
-
* findComposeFile() from host-cp.ts; that function prioritises the
|
|
11
|
-
* bundled (import.meta.url-relative) path over process.cwd().
|
|
12
|
-
* 2. Subprocess functional — spawns an inline Node.js ESM script that
|
|
13
|
-
* re-runs the findComposeFile candidate logic with a controlled cwd
|
|
14
|
-
* (a plain tmpdir with no monorepo structure) and a fake bundled file,
|
|
15
|
-
* asserting the bundled path is returned.
|
|
16
|
-
*
|
|
17
|
-
* Run: `cd packages/cli && npx vitest run src/commands/__tests__/upgrade.compose-path.test.ts`
|
|
18
|
-
*/
|
|
19
|
-
import { describe, it, expect } from 'vitest';
|
|
20
|
-
import * as fs from 'node:fs';
|
|
21
|
-
import * as os from 'node:os';
|
|
22
|
-
import * as path from 'node:path';
|
|
23
|
-
import { spawnSync } from 'node:child_process';
|
|
24
|
-
import { REPO_ROOT } from './__fixtures__/upgrade-helpers.js';
|
|
25
|
-
const HOST_CP_TS = path.join(REPO_ROOT, 'packages', 'cli', 'src', 'commands', 'host-cp.ts');
|
|
26
|
-
const UPGRADE_TS = path.join(REPO_ROOT, 'packages', 'cli', 'src', 'commands', 'upgrade.ts');
|
|
27
|
-
describe('host-cp.ts — findComposeFile source invariants', () => {
|
|
28
|
-
let src;
|
|
29
|
-
it('reads host-cp.ts source', () => {
|
|
30
|
-
src = fs.readFileSync(HOST_CP_TS, 'utf-8');
|
|
31
|
-
expect(src.length).toBeGreaterThan(1000);
|
|
32
|
-
});
|
|
33
|
-
it('exports findComposeFile (not just defines it)', () => {
|
|
34
|
-
src ??= fs.readFileSync(HOST_CP_TS, 'utf-8');
|
|
35
|
-
expect(src).toMatch(/export\s+function\s+findComposeFile\(\)/);
|
|
36
|
-
});
|
|
37
|
-
it('checks bundled (import.meta.url) path before cwd-based paths', () => {
|
|
38
|
-
src ??= fs.readFileSync(HOST_CP_TS, 'utf-8');
|
|
39
|
-
const fnMatch = src.match(/export\s+function\s+findComposeFile[\s\S]*?\n\}/);
|
|
40
|
-
expect(fnMatch).not.toBeNull();
|
|
41
|
-
const fnBody = fnMatch[0];
|
|
42
|
-
// Bundled candidate uses import.meta.url (not process.cwd)
|
|
43
|
-
const metaUrlIdx = fnBody.indexOf('import.meta.url');
|
|
44
|
-
const cwdIdx = fnBody.indexOf('process.cwd()');
|
|
45
|
-
expect(metaUrlIdx).toBeGreaterThan(0);
|
|
46
|
-
expect(cwdIdx).toBeGreaterThan(metaUrlIdx);
|
|
47
|
-
});
|
|
48
|
-
it('falls through candidates array and returns last-resort cwd path', () => {
|
|
49
|
-
src ??= fs.readFileSync(HOST_CP_TS, 'utf-8');
|
|
50
|
-
// Must have a for-loop that returns on existsSync hit
|
|
51
|
-
expect(src).toMatch(/for\s*\(const c of candidates\)/);
|
|
52
|
-
expect(src).toMatch(/if\s*\(fs\.existsSync\(c\)\)\s*return c/);
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
describe('upgrade.ts — findComposeFile callsite audit', () => {
|
|
56
|
-
let body;
|
|
57
|
-
it('reads upgrade.ts source', () => {
|
|
58
|
-
body = fs.readFileSync(UPGRADE_TS, 'utf-8');
|
|
59
|
-
expect(body.length).toBeGreaterThan(1000);
|
|
60
|
-
});
|
|
61
|
-
it('imports findComposeFile from host-cp.js', () => {
|
|
62
|
-
body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
|
|
63
|
-
expect(body).toMatch(/import\s*\{[^}]*findComposeFile[^}]*\}\s*from\s*['"]\.\/host-cp\.js['"]/);
|
|
64
|
-
});
|
|
65
|
-
it('primary binary-upgrade callsite uses deps.composeFile ?? findComposeFile()', () => {
|
|
66
|
-
body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
|
|
67
|
-
expect(body).toMatch(/deps\.composeFile\s*\?\?\s*findComposeFile\(\)/);
|
|
68
|
-
// Must NOT fall back to path.join(process.cwd(), ...) at this callsite
|
|
69
|
-
expect(body).not.toMatch(/deps\.composeFile\s*\?\?\s*path\.join\s*\(\s*process\.cwd\(\)/);
|
|
70
|
-
});
|
|
71
|
-
it('rollback callsite (handleRollback) uses findComposeFile()', () => {
|
|
72
|
-
body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
|
|
73
|
-
const rollbackStart = body.indexOf('async function handleRollback');
|
|
74
|
-
expect(rollbackStart).toBeGreaterThan(0);
|
|
75
|
-
const rollbackBody = body.slice(rollbackStart, rollbackStart + 3000);
|
|
76
|
-
expect(rollbackBody).toMatch(/const composeFile\s*=\s*findComposeFile\(\)/);
|
|
77
|
-
expect(rollbackBody).not.toMatch(/path\.join\s*\(\s*cwd\s*,\s*'packages\/host-cp\/compose\.yaml'\)/);
|
|
78
|
-
});
|
|
79
|
-
it('all three callsites use findComposeFile() — count ≥ 3', () => {
|
|
80
|
-
body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
|
|
81
|
-
const count = (body.match(/findComposeFile\(\)/g) ?? []).length;
|
|
82
|
-
expect(count).toBeGreaterThanOrEqual(3);
|
|
83
|
-
});
|
|
84
|
-
it('no hardcoded compose path at invocation sites outside validateRepoRoot', () => {
|
|
85
|
-
body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
|
|
86
|
-
// validateRepoRoot legitimately uses path.join(cwd, 'packages/host-cp/compose.yaml')
|
|
87
|
-
// as a repo-root marker check — skip it. Everything after it must use findComposeFile().
|
|
88
|
-
const afterValidateRoot = body.slice(body.indexOf('async function handleRollback'));
|
|
89
|
-
const hardcoded = (afterValidateRoot.match(/path\.join\s*\(\s*(cwd|process\.cwd\(\))\s*,\s*['"]packages\/host-cp\/compose\.yaml['"]\s*\)/g) ?? []).length;
|
|
90
|
-
expect(hardcoded).toBe(0);
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
describe('findComposeFile() — functional: bundled path returned from non-monorepo cwd', () => {
|
|
94
|
-
it('returns the bundled (import.meta.url-relative) path, not the cwd-rooted one', () => {
|
|
95
|
-
// Arrange: a tmpdir tree that mimics an npm-installed package layout:
|
|
96
|
-
// <tmpdir>/pkg/commands/host-cp.js ← simulates import.meta.url
|
|
97
|
-
// <tmpdir>/pkg/host-cp/compose.yaml ← simulates bundled compose
|
|
98
|
-
// cwd is a plain directory with no packages/host-cp/ subtree.
|
|
99
|
-
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-compose-test-'));
|
|
100
|
-
try {
|
|
101
|
-
const pkgDir = path.join(tmpDir, 'pkg');
|
|
102
|
-
const fakeBundledCompose = path.join(pkgDir, 'host-cp', 'compose.yaml');
|
|
103
|
-
// The simulated import.meta.url points into <pkgDir>/commands/
|
|
104
|
-
const fakeImportMetaUrl = 'file://' + path.join(pkgDir, 'commands', 'host-cp.js');
|
|
105
|
-
const cwdDir = path.join(tmpDir, 'some-project');
|
|
106
|
-
fs.mkdirSync(path.dirname(fakeBundledCompose), { recursive: true });
|
|
107
|
-
fs.writeFileSync(fakeBundledCompose, '# fake bundled compose\n');
|
|
108
|
-
fs.mkdirSync(cwdDir, { recursive: true });
|
|
109
|
-
// Inline the findComposeFile candidate logic with the controlled import.meta.url.
|
|
110
|
-
// This mirrors the exact logic in host-cp.ts without depending on the full module.
|
|
111
|
-
const script = `
|
|
112
|
-
import * as fs from 'node:fs';
|
|
113
|
-
import * as path from 'node:path';
|
|
114
|
-
const importMetaUrl = ${JSON.stringify(fakeImportMetaUrl)};
|
|
115
|
-
const candidates = [
|
|
116
|
-
path.resolve(path.dirname(new URL(importMetaUrl).pathname), '../host-cp/compose.yaml'),
|
|
117
|
-
path.resolve(process.cwd(), 'packages/host-cp/compose.yaml'),
|
|
118
|
-
path.resolve(process.cwd(), '../packages/host-cp/compose.yaml'),
|
|
119
|
-
];
|
|
120
|
-
for (const c of candidates) {
|
|
121
|
-
if (fs.existsSync(c)) { process.stdout.write(c); process.exit(0); }
|
|
122
|
-
}
|
|
123
|
-
process.stdout.write(path.resolve(process.cwd(), 'packages/host-cp/compose.yaml'));
|
|
124
|
-
`.trim();
|
|
125
|
-
const result = spawnSync('node', ['--input-type=module'], {
|
|
126
|
-
input: script,
|
|
127
|
-
cwd: cwdDir,
|
|
128
|
-
encoding: 'utf-8',
|
|
129
|
-
});
|
|
130
|
-
expect(result.status).toBe(0);
|
|
131
|
-
expect(result.stdout).toBe(fakeBundledCompose);
|
|
132
|
-
// Must NOT be the cwd-rooted path
|
|
133
|
-
expect(result.stdout).not.toBe(path.join(cwdDir, 'packages/host-cp/compose.yaml'));
|
|
134
|
-
}
|
|
135
|
-
finally {
|
|
136
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
//# sourceMappingURL=upgrade.compose-path.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.compose-path.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/upgrade.compose-path.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Phase 2c — verifies C1 (~/.olam/upgrade.log JSONL writer) + C2 (--history flag).
|
|
3
|
-
*
|
|
4
|
-
* Tests:
|
|
5
|
-
* - appendUpgradeLog: open-per-write, mkdir defensively
|
|
6
|
-
* - readUpgradeLog: ENOENT → empty; corrupt JSON skipped + stderr warn
|
|
7
|
-
* - formatHistoryTable / formatHistoryJson: render shape
|
|
8
|
-
* - formatDuration: ms / s / m / h
|
|
9
|
-
* - parseHistoryOpts: --history -n <N> --json
|
|
10
|
-
* - handleHistory wired from upgrade.ts
|
|
11
|
-
*
|
|
12
|
-
* Run: `cd packages/cli && npx vitest run src/commands/__tests__/upgrade.history.test.ts`
|
|
13
|
-
*/
|
|
14
|
-
export {};
|
|
15
|
-
//# sourceMappingURL=upgrade.history.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.history.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/upgrade.history.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Phase 2c — verifies C1 (~/.olam/upgrade.log JSONL writer) + C2 (--history flag).
|
|
3
|
-
*
|
|
4
|
-
* Tests:
|
|
5
|
-
* - appendUpgradeLog: open-per-write, mkdir defensively
|
|
6
|
-
* - readUpgradeLog: ENOENT → empty; corrupt JSON skipped + stderr warn
|
|
7
|
-
* - formatHistoryTable / formatHistoryJson: render shape
|
|
8
|
-
* - formatDuration: ms / s / m / h
|
|
9
|
-
* - parseHistoryOpts: --history -n <N> --json
|
|
10
|
-
* - handleHistory wired from upgrade.ts
|
|
11
|
-
*
|
|
12
|
-
* Run: `cd packages/cli && npx vitest run src/commands/__tests__/upgrade.history.test.ts`
|
|
13
|
-
*/
|
|
14
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
15
|
-
import * as fs from 'node:fs';
|
|
16
|
-
import * as os from 'node:os';
|
|
17
|
-
import * as path from 'node:path';
|
|
18
|
-
import { appendUpgradeLog, readUpgradeLog, formatHistoryTable, formatHistoryJson, formatDuration, } from '../upgrade-log.js';
|
|
19
|
-
import { parseHistoryOpts } from '../upgrade-history.js';
|
|
20
|
-
let tmpHome;
|
|
21
|
-
let tmpLogPath;
|
|
22
|
-
beforeEach(() => {
|
|
23
|
-
tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-history-test-'));
|
|
24
|
-
tmpLogPath = path.join(tmpHome, '.olam', 'upgrade.log');
|
|
25
|
-
});
|
|
26
|
-
afterEach(() => {
|
|
27
|
-
try {
|
|
28
|
-
fs.rmSync(tmpHome, { recursive: true, force: true });
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
/* best effort */
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
function makeRow(overrides = {}) {
|
|
35
|
-
return {
|
|
36
|
-
ts: '2026-05-07T10:00:00.000Z',
|
|
37
|
-
started_at: 1000,
|
|
38
|
-
ended_at: 2000,
|
|
39
|
-
sha_target: '1234567890abcdef1234567890abcdef12345678',
|
|
40
|
-
sha_before: { hostCp: 'aaaaaaaa', authService: 'aaaaaaaa', devbox: 'aaaaaaaa' },
|
|
41
|
-
sha_after: { hostCp: '12345678', authService: '12345678', devbox: '12345678' },
|
|
42
|
-
status: 'success',
|
|
43
|
-
failed_step: null,
|
|
44
|
-
durations_ms: { 'git pull': 200, 'bash build-host-cp.sh': 800 },
|
|
45
|
-
...overrides,
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
describe('appendUpgradeLog', () => {
|
|
49
|
-
it('creates ~/.olam/ defensively before append', () => {
|
|
50
|
-
// Note: HOME is set to tmpHome by beforeEach.
|
|
51
|
-
const expectedPath = path.join(tmpHome, '.olam', 'upgrade.log');
|
|
52
|
-
expect(fs.existsSync(path.dirname(expectedPath))).toBe(false);
|
|
53
|
-
appendUpgradeLog(makeRow(), tmpLogPath);
|
|
54
|
-
expect(fs.existsSync(path.dirname(expectedPath))).toBe(true);
|
|
55
|
-
expect(fs.existsSync(expectedPath)).toBe(true);
|
|
56
|
-
});
|
|
57
|
-
it('appends one JSONL row per call (newline-terminated)', () => {
|
|
58
|
-
appendUpgradeLog(makeRow({ ts: '2026-05-07T10:00:00.000Z' }), tmpLogPath);
|
|
59
|
-
appendUpgradeLog(makeRow({ ts: '2026-05-07T10:05:00.000Z' }), tmpLogPath);
|
|
60
|
-
const logPath = path.join(tmpHome, '.olam', 'upgrade.log');
|
|
61
|
-
const raw = fs.readFileSync(logPath, 'utf-8');
|
|
62
|
-
const lines = raw.split('\n').filter((l) => l.length > 0);
|
|
63
|
-
expect(lines.length).toBe(2);
|
|
64
|
-
const parsed1 = JSON.parse(lines[0]);
|
|
65
|
-
const parsed2 = JSON.parse(lines[1]);
|
|
66
|
-
expect(parsed1.ts).toBe('2026-05-07T10:00:00.000Z');
|
|
67
|
-
expect(parsed2.ts).toBe('2026-05-07T10:05:00.000Z');
|
|
68
|
-
});
|
|
69
|
-
it('failure to append is swallowed (does not throw)', () => {
|
|
70
|
-
// Make ~/.olam unwritable: replace with a regular file.
|
|
71
|
-
fs.mkdirSync(tmpHome, { recursive: true });
|
|
72
|
-
fs.writeFileSync(path.join(tmpHome, '.olam'), 'this-is-a-file-not-a-dir');
|
|
73
|
-
// Should not throw; logs warning to stderr (we don't assert on stderr here).
|
|
74
|
-
expect(() => appendUpgradeLog(makeRow(), path.join(tmpHome, '.olam', 'upgrade.log'))).not.toThrow();
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
describe('readUpgradeLog', () => {
|
|
78
|
-
it('returns empty array when log file is missing', () => {
|
|
79
|
-
const rows = readUpgradeLog(10, tmpLogPath);
|
|
80
|
-
expect(rows).toEqual([]);
|
|
81
|
-
});
|
|
82
|
-
it('returns empty array when log file is empty', () => {
|
|
83
|
-
fs.mkdirSync(path.join(tmpHome, '.olam'), { recursive: true });
|
|
84
|
-
fs.writeFileSync(path.join(tmpHome, '.olam', 'upgrade.log'), '');
|
|
85
|
-
expect(readUpgradeLog(10, tmpLogPath)).toEqual([]);
|
|
86
|
-
});
|
|
87
|
-
it('reads the most-recent N rows (chronological order, last-N)', () => {
|
|
88
|
-
for (let i = 0; i < 5; i++) {
|
|
89
|
-
appendUpgradeLog(makeRow({ ts: `2026-05-07T${String(i).padStart(2, '0')}:00:00.000Z` }), tmpLogPath);
|
|
90
|
-
}
|
|
91
|
-
const rows = readUpgradeLog(3, tmpLogPath);
|
|
92
|
-
expect(rows.length).toBe(3);
|
|
93
|
-
// Should be the LAST three (chronologically — most recent in the file).
|
|
94
|
-
expect(rows[0].ts).toBe('2026-05-07T02:00:00.000Z');
|
|
95
|
-
expect(rows[1].ts).toBe('2026-05-07T03:00:00.000Z');
|
|
96
|
-
expect(rows[2].ts).toBe('2026-05-07T04:00:00.000Z');
|
|
97
|
-
});
|
|
98
|
-
it('skips corrupt JSON lines + warns to stderr (does not crash)', () => {
|
|
99
|
-
fs.mkdirSync(path.join(tmpHome, '.olam'), { recursive: true });
|
|
100
|
-
const logPath = path.join(tmpHome, '.olam', 'upgrade.log');
|
|
101
|
-
const goodLine = JSON.stringify(makeRow({ ts: '2026-05-07T10:00:00.000Z' }));
|
|
102
|
-
const corrupt = '{ this is not valid JSON';
|
|
103
|
-
fs.writeFileSync(logPath, `${goodLine}\n${corrupt}\n${goodLine}\n`);
|
|
104
|
-
const stderr = vi.spyOn(process.stderr, 'write').mockReturnValue(true);
|
|
105
|
-
const rows = readUpgradeLog(10, tmpLogPath);
|
|
106
|
-
expect(rows.length).toBe(2); // 2 good, 1 skipped corrupt
|
|
107
|
-
expect(stderr).toHaveBeenCalled();
|
|
108
|
-
stderr.mockRestore();
|
|
109
|
-
});
|
|
110
|
-
it('skips rows that lack required fields (defensive shape check)', () => {
|
|
111
|
-
fs.mkdirSync(path.join(tmpHome, '.olam'), { recursive: true });
|
|
112
|
-
const logPath = path.join(tmpHome, '.olam', 'upgrade.log');
|
|
113
|
-
const badShape = JSON.stringify({ random: 'object', without: 'required fields' });
|
|
114
|
-
const good = JSON.stringify(makeRow());
|
|
115
|
-
fs.writeFileSync(logPath, `${badShape}\n${good}\n`);
|
|
116
|
-
const stderr = vi.spyOn(process.stderr, 'write').mockReturnValue(true);
|
|
117
|
-
const rows = readUpgradeLog(10, tmpLogPath);
|
|
118
|
-
expect(rows.length).toBe(1);
|
|
119
|
-
stderr.mockRestore();
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
describe('formatHistoryTable', () => {
|
|
123
|
-
it('returns friendly first-run message on empty rows', () => {
|
|
124
|
-
expect(formatHistoryTable([])).toMatch(/No upgrade history yet/);
|
|
125
|
-
});
|
|
126
|
-
it('renders header + rows for a populated log', () => {
|
|
127
|
-
const out = formatHistoryTable([makeRow()]);
|
|
128
|
-
expect(out).toMatch(/TIMESTAMP/);
|
|
129
|
-
expect(out).toMatch(/STATUS/);
|
|
130
|
-
expect(out).toMatch(/DURATION/);
|
|
131
|
-
expect(out).toMatch(/12345678/); // first 8 of sha_target
|
|
132
|
-
expect(out).toMatch(/✓ success/);
|
|
133
|
-
});
|
|
134
|
-
it('marks failed rows with ✗ + step label', () => {
|
|
135
|
-
const out = formatHistoryTable([
|
|
136
|
-
makeRow({ status: 'failed', failed_step: 'bash build-auth.sh' }),
|
|
137
|
-
]);
|
|
138
|
-
expect(out).toMatch(/✗ failed/);
|
|
139
|
-
expect(out).toContain('bash build-auth.sh');
|
|
140
|
-
});
|
|
141
|
-
it('marks rolled_back rows with ↩', () => {
|
|
142
|
-
const out = formatHistoryTable([makeRow({ status: 'rolled_back' })]);
|
|
143
|
-
expect(out).toMatch(/↩ rolled_back/);
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
describe('formatHistoryJson', () => {
|
|
147
|
-
it('returns JSONL (one JSON object per line, no trailing newline)', () => {
|
|
148
|
-
const out = formatHistoryJson([makeRow({ ts: '2026-05-07T10:00:00.000Z' }), makeRow({ ts: '2026-05-07T10:05:00.000Z' })]);
|
|
149
|
-
const lines = out.split('\n');
|
|
150
|
-
expect(lines.length).toBe(2);
|
|
151
|
-
const parsed1 = JSON.parse(lines[0]);
|
|
152
|
-
const parsed2 = JSON.parse(lines[1]);
|
|
153
|
-
expect(parsed1.ts).toBe('2026-05-07T10:00:00.000Z');
|
|
154
|
-
expect(parsed2.ts).toBe('2026-05-07T10:05:00.000Z');
|
|
155
|
-
});
|
|
156
|
-
it('returns empty string on empty rows', () => {
|
|
157
|
-
expect(formatHistoryJson([])).toBe('');
|
|
158
|
-
});
|
|
159
|
-
});
|
|
160
|
-
describe('formatDuration', () => {
|
|
161
|
-
it('renders ms for sub-second', () => {
|
|
162
|
-
expect(formatDuration(500)).toBe('500ms');
|
|
163
|
-
});
|
|
164
|
-
it('renders s for sub-minute', () => {
|
|
165
|
-
expect(formatDuration(45_000)).toBe('45s');
|
|
166
|
-
});
|
|
167
|
-
it('renders m + s for sub-hour', () => {
|
|
168
|
-
expect(formatDuration(125_000)).toBe('2m05s');
|
|
169
|
-
});
|
|
170
|
-
it('renders h + m for hour-plus', () => {
|
|
171
|
-
expect(formatDuration(3_780_000)).toBe('1h03m');
|
|
172
|
-
});
|
|
173
|
-
});
|
|
174
|
-
describe('parseHistoryOpts', () => {
|
|
175
|
-
it('parses -n string number', () => {
|
|
176
|
-
expect(parseHistoryOpts({ n: '5' }).limit).toBe(5);
|
|
177
|
-
});
|
|
178
|
-
it('parses -n numeric', () => {
|
|
179
|
-
expect(parseHistoryOpts({ n: 7 }).limit).toBe(7);
|
|
180
|
-
});
|
|
181
|
-
it('defaults limit to 10 when -n absent', () => {
|
|
182
|
-
expect(parseHistoryOpts({}).limit).toBe(10);
|
|
183
|
-
});
|
|
184
|
-
it('clamps non-positive -n to default 10', () => {
|
|
185
|
-
expect(parseHistoryOpts({ n: '0' }).limit).toBe(10);
|
|
186
|
-
expect(parseHistoryOpts({ n: '-3' }).limit).toBe(10);
|
|
187
|
-
});
|
|
188
|
-
it('parses --json flag', () => {
|
|
189
|
-
expect(parseHistoryOpts({ json: true }).json).toBe(true);
|
|
190
|
-
expect(parseHistoryOpts({ json: false }).json).toBe(false);
|
|
191
|
-
});
|
|
192
|
-
});
|
|
193
|
-
describe('Phase 2c — wired in handleUpgrade', () => {
|
|
194
|
-
it('upgrade.ts dispatches to handleHistory when opts.history', () => {
|
|
195
|
-
const upgradeTs = fs.readFileSync(path.join(__dirname, '..', 'upgrade.ts'), 'utf-8');
|
|
196
|
-
expect(upgradeTs).toMatch(/if\s*\(opts\.history\)\s*\{[\s\S]*?handleHistory\(/);
|
|
197
|
-
});
|
|
198
|
-
});
|
|
199
|
-
//# sourceMappingURL=upgrade.history.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.history.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/upgrade.history.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for `olam upgrade` CLI lock (Phase 2a — A1).
|
|
3
|
-
*
|
|
4
|
-
* Verifies the contract from `packages/cli/src/commands/upgrade-lock.ts`:
|
|
5
|
-
* - Atomic create-or-fail via fs.openSync 'wx'
|
|
6
|
-
* - Stale-lock recovery (empty / parse-error / dead-pid / >30min timeout)
|
|
7
|
-
* - PID liveness check via process.kill(pid, 0)
|
|
8
|
-
* - Command-name check via `ps -p <pid> -o comm=`
|
|
9
|
-
* - Idempotent release
|
|
10
|
-
* - Concurrent-acquisition refusal
|
|
11
|
-
*
|
|
12
|
-
* Run: `cd packages/cli && npx vitest run src/commands/__tests__/upgrade.lock.test.ts`
|
|
13
|
-
*/
|
|
14
|
-
export {};
|
|
15
|
-
//# sourceMappingURL=upgrade.lock.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.lock.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/upgrade.lock.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|