@pleri/olam-cli 0.1.7
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/__tests__/auth-status.test.d.ts +2 -0
- package/dist/__tests__/auth-status.test.d.ts.map +1 -0
- package/dist/__tests__/auth-status.test.js +290 -0
- package/dist/__tests__/auth-status.test.js.map +1 -0
- package/dist/__tests__/auth-upgrade.test.d.ts +9 -0
- package/dist/__tests__/auth-upgrade.test.d.ts.map +1 -0
- package/dist/__tests__/auth-upgrade.test.js +161 -0
- package/dist/__tests__/auth-upgrade.test.js.map +1 -0
- package/dist/__tests__/create-app-urls.test.d.ts +2 -0
- package/dist/__tests__/create-app-urls.test.d.ts.map +1 -0
- package/dist/__tests__/create-app-urls.test.js +102 -0
- package/dist/__tests__/create-app-urls.test.js.map +1 -0
- package/dist/__tests__/enter.test.d.ts +2 -0
- package/dist/__tests__/enter.test.d.ts.map +1 -0
- package/dist/__tests__/enter.test.js +90 -0
- package/dist/__tests__/enter.test.js.map +1 -0
- package/dist/__tests__/host-cp-gh-token.test.d.ts +9 -0
- package/dist/__tests__/host-cp-gh-token.test.d.ts.map +1 -0
- package/dist/__tests__/host-cp-gh-token.test.js +119 -0
- package/dist/__tests__/host-cp-gh-token.test.js.map +1 -0
- package/dist/__tests__/host-cp.test.d.ts +9 -0
- package/dist/__tests__/host-cp.test.d.ts.map +1 -0
- package/dist/__tests__/host-cp.test.js +254 -0
- package/dist/__tests__/host-cp.test.js.map +1 -0
- package/dist/__tests__/keys.test.d.ts +9 -0
- package/dist/__tests__/keys.test.d.ts.map +1 -0
- package/dist/__tests__/keys.test.js +145 -0
- package/dist/__tests__/keys.test.js.map +1 -0
- package/dist/__tests__/logs.test.d.ts +9 -0
- package/dist/__tests__/logs.test.d.ts.map +1 -0
- package/dist/__tests__/logs.test.js +124 -0
- package/dist/__tests__/logs.test.js.map +1 -0
- package/dist/__tests__/ps.test.d.ts +2 -0
- package/dist/__tests__/ps.test.d.ts.map +1 -0
- package/dist/__tests__/ps.test.js +172 -0
- package/dist/__tests__/ps.test.js.map +1 -0
- package/dist/__tests__/status-app-urls.test.d.ts +2 -0
- package/dist/__tests__/status-app-urls.test.d.ts.map +1 -0
- package/dist/__tests__/status-app-urls.test.js +125 -0
- package/dist/__tests__/status-app-urls.test.js.map +1 -0
- package/dist/__tests__/upgrade.test.d.ts +9 -0
- package/dist/__tests__/upgrade.test.d.ts.map +1 -0
- package/dist/__tests__/upgrade.test.js +262 -0
- package/dist/__tests__/upgrade.test.js.map +1 -0
- package/dist/commands/__tests__/carry-uncommitted.test.d.ts +14 -0
- package/dist/commands/__tests__/carry-uncommitted.test.d.ts.map +1 -0
- package/dist/commands/__tests__/carry-uncommitted.test.js +83 -0
- package/dist/commands/__tests__/carry-uncommitted.test.js.map +1 -0
- package/dist/commands/__tests__/openHostCpUrl.test.d.ts +2 -0
- package/dist/commands/__tests__/openHostCpUrl.test.d.ts.map +1 -0
- package/dist/commands/__tests__/openHostCpUrl.test.js +63 -0
- package/dist/commands/__tests__/openHostCpUrl.test.js.map +1 -0
- package/dist/commands/__tests__/refresh.test.d.ts +13 -0
- package/dist/commands/__tests__/refresh.test.d.ts.map +1 -0
- package/dist/commands/__tests__/refresh.test.js +170 -0
- package/dist/commands/__tests__/refresh.test.js.map +1 -0
- package/dist/commands/auth-status.d.ts +43 -0
- package/dist/commands/auth-status.d.ts.map +1 -0
- package/dist/commands/auth-status.js +208 -0
- package/dist/commands/auth-status.js.map +1 -0
- package/dist/commands/auth-upgrade.d.ts +47 -0
- package/dist/commands/auth-upgrade.d.ts.map +1 -0
- package/dist/commands/auth-upgrade.js +277 -0
- package/dist/commands/auth-upgrade.js.map +1 -0
- package/dist/commands/auth.d.ts +16 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +283 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/create.d.ts +8 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +512 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/crystallize.d.ts +8 -0
- package/dist/commands/crystallize.d.ts.map +1 -0
- package/dist/commands/crystallize.js +101 -0
- package/dist/commands/crystallize.js.map +1 -0
- package/dist/commands/destroy.d.ts +6 -0
- package/dist/commands/destroy.d.ts.map +1 -0
- package/dist/commands/destroy.js +54 -0
- package/dist/commands/destroy.js.map +1 -0
- package/dist/commands/dispatch.d.ts +9 -0
- package/dist/commands/dispatch.d.ts.map +1 -0
- package/dist/commands/dispatch.js +94 -0
- package/dist/commands/dispatch.js.map +1 -0
- package/dist/commands/enter.d.ts +63 -0
- package/dist/commands/enter.d.ts.map +1 -0
- package/dist/commands/enter.js +206 -0
- package/dist/commands/enter.js.map +1 -0
- package/dist/commands/host-cp.d.ts +191 -0
- package/dist/commands/host-cp.d.ts.map +1 -0
- package/dist/commands/host-cp.js +797 -0
- package/dist/commands/host-cp.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +143 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +22 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +203 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/keys.d.ts +26 -0
- package/dist/commands/keys.d.ts.map +1 -0
- package/dist/commands/keys.js +151 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/lanes.d.ts +18 -0
- package/dist/commands/lanes.d.ts.map +1 -0
- package/dist/commands/lanes.js +122 -0
- package/dist/commands/lanes.js.map +1 -0
- package/dist/commands/list.d.ts +6 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +39 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/logs.d.ts +38 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +177 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/observe.d.ts +9 -0
- package/dist/commands/observe.d.ts.map +1 -0
- package/dist/commands/observe.js +34 -0
- package/dist/commands/observe.js.map +1 -0
- package/dist/commands/policy-check.d.ts +14 -0
- package/dist/commands/policy-check.d.ts.map +1 -0
- package/dist/commands/policy-check.js +76 -0
- package/dist/commands/policy-check.js.map +1 -0
- package/dist/commands/pr.d.ts +17 -0
- package/dist/commands/pr.d.ts.map +1 -0
- package/dist/commands/pr.js +148 -0
- package/dist/commands/pr.js.map +1 -0
- package/dist/commands/ps.d.ts +25 -0
- package/dist/commands/ps.d.ts.map +1 -0
- package/dist/commands/ps.js +164 -0
- package/dist/commands/ps.js.map +1 -0
- package/dist/commands/refresh-helpers.d.ts +25 -0
- package/dist/commands/refresh-helpers.d.ts.map +1 -0
- package/dist/commands/refresh-helpers.js +56 -0
- package/dist/commands/refresh-helpers.js.map +1 -0
- package/dist/commands/refresh.d.ts +23 -0
- package/dist/commands/refresh.d.ts.map +1 -0
- package/dist/commands/refresh.js +237 -0
- package/dist/commands/refresh.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +51 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/upgrade.d.ts +67 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +358 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/workspace.d.ts +23 -0
- package/dist/commands/workspace.d.ts.map +1 -0
- package/dist/commands/workspace.js +198 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/commands/world-snapshot.d.ts +18 -0
- package/dist/commands/world-snapshot.d.ts.map +1 -0
- package/dist/commands/world-snapshot.js +327 -0
- package/dist/commands/world-snapshot.js.map +1 -0
- package/dist/context.d.ts +26 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +51 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18007 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server.js +32236 -0
- package/dist/output.d.ts +10 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +31 -0
- package/dist/output.js.map +1 -0
- package/host-cp/compose.yaml +126 -0
- package/host-cp/src/auth-secret-hint.mjs +45 -0
- package/host-cp/src/auth.mjs +155 -0
- package/host-cp/src/compose-worlds-sources.mjs +170 -0
- package/host-cp/src/container-secret-fetcher.mjs +163 -0
- package/host-cp/src/docker-events.mjs +184 -0
- package/host-cp/src/local-worlds-source.mjs +83 -0
- package/host-cp/src/plan-orchestrator.mjs +829 -0
- package/host-cp/src/plan-progress.mjs +282 -0
- package/host-cp/src/pr-cache.mjs +201 -0
- package/host-cp/src/pr-merge-poller.mjs +154 -0
- package/host-cp/src/process-poller.mjs +250 -0
- package/host-cp/src/proxy.mjs +245 -0
- package/host-cp/src/pylon-worlds-source.mjs +68 -0
- package/host-cp/src/redact.mjs +67 -0
- package/host-cp/src/secret-cache.mjs +104 -0
- package/host-cp/src/server.mjs +2215 -0
- package/host-cp/src/sse-gate.mjs +117 -0
- package/host-cp/src/version-status.mjs +209 -0
- package/host-cp/src/workspace-catalog.mjs +149 -0
- package/host-cp/src/world-names-store.mjs +176 -0
- package/host-cp/src/world-pr-state.mjs +97 -0
- package/host-cp/src/world-progress.mjs +322 -0
- package/host-cp/src/world-tunnel-manager.mjs +288 -0
- package/host-cp/src/worlds-db-source.mjs +191 -0
- package/host-cp/src/worlds-source.mjs +59 -0
- package/package.json +38 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-app-urls.test.js","sourceRoot":"","sources":["../../src/__tests__/status-app-urls.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for upgrade.ts pure helpers.
|
|
3
|
+
*
|
|
4
|
+
* Only tests the stateless, side-effect-free helpers. The full upgrade
|
|
5
|
+
* pipeline (git, npm, docker) is too side-effectful to integration-test
|
|
6
|
+
* inside the devbox — same philosophy as host-cp.test.ts.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=upgrade.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/upgrade.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for upgrade.ts pure helpers.
|
|
3
|
+
*
|
|
4
|
+
* Only tests the stateless, side-effect-free helpers. The full upgrade
|
|
5
|
+
* pipeline (git, npm, docker) is too side-effectful to integration-test
|
|
6
|
+
* inside the devbox — same philosophy as host-cp.test.ts.
|
|
7
|
+
*/
|
|
8
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
9
|
+
import * as fs from 'node:fs';
|
|
10
|
+
import * as os from 'node:os';
|
|
11
|
+
import * as path from 'node:path';
|
|
12
|
+
import { validateRepoRoot, parseUpgradeOpts, extractBundleHash, isNodeModulesInSync, shouldSkipInstall } from '../commands/upgrade.js';
|
|
13
|
+
// ── validateRepoRoot ──────────────────────────────────────────────
|
|
14
|
+
describe('validateRepoRoot', () => {
|
|
15
|
+
let tmpDir;
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-upgrade-test-'));
|
|
18
|
+
});
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
21
|
+
});
|
|
22
|
+
it('returns ok:false when the marker file is absent', () => {
|
|
23
|
+
const result = validateRepoRoot(tmpDir);
|
|
24
|
+
expect(result.ok).toBe(false);
|
|
25
|
+
if (!result.ok) {
|
|
26
|
+
expect(result.error).toMatch(/packages\/host-cp\/compose\.yaml/);
|
|
27
|
+
expect(result.error).toMatch(/olam repo root/i);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
it('returns ok:true when packages/host-cp/compose.yaml exists', () => {
|
|
31
|
+
const marker = path.join(tmpDir, 'packages/host-cp');
|
|
32
|
+
fs.mkdirSync(marker, { recursive: true });
|
|
33
|
+
fs.writeFileSync(path.join(marker, 'compose.yaml'), 'services: {}');
|
|
34
|
+
const result = validateRepoRoot(tmpDir);
|
|
35
|
+
expect(result.ok).toBe(true);
|
|
36
|
+
});
|
|
37
|
+
it('error message includes the expected path', () => {
|
|
38
|
+
const result = validateRepoRoot('/nonexistent-definitely-not-a-real-path');
|
|
39
|
+
expect(result.ok).toBe(false);
|
|
40
|
+
if (!result.ok) {
|
|
41
|
+
expect(result.error).toContain('compose.yaml');
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
it('is case-sensitive (compose.yaml != Compose.yaml)', () => {
|
|
45
|
+
const marker = path.join(tmpDir, 'packages/host-cp');
|
|
46
|
+
fs.mkdirSync(marker, { recursive: true });
|
|
47
|
+
fs.writeFileSync(path.join(marker, 'Compose.yaml'), 'services: {}');
|
|
48
|
+
// Only exact match should pass
|
|
49
|
+
const result = validateRepoRoot(tmpDir);
|
|
50
|
+
// On case-sensitive filesystems this should be false
|
|
51
|
+
// On case-insensitive (macOS) it may be true — accept either
|
|
52
|
+
expect(typeof result.ok).toBe('boolean');
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
// ── parseUpgradeOpts ──────────────────────────────────────────────
|
|
56
|
+
describe('parseUpgradeOpts', () => {
|
|
57
|
+
it('defaults all options to false/null when called with empty object', () => {
|
|
58
|
+
const opts = parseUpgradeOpts({});
|
|
59
|
+
expect(opts.yes).toBe(false);
|
|
60
|
+
expect(opts.skipImage).toBe(false);
|
|
61
|
+
expect(opts.branch).toBeNull();
|
|
62
|
+
});
|
|
63
|
+
it('sets yes:true when raw.yes is true', () => {
|
|
64
|
+
expect(parseUpgradeOpts({ yes: true }).yes).toBe(true);
|
|
65
|
+
});
|
|
66
|
+
it('sets yes:false when raw.yes is false', () => {
|
|
67
|
+
expect(parseUpgradeOpts({ yes: false }).yes).toBe(false);
|
|
68
|
+
});
|
|
69
|
+
it('sets yes:false when raw.yes is undefined', () => {
|
|
70
|
+
expect(parseUpgradeOpts({ yes: undefined }).yes).toBe(false);
|
|
71
|
+
});
|
|
72
|
+
it('sets skipImage:true when raw.skipImage is true', () => {
|
|
73
|
+
expect(parseUpgradeOpts({ skipImage: true }).skipImage).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
it('sets skipImage:false when raw.skipImage is undefined', () => {
|
|
76
|
+
expect(parseUpgradeOpts({}).skipImage).toBe(false);
|
|
77
|
+
});
|
|
78
|
+
it('sets branch to the provided string', () => {
|
|
79
|
+
expect(parseUpgradeOpts({ branch: 'main' }).branch).toBe('main');
|
|
80
|
+
});
|
|
81
|
+
it('sets branch to null when raw.branch is undefined', () => {
|
|
82
|
+
expect(parseUpgradeOpts({}).branch).toBeNull();
|
|
83
|
+
});
|
|
84
|
+
it('accepts all three options at once', () => {
|
|
85
|
+
const opts = parseUpgradeOpts({ yes: true, skipImage: true, branch: 'feat/foo' });
|
|
86
|
+
expect(opts.yes).toBe(true);
|
|
87
|
+
expect(opts.skipImage).toBe(true);
|
|
88
|
+
expect(opts.branch).toBe('feat/foo');
|
|
89
|
+
});
|
|
90
|
+
it('result is a plain object (no mutation of input)', () => {
|
|
91
|
+
const raw = { yes: true };
|
|
92
|
+
const opts = parseUpgradeOpts(raw);
|
|
93
|
+
expect(opts).not.toBe(raw);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
// ── extractBundleHash ─────────────────────────────────────────────
|
|
97
|
+
describe('extractBundleHash', () => {
|
|
98
|
+
const sampleHtml = `<!doctype html>
|
|
99
|
+
<html>
|
|
100
|
+
<head>
|
|
101
|
+
<script type="module" crossorigin src="/assets/index-Cp8kX3Zq.js"></script>
|
|
102
|
+
<link rel="stylesheet" crossorigin href="/assets/index-BvXm2OiK.css">
|
|
103
|
+
</head>
|
|
104
|
+
<body><div id="root"></div></body>
|
|
105
|
+
</html>`;
|
|
106
|
+
it('extracts the hash from the JS bundle reference', () => {
|
|
107
|
+
expect(extractBundleHash(sampleHtml)).toBe('Cp8kX3Zq');
|
|
108
|
+
});
|
|
109
|
+
it('returns null for empty string', () => {
|
|
110
|
+
expect(extractBundleHash('')).toBeNull();
|
|
111
|
+
});
|
|
112
|
+
it('returns null when no /assets/index-*.js reference exists', () => {
|
|
113
|
+
expect(extractBundleHash('<html><body>hello</body></html>')).toBeNull();
|
|
114
|
+
});
|
|
115
|
+
it('handles hashes with underscores and hyphens', () => {
|
|
116
|
+
const html = '<script src="/assets/index-A_b-C123.js"></script>';
|
|
117
|
+
expect(extractBundleHash(html)).toBe('A_b-C123');
|
|
118
|
+
});
|
|
119
|
+
it('handles longer hashes (Vite typically emits 8 chars but can vary)', () => {
|
|
120
|
+
const html = '<script src="/assets/index-abcdef0123456789.js"></script>';
|
|
121
|
+
expect(extractBundleHash(html)).toBe('abcdef0123456789');
|
|
122
|
+
});
|
|
123
|
+
it('returns the first match when multiple script tags are present', () => {
|
|
124
|
+
const html = `
|
|
125
|
+
<script src="/assets/index-FIRST1234.js"></script>
|
|
126
|
+
<script src="/assets/index-SECOND567.js"></script>
|
|
127
|
+
`;
|
|
128
|
+
expect(extractBundleHash(html)).toBe('FIRST1234');
|
|
129
|
+
});
|
|
130
|
+
it('is not confused by non-index bundle references', () => {
|
|
131
|
+
// Should only match /assets/index-<hash>.js, not other chunks
|
|
132
|
+
const html = '<script src="/assets/vendor-ABC123.js"></script>';
|
|
133
|
+
expect(extractBundleHash(html)).toBeNull();
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
// ── parseUpgradeOpts — skipInstall ────────────────────────────────
|
|
137
|
+
describe('parseUpgradeOpts — skipInstall field', () => {
|
|
138
|
+
it('defaults skipInstall to false', () => {
|
|
139
|
+
expect(parseUpgradeOpts({}).skipInstall).toBe(false);
|
|
140
|
+
});
|
|
141
|
+
it('sets skipInstall:true when raw.skipInstall is true', () => {
|
|
142
|
+
expect(parseUpgradeOpts({ skipInstall: true }).skipInstall).toBe(true);
|
|
143
|
+
});
|
|
144
|
+
it('sets skipInstall:false when raw.skipInstall is false', () => {
|
|
145
|
+
expect(parseUpgradeOpts({ skipInstall: false }).skipInstall).toBe(false);
|
|
146
|
+
});
|
|
147
|
+
it('accepts all four options at once', () => {
|
|
148
|
+
const opts = parseUpgradeOpts({ yes: true, skipImage: true, skipInstall: true, branch: 'feat/x' });
|
|
149
|
+
expect(opts.yes).toBe(true);
|
|
150
|
+
expect(opts.skipImage).toBe(true);
|
|
151
|
+
expect(opts.skipInstall).toBe(true);
|
|
152
|
+
expect(opts.branch).toBe('feat/x');
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
// ── isNodeModulesInSync ───────────────────────────────────────────
|
|
156
|
+
describe('isNodeModulesInSync', () => {
|
|
157
|
+
let tmpDir;
|
|
158
|
+
beforeEach(() => {
|
|
159
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-sync-test-'));
|
|
160
|
+
});
|
|
161
|
+
afterEach(() => {
|
|
162
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
163
|
+
});
|
|
164
|
+
function writeLock(content = '{"lockfileVersion":3}') {
|
|
165
|
+
fs.writeFileSync(path.join(tmpDir, 'package-lock.json'), content);
|
|
166
|
+
}
|
|
167
|
+
function writeMarker(content = '{"lockfileVersion":3}', mtimeOffsetMs = 100) {
|
|
168
|
+
const markerDir = path.join(tmpDir, 'node_modules');
|
|
169
|
+
fs.mkdirSync(markerDir, { recursive: true });
|
|
170
|
+
const markerPath = path.join(markerDir, '.package-lock.json');
|
|
171
|
+
fs.writeFileSync(markerPath, content);
|
|
172
|
+
// Bump mtime so marker is newer than lockfile by default.
|
|
173
|
+
const lockStat = fs.statSync(path.join(tmpDir, 'package-lock.json'));
|
|
174
|
+
const newMtime = new Date(lockStat.mtimeMs + mtimeOffsetMs);
|
|
175
|
+
fs.utimesSync(markerPath, newMtime, newMtime);
|
|
176
|
+
}
|
|
177
|
+
it('returns false when package-lock.json is absent', () => {
|
|
178
|
+
// no lockfile, no marker
|
|
179
|
+
expect(isNodeModulesInSync(tmpDir)).toBe(false);
|
|
180
|
+
});
|
|
181
|
+
it('returns false when node_modules/.package-lock.json is absent', () => {
|
|
182
|
+
writeLock();
|
|
183
|
+
// no marker
|
|
184
|
+
expect(isNodeModulesInSync(tmpDir)).toBe(false);
|
|
185
|
+
});
|
|
186
|
+
it('returns true when marker mtime >= lockfile mtime (install ran after last lock change)', () => {
|
|
187
|
+
writeLock();
|
|
188
|
+
writeMarker('{}', 200); // marker is 200ms newer than lockfile
|
|
189
|
+
expect(isNodeModulesInSync(tmpDir)).toBe(true);
|
|
190
|
+
});
|
|
191
|
+
it('returns false when lockfile mtime > marker mtime (lockfile changed after last install)', () => {
|
|
192
|
+
writeLock();
|
|
193
|
+
// Write marker with mtime older than the lockfile.
|
|
194
|
+
const markerDir = path.join(tmpDir, 'node_modules');
|
|
195
|
+
fs.mkdirSync(markerDir, { recursive: true });
|
|
196
|
+
const markerPath = path.join(markerDir, '.package-lock.json');
|
|
197
|
+
fs.writeFileSync(markerPath, '{}');
|
|
198
|
+
// Set marker mtime to 1 second before lockfile.
|
|
199
|
+
const lockStat = fs.statSync(path.join(tmpDir, 'package-lock.json'));
|
|
200
|
+
const oldMtime = new Date(lockStat.mtimeMs - 1000);
|
|
201
|
+
fs.utimesSync(markerPath, oldMtime, oldMtime);
|
|
202
|
+
expect(isNodeModulesInSync(tmpDir)).toBe(false);
|
|
203
|
+
});
|
|
204
|
+
it('returns true when marker mtime is 1ms after lockfile mtime (boundary)', () => {
|
|
205
|
+
writeLock();
|
|
206
|
+
writeMarker('{}', 1); // 1ms newer
|
|
207
|
+
expect(isNodeModulesInSync(tmpDir)).toBe(true);
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
// ── shouldSkipInstall ─────────────────────────────────────────────
|
|
211
|
+
describe('shouldSkipInstall', () => {
|
|
212
|
+
let tmpDir;
|
|
213
|
+
beforeEach(() => {
|
|
214
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-skip-test-'));
|
|
215
|
+
});
|
|
216
|
+
afterEach(() => {
|
|
217
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
218
|
+
});
|
|
219
|
+
it('skips when --skip-install flag is set (regardless of sync state)', () => {
|
|
220
|
+
// No lockfile / marker at all — would normally not skip.
|
|
221
|
+
const result = shouldSkipInstall({ skipInstall: true }, tmpDir);
|
|
222
|
+
expect(result.skip).toBe(true);
|
|
223
|
+
if (result.skip) {
|
|
224
|
+
expect(result.reason).toMatch(/--skip-install/i);
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
it('skips when flag is false but node_modules is in sync', () => {
|
|
228
|
+
// Write lockfile and a newer marker.
|
|
229
|
+
fs.writeFileSync(path.join(tmpDir, 'package-lock.json'), '{}');
|
|
230
|
+
const markerDir = path.join(tmpDir, 'node_modules');
|
|
231
|
+
fs.mkdirSync(markerDir, { recursive: true });
|
|
232
|
+
const markerPath = path.join(markerDir, '.package-lock.json');
|
|
233
|
+
fs.writeFileSync(markerPath, '{}');
|
|
234
|
+
const lockStat = fs.statSync(path.join(tmpDir, 'package-lock.json'));
|
|
235
|
+
const newerMtime = new Date(lockStat.mtimeMs + 500);
|
|
236
|
+
fs.utimesSync(markerPath, newerMtime, newerMtime);
|
|
237
|
+
const result = shouldSkipInstall({ skipInstall: false }, tmpDir);
|
|
238
|
+
expect(result.skip).toBe(true);
|
|
239
|
+
if (result.skip) {
|
|
240
|
+
expect(result.reason).toMatch(/in sync/i);
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
it('does not skip when flag is false and node_modules is NOT in sync', () => {
|
|
244
|
+
// No marker → not in sync.
|
|
245
|
+
fs.writeFileSync(path.join(tmpDir, 'package-lock.json'), '{}');
|
|
246
|
+
const result = shouldSkipInstall({ skipInstall: false }, tmpDir);
|
|
247
|
+
expect(result.skip).toBe(false);
|
|
248
|
+
});
|
|
249
|
+
it('does not skip when flag is false and marker is older than lockfile', () => {
|
|
250
|
+
fs.writeFileSync(path.join(tmpDir, 'package-lock.json'), '{}');
|
|
251
|
+
const markerDir = path.join(tmpDir, 'node_modules');
|
|
252
|
+
fs.mkdirSync(markerDir, { recursive: true });
|
|
253
|
+
const markerPath = path.join(markerDir, '.package-lock.json');
|
|
254
|
+
fs.writeFileSync(markerPath, '{}');
|
|
255
|
+
const lockStat = fs.statSync(path.join(tmpDir, 'package-lock.json'));
|
|
256
|
+
const oldMtime = new Date(lockStat.mtimeMs - 2000);
|
|
257
|
+
fs.utimesSync(markerPath, oldMtime, oldMtime);
|
|
258
|
+
const result = shouldSkipInstall({ skipInstall: false }, tmpDir);
|
|
259
|
+
expect(result.skip).toBe(false);
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
//# sourceMappingURL=upgrade.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade.test.js","sourceRoot":"","sources":["../../src/__tests__/upgrade.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase B B3 (olam-session-stability): unit tests for the
|
|
3
|
+
* --carry-uncommitted CLI flag.
|
|
4
|
+
*
|
|
5
|
+
* Strategy: programmatic commander parse + an in-memory listener that
|
|
6
|
+
* captures the parsed opts before the action handler's network calls
|
|
7
|
+
* fire. This sidesteps the heavy fixtures the action handler needs
|
|
8
|
+
* (host-cp, devbox image, world registry) — we only care that the flag
|
|
9
|
+
* is recognized + flows through to the createWorld opts shape.
|
|
10
|
+
*
|
|
11
|
+
* Run: `cd packages/cli && npx vitest run src/commands/__tests__/carry-uncommitted.test.ts`
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=carry-uncommitted.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"carry-uncommitted.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/carry-uncommitted.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase B B3 (olam-session-stability): unit tests for the
|
|
3
|
+
* --carry-uncommitted CLI flag.
|
|
4
|
+
*
|
|
5
|
+
* Strategy: programmatic commander parse + an in-memory listener that
|
|
6
|
+
* captures the parsed opts before the action handler's network calls
|
|
7
|
+
* fire. This sidesteps the heavy fixtures the action handler needs
|
|
8
|
+
* (host-cp, devbox image, world registry) — we only care that the flag
|
|
9
|
+
* is recognized + flows through to the createWorld opts shape.
|
|
10
|
+
*
|
|
11
|
+
* Run: `cd packages/cli && npx vitest run src/commands/__tests__/carry-uncommitted.test.ts`
|
|
12
|
+
*/
|
|
13
|
+
import { describe, it, expect } from 'vitest';
|
|
14
|
+
import { Command } from 'commander';
|
|
15
|
+
/**
|
|
16
|
+
* Build a minimal commander Command that mirrors the real `olam create`
|
|
17
|
+
* flag set + captures parsed opts via the action handler. We do NOT
|
|
18
|
+
* import the real `registerCreate` because it pulls in @olam/core +
|
|
19
|
+
* host-cp + ora; loading those drags ~2s of startup into the test for
|
|
20
|
+
* no extra signal. Instead we build a faithful copy of just the flag
|
|
21
|
+
* declarations under test.
|
|
22
|
+
*
|
|
23
|
+
* If the real flag set ever drifts from this fixture, the
|
|
24
|
+
* `recognizes the flag in the option chain` test should fail loudly
|
|
25
|
+
* (run-time `--help` mismatch).
|
|
26
|
+
*/
|
|
27
|
+
function buildTestCommand() {
|
|
28
|
+
const captured = { opts: null };
|
|
29
|
+
const program = new Command();
|
|
30
|
+
program.exitOverride(); // never call process.exit on parse error
|
|
31
|
+
program
|
|
32
|
+
.command('create')
|
|
33
|
+
.option('--name <name>', 'World name')
|
|
34
|
+
.option('--workspace <name>', 'Named workspace')
|
|
35
|
+
.option('--task <task>', 'Initial task')
|
|
36
|
+
.option('--carry-uncommitted', "Preserve operator's uncommitted edits in the world's worktree (B3)")
|
|
37
|
+
.action((opts) => {
|
|
38
|
+
captured.opts = opts;
|
|
39
|
+
});
|
|
40
|
+
return { program, captured };
|
|
41
|
+
}
|
|
42
|
+
describe('olam create --carry-uncommitted flag', () => {
|
|
43
|
+
it('parses to carryUncommitted:true when flag is passed', () => {
|
|
44
|
+
const { program, captured } = buildTestCommand();
|
|
45
|
+
program.parse(['create', '--carry-uncommitted'], { from: 'user' });
|
|
46
|
+
expect(captured.opts?.carryUncommitted).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
it('parses to carryUncommitted:undefined (falsy) when flag is omitted', () => {
|
|
49
|
+
const { program, captured } = buildTestCommand();
|
|
50
|
+
program.parse(['create', '--name', 'foo'], { from: 'user' });
|
|
51
|
+
expect(captured.opts?.carryUncommitted).toBeFalsy();
|
|
52
|
+
});
|
|
53
|
+
it('coexists with other flags (--name, --workspace, --task) without conflict', () => {
|
|
54
|
+
const { program, captured } = buildTestCommand();
|
|
55
|
+
program.parse(['create', '--name', 'foo', '--workspace', 'atlas', '--task', 'do thing', '--carry-uncommitted'], { from: 'user' });
|
|
56
|
+
expect(captured.opts?.name).toBe('foo');
|
|
57
|
+
expect(captured.opts?.workspace).toBe('atlas');
|
|
58
|
+
expect(captured.opts?.task).toBe('do thing');
|
|
59
|
+
expect(captured.opts?.carryUncommitted).toBe(true);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe('--carry-uncommitted maps to CreateWorldOpts.carryUncommitted', () => {
|
|
63
|
+
it('the createWorld opts shape includes carryUncommitted: <bool>', () => {
|
|
64
|
+
// Contract test: when the action handler builds its createWorld
|
|
65
|
+
// opts dict, `carryUncommitted: opts.carryUncommitted ?? false`
|
|
66
|
+
// must be present so the manager's conditional skip fires correctly.
|
|
67
|
+
// Mirror the build expression here so a future refactor that drops
|
|
68
|
+
// the field gets caught.
|
|
69
|
+
const cliOpts = { carryUncommitted: true };
|
|
70
|
+
const createWorldOpts = {
|
|
71
|
+
name: 'foo',
|
|
72
|
+
carryUncommitted: cliOpts.carryUncommitted ?? false,
|
|
73
|
+
};
|
|
74
|
+
expect(createWorldOpts.carryUncommitted).toBe(true);
|
|
75
|
+
const cliOptsNoFlag = {};
|
|
76
|
+
const createWorldOpts2 = {
|
|
77
|
+
name: 'foo',
|
|
78
|
+
carryUncommitted: cliOptsNoFlag.carryUncommitted ?? false,
|
|
79
|
+
};
|
|
80
|
+
expect(createWorldOpts2.carryUncommitted).toBe(false);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=carry-uncommitted.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"carry-uncommitted.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/carry-uncommitted.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openHostCpUrl.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/openHostCpUrl.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// Phase D6 (olam-dogfood-vision): unit tests for the openHostCpUrl
|
|
2
|
+
// helper's skip paths. Doesn't actually open a browser; covers the
|
|
3
|
+
// non-interactive / CI / headless-linux short-circuits.
|
|
4
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
5
|
+
import { openHostCpUrl } from '../host-cp.js';
|
|
6
|
+
const ORIGINAL_CI = process.env.CI;
|
|
7
|
+
const ORIGINAL_DISPLAY = process.env.DISPLAY;
|
|
8
|
+
const ORIGINAL_WAYLAND = process.env.WAYLAND_DISPLAY;
|
|
9
|
+
const ORIGINAL_PLATFORM = process.platform;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
delete process.env.CI;
|
|
12
|
+
});
|
|
13
|
+
afterEach(() => {
|
|
14
|
+
if (ORIGINAL_CI !== undefined)
|
|
15
|
+
process.env.CI = ORIGINAL_CI;
|
|
16
|
+
if (ORIGINAL_DISPLAY !== undefined)
|
|
17
|
+
process.env.DISPLAY = ORIGINAL_DISPLAY;
|
|
18
|
+
if (ORIGINAL_WAYLAND !== undefined)
|
|
19
|
+
process.env.WAYLAND_DISPLAY = ORIGINAL_WAYLAND;
|
|
20
|
+
Object.defineProperty(process, 'platform', { value: ORIGINAL_PLATFORM });
|
|
21
|
+
});
|
|
22
|
+
describe('openHostCpUrl — skip paths', () => {
|
|
23
|
+
it('skips when CI=true', () => {
|
|
24
|
+
process.env.CI = 'true';
|
|
25
|
+
const result = openHostCpUrl('http://127.0.0.1:19000/world/test');
|
|
26
|
+
expect(result.opened).toBe(false);
|
|
27
|
+
expect(result.reason).toContain('CI');
|
|
28
|
+
});
|
|
29
|
+
it('skips when stdout is not a TTY (vitest runs piped)', () => {
|
|
30
|
+
// vitest's default reporter pipes stdout, so this is the natural
|
|
31
|
+
// state during the test run. CI=undefined, isTTY=false → skip.
|
|
32
|
+
delete process.env.CI;
|
|
33
|
+
const result = openHostCpUrl('http://127.0.0.1:19000/world/test');
|
|
34
|
+
// We can't always pin which path triggers (depends on vitest
|
|
35
|
+
// reporter / CI env), but the function MUST report opened=false
|
|
36
|
+
// here without throwing.
|
|
37
|
+
expect(result.opened).toBe(false);
|
|
38
|
+
expect(typeof result.reason).toBe('string');
|
|
39
|
+
expect(result.reason.length).toBeGreaterThan(0);
|
|
40
|
+
});
|
|
41
|
+
it('returns a structured shape (never throws)', () => {
|
|
42
|
+
// Defensive contract: openHostCpUrl is a UX helper and must
|
|
43
|
+
// never throw — failures must come back as
|
|
44
|
+
// {opened: false, reason: string}.
|
|
45
|
+
const result = openHostCpUrl('http://malformed-but-not-spawnable.local/');
|
|
46
|
+
expect(result).toHaveProperty('opened');
|
|
47
|
+
expect(typeof result.opened).toBe('boolean');
|
|
48
|
+
if (!result.opened) {
|
|
49
|
+
expect(typeof result.reason).toBe('string');
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
it('skips on linux without DISPLAY/WAYLAND_DISPLAY', () => {
|
|
53
|
+
Object.defineProperty(process, 'platform', { value: 'linux' });
|
|
54
|
+
delete process.env.DISPLAY;
|
|
55
|
+
delete process.env.WAYLAND_DISPLAY;
|
|
56
|
+
const result = openHostCpUrl('http://127.0.0.1:19000/world/test');
|
|
57
|
+
expect(result.opened).toBe(false);
|
|
58
|
+
// Either CI / non-TTY / headless-linux can short-circuit; assert
|
|
59
|
+
// we got SOME structured reason rather than a thrown exception.
|
|
60
|
+
expect(typeof result.reason).toBe('string');
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=openHostCpUrl.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openHostCpUrl.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/openHostCpUrl.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for `olam refresh` command.
|
|
3
|
+
*
|
|
4
|
+
* Tests:
|
|
5
|
+
* 1. collectCpSourceFiles — mirrors build-devbox.sh:38-77 logic
|
|
6
|
+
* 2. validateServerMjsPresent — sanity-check gate
|
|
7
|
+
* 3. Command parser — arg/flag validation
|
|
8
|
+
* 4. Snapshot test — actual standalone dir matches expected structure
|
|
9
|
+
*
|
|
10
|
+
* Run: `cd packages/cli && npx vitest run src/commands/__tests__/refresh.test.ts`
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=refresh.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/refresh.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|