@pleri/olam-cli 0.1.70 → 0.1.73
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/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/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 +4379 -897
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.js +1252 -286
- 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 +21 -2
- package/host-cp/src/port-bridge-manager.mjs +1 -1
- package/host-cp/src/server.mjs +46 -7
- 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 -129
- 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 -335
- 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,397 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for auth-upgrade.ts pure helpers.
|
|
3
|
-
*
|
|
4
|
-
* Only tests the stateless, side-effect-free helpers. The full upgrade
|
|
5
|
-
* pipeline (docker build, stop, rm, start) is too side-effectful to
|
|
6
|
-
* integration-test inside the devbox — same philosophy as upgrade.test.ts.
|
|
7
|
-
*/
|
|
8
|
-
import { describe, it, expect, beforeEach, afterEach, vi } 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 { validateAuthRepoRoot, parseAuthUpgradeOpts, smokeTestCodexProvider, runAuthUpgradePullByDigest, } from '../commands/auth-upgrade.js';
|
|
13
|
-
import {} from '../commands/bootstrap.js';
|
|
14
|
-
import { EXIT_BOOTSTRAP_PULL_FAILED, EXIT_GENERIC_ERROR, EXIT_PROTOCOL_MISMATCH, } from '../exit-codes.js';
|
|
15
|
-
// ── validateAuthRepoRoot ──────────────────────────────────────────
|
|
16
|
-
describe('validateAuthRepoRoot', () => {
|
|
17
|
-
let tmpDir;
|
|
18
|
-
beforeEach(() => {
|
|
19
|
-
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-auth-upgrade-test-'));
|
|
20
|
-
});
|
|
21
|
-
afterEach(() => {
|
|
22
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
23
|
-
});
|
|
24
|
-
it('returns ok:false when the marker file is absent', () => {
|
|
25
|
-
const result = validateAuthRepoRoot(tmpDir);
|
|
26
|
-
expect(result.ok).toBe(false);
|
|
27
|
-
if (!result.ok) {
|
|
28
|
-
expect(result.error).toMatch(/packages\/auth-service\/Dockerfile/);
|
|
29
|
-
expect(result.error).toMatch(/olam repo root/i);
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
it('returns ok:true when packages/auth-service/Dockerfile exists', () => {
|
|
33
|
-
const authServiceDir = path.join(tmpDir, 'packages/auth-service');
|
|
34
|
-
fs.mkdirSync(authServiceDir, { recursive: true });
|
|
35
|
-
fs.writeFileSync(path.join(authServiceDir, 'Dockerfile'), 'FROM node:22-slim');
|
|
36
|
-
const result = validateAuthRepoRoot(tmpDir);
|
|
37
|
-
expect(result.ok).toBe(true);
|
|
38
|
-
});
|
|
39
|
-
it('error message includes the expected path', () => {
|
|
40
|
-
const result = validateAuthRepoRoot('/nonexistent-definitely-not-a-real-path');
|
|
41
|
-
expect(result.ok).toBe(false);
|
|
42
|
-
if (!result.ok) {
|
|
43
|
-
expect(result.error).toContain('Dockerfile');
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
it('error message includes a remediation hint', () => {
|
|
47
|
-
const result = validateAuthRepoRoot(tmpDir);
|
|
48
|
-
expect(result.ok).toBe(false);
|
|
49
|
-
if (!result.ok) {
|
|
50
|
-
expect(result.error).toContain('olam auth upgrade');
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
// ── parseAuthUpgradeOpts ──────────────────────────────────────────
|
|
55
|
-
describe('parseAuthUpgradeOpts', () => {
|
|
56
|
-
it('defaults all options to false when called with empty object', () => {
|
|
57
|
-
const opts = parseAuthUpgradeOpts({});
|
|
58
|
-
expect(opts.yes).toBe(false);
|
|
59
|
-
expect(opts.skipRecreate).toBe(false);
|
|
60
|
-
});
|
|
61
|
-
it('sets yes:true when raw.yes is true', () => {
|
|
62
|
-
expect(parseAuthUpgradeOpts({ yes: true }).yes).toBe(true);
|
|
63
|
-
});
|
|
64
|
-
it('sets yes:false when raw.yes is false', () => {
|
|
65
|
-
expect(parseAuthUpgradeOpts({ yes: false }).yes).toBe(false);
|
|
66
|
-
});
|
|
67
|
-
it('sets yes:false when raw.yes is undefined', () => {
|
|
68
|
-
expect(parseAuthUpgradeOpts({ yes: undefined }).yes).toBe(false);
|
|
69
|
-
});
|
|
70
|
-
it('sets skipRecreate:true when raw.skipRecreate is true', () => {
|
|
71
|
-
expect(parseAuthUpgradeOpts({ skipRecreate: true }).skipRecreate).toBe(true);
|
|
72
|
-
});
|
|
73
|
-
it('sets skipRecreate:false when raw.skipRecreate is undefined', () => {
|
|
74
|
-
expect(parseAuthUpgradeOpts({}).skipRecreate).toBe(false);
|
|
75
|
-
});
|
|
76
|
-
it('accepts both options at once', () => {
|
|
77
|
-
const opts = parseAuthUpgradeOpts({ yes: true, skipRecreate: true });
|
|
78
|
-
expect(opts.yes).toBe(true);
|
|
79
|
-
expect(opts.skipRecreate).toBe(true);
|
|
80
|
-
});
|
|
81
|
-
it('defaults fromSource to false', () => {
|
|
82
|
-
expect(parseAuthUpgradeOpts({}).fromSource).toBe(false);
|
|
83
|
-
});
|
|
84
|
-
it('sets fromSource:true when raw.fromSource is true', () => {
|
|
85
|
-
expect(parseAuthUpgradeOpts({ fromSource: true }).fromSource).toBe(true);
|
|
86
|
-
});
|
|
87
|
-
it('result is a plain object (no mutation of input)', () => {
|
|
88
|
-
const raw = { yes: true };
|
|
89
|
-
const opts = parseAuthUpgradeOpts(raw);
|
|
90
|
-
expect(opts).not.toBe(raw);
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
// ── smokeTestCodexProvider ────────────────────────────────────────
|
|
94
|
-
// These tests verify that the smoke gate correctly distinguishes a stale
|
|
95
|
-
// (pre-codex) image from a current one. A stale image returns a
|
|
96
|
-
// claude.com loginUrl for provider=codex; a current image returns an
|
|
97
|
-
// OpenAI verification URL.
|
|
98
|
-
describe('smokeTestCodexProvider', () => {
|
|
99
|
-
beforeEach(() => {
|
|
100
|
-
vi.stubGlobal('fetch', undefined);
|
|
101
|
-
});
|
|
102
|
-
afterEach(() => {
|
|
103
|
-
vi.unstubAllGlobals();
|
|
104
|
-
});
|
|
105
|
-
function makeResponse(body, status = 200) {
|
|
106
|
-
return new Response(JSON.stringify(body), {
|
|
107
|
-
status,
|
|
108
|
-
headers: { 'Content-Type': 'application/json' },
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
it('returns ok:true when codex response has no claude.com loginUrl', async () => {
|
|
112
|
-
vi.stubGlobal('fetch', async () => makeResponse({
|
|
113
|
-
verificationUriComplete: 'https://login.microsoftonline.com/common/oauth2/v2.0/deviceauth',
|
|
114
|
-
userCode: 'TEST-CODE',
|
|
115
|
-
state: 'abc123',
|
|
116
|
-
}));
|
|
117
|
-
const result = await smokeTestCodexProvider(null);
|
|
118
|
-
expect(result.ok).toBe(true);
|
|
119
|
-
});
|
|
120
|
-
it('returns ok:false when codex response contains a claude.com loginUrl (stale image)', async () => {
|
|
121
|
-
vi.stubGlobal('fetch', async () => makeResponse({
|
|
122
|
-
loginUrl: 'https://claude.com/oauth/authorize?...',
|
|
123
|
-
state: 'pkce-state',
|
|
124
|
-
}));
|
|
125
|
-
const result = await smokeTestCodexProvider(null);
|
|
126
|
-
expect(result.ok).toBe(false);
|
|
127
|
-
if (!result.ok) {
|
|
128
|
-
expect(result.error).toMatch(/claude\.com/);
|
|
129
|
-
expect(result.error).toMatch(/stale/i);
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
it('returns ok:false when codex response contains a claude.ai loginUrl', async () => {
|
|
133
|
-
vi.stubGlobal('fetch', async () => makeResponse({ loginUrl: 'https://claude.ai/oauth/authorize' }));
|
|
134
|
-
const result = await smokeTestCodexProvider(null);
|
|
135
|
-
expect(result.ok).toBe(false);
|
|
136
|
-
});
|
|
137
|
-
it('returns ok:true for 502 (OpenAI unreachable) — not a stale-image failure', async () => {
|
|
138
|
-
vi.stubGlobal('fetch', async () => makeResponse({ error: 'OpenAI device auth endpoint unavailable' }, 502));
|
|
139
|
-
const result = await smokeTestCodexProvider(null);
|
|
140
|
-
expect(result.ok).toBe(true);
|
|
141
|
-
});
|
|
142
|
-
it('returns ok:false when fetch throws (network error)', async () => {
|
|
143
|
-
vi.stubGlobal('fetch', async () => { throw new Error('ECONNREFUSED'); });
|
|
144
|
-
const result = await smokeTestCodexProvider(null);
|
|
145
|
-
expect(result.ok).toBe(false);
|
|
146
|
-
if (!result.ok) {
|
|
147
|
-
expect(result.error).toMatch(/ECONNREFUSED/);
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
it('sends X-Olam-Secret header when authSecret is provided', async () => {
|
|
151
|
-
let capturedHeaders;
|
|
152
|
-
vi.stubGlobal('fetch', async (_url, init) => {
|
|
153
|
-
capturedHeaders = init.headers;
|
|
154
|
-
return makeResponse({ userCode: 'X' });
|
|
155
|
-
});
|
|
156
|
-
await smokeTestCodexProvider('super-secret');
|
|
157
|
-
expect(capturedHeaders?.['X-Olam-Secret']).toBe('super-secret');
|
|
158
|
-
});
|
|
159
|
-
it('omits X-Olam-Secret header when authSecret is null', async () => {
|
|
160
|
-
let capturedHeaders;
|
|
161
|
-
vi.stubGlobal('fetch', async (_url, init) => {
|
|
162
|
-
capturedHeaders = init.headers;
|
|
163
|
-
return makeResponse({ userCode: 'X' });
|
|
164
|
-
});
|
|
165
|
-
await smokeTestCodexProvider(null);
|
|
166
|
-
expect(capturedHeaders?.['X-Olam-Secret']).toBeUndefined();
|
|
167
|
-
});
|
|
168
|
-
});
|
|
169
|
-
// ── runAuthUpgradePullByDigest — orchestrator (Phase C — C6) ─────
|
|
170
|
-
const FIXTURE_DIGESTS = {
|
|
171
|
-
'host-cp': 'sha256:' + 'a'.repeat(64),
|
|
172
|
-
auth: 'sha256:' + 'b'.repeat(64),
|
|
173
|
-
devbox: 'sha256:' + 'c'.repeat(64),
|
|
174
|
-
$registry: 'ghcr.io/pleri',
|
|
175
|
-
$published_version: '0.1.16',
|
|
176
|
-
};
|
|
177
|
-
function ok(stdout = '') {
|
|
178
|
-
return { exitCode: 0, stdout, stderr: '' };
|
|
179
|
-
}
|
|
180
|
-
function err(stderr, exitCode = 1) {
|
|
181
|
-
return { exitCode, stdout: '', stderr };
|
|
182
|
-
}
|
|
183
|
-
function makeMockDocker(opts = {}) {
|
|
184
|
-
const calls = opts.calls ?? { pull: [], inspect: [] };
|
|
185
|
-
return {
|
|
186
|
-
info: vi.fn(async () => (opts.infoOk === false ? err('cannot connect to docker') : ok())),
|
|
187
|
-
pull: vi.fn(async (ref) => {
|
|
188
|
-
calls.pull.push(ref);
|
|
189
|
-
return opts.pullResults?.get(ref) ?? ok();
|
|
190
|
-
}),
|
|
191
|
-
inspectLabel: vi.fn(async (ref, label) => {
|
|
192
|
-
calls.inspect.push(`${ref}#${label}`);
|
|
193
|
-
const value = opts.inspectLabels?.get(ref) ?? '1';
|
|
194
|
-
return ok(`${value}\n`);
|
|
195
|
-
}),
|
|
196
|
-
tag: vi.fn(async () => ok()),
|
|
197
|
-
};
|
|
198
|
-
}
|
|
199
|
-
describe('runAuthUpgradePullByDigest — happy path', () => {
|
|
200
|
-
beforeEach(() => {
|
|
201
|
-
vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
202
|
-
vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
|
|
203
|
-
});
|
|
204
|
-
afterEach(() => {
|
|
205
|
-
vi.restoreAllMocks();
|
|
206
|
-
});
|
|
207
|
-
it('exits 0 when daemon up + pull succeeds + handshake passes + recreate succeeds', async () => {
|
|
208
|
-
const docker = makeMockDocker();
|
|
209
|
-
const tagCalls = [];
|
|
210
|
-
let recreated = 0;
|
|
211
|
-
const result = await runAuthUpgradePullByDigest({
|
|
212
|
-
docker,
|
|
213
|
-
digests: FIXTURE_DIGESTS,
|
|
214
|
-
tagImpl: (from, to) => {
|
|
215
|
-
tagCalls.push({ from, to });
|
|
216
|
-
return { ok: true };
|
|
217
|
-
},
|
|
218
|
-
recreateAuth: async () => {
|
|
219
|
-
recreated++;
|
|
220
|
-
return { ok: true };
|
|
221
|
-
},
|
|
222
|
-
});
|
|
223
|
-
expect(result.exitCode).toBe(0);
|
|
224
|
-
expect(result.summary).toContain('upgraded');
|
|
225
|
-
expect(tagCalls).toHaveLength(1);
|
|
226
|
-
expect(tagCalls[0]?.from).toContain(`olam-auth@${FIXTURE_DIGESTS.auth}`);
|
|
227
|
-
expect(tagCalls[0]?.to).toBe('olam-auth:local');
|
|
228
|
-
expect(recreated).toBe(1);
|
|
229
|
-
});
|
|
230
|
-
it('pulls only olam-auth (not host-cp / devbox)', async () => {
|
|
231
|
-
const calls = { pull: [], inspect: [] };
|
|
232
|
-
const docker = makeMockDocker({ calls });
|
|
233
|
-
await runAuthUpgradePullByDigest({
|
|
234
|
-
docker,
|
|
235
|
-
digests: FIXTURE_DIGESTS,
|
|
236
|
-
tagImpl: () => ({ ok: true }),
|
|
237
|
-
recreateAuth: async () => ({ ok: true }),
|
|
238
|
-
});
|
|
239
|
-
expect(calls.pull).toHaveLength(1);
|
|
240
|
-
expect(calls.pull[0]).toBe(`ghcr.io/pleri/olam-auth@${FIXTURE_DIGESTS.auth}`);
|
|
241
|
-
});
|
|
242
|
-
it('honours deps.registry override', async () => {
|
|
243
|
-
const calls = { pull: [], inspect: [] };
|
|
244
|
-
const docker = makeMockDocker({ calls });
|
|
245
|
-
await runAuthUpgradePullByDigest({
|
|
246
|
-
docker,
|
|
247
|
-
digests: FIXTURE_DIGESTS,
|
|
248
|
-
registry: 'localhost:5000/test',
|
|
249
|
-
tagImpl: () => ({ ok: true }),
|
|
250
|
-
recreateAuth: async () => ({ ok: true }),
|
|
251
|
-
});
|
|
252
|
-
expect(calls.pull[0]).toContain('localhost:5000/test/olam-auth');
|
|
253
|
-
});
|
|
254
|
-
});
|
|
255
|
-
describe('runAuthUpgradePullByDigest — failure paths', () => {
|
|
256
|
-
beforeEach(() => {
|
|
257
|
-
vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
258
|
-
vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
|
|
259
|
-
});
|
|
260
|
-
afterEach(() => {
|
|
261
|
-
vi.restoreAllMocks();
|
|
262
|
-
});
|
|
263
|
-
it('exits EXIT_GENERIC_ERROR (1) when docker daemon not reachable', async () => {
|
|
264
|
-
const docker = makeMockDocker({ infoOk: false });
|
|
265
|
-
const result = await runAuthUpgradePullByDigest({
|
|
266
|
-
docker,
|
|
267
|
-
digests: FIXTURE_DIGESTS,
|
|
268
|
-
tagImpl: () => ({ ok: true }),
|
|
269
|
-
recreateAuth: async () => ({ ok: true }),
|
|
270
|
-
});
|
|
271
|
-
expect(result.exitCode).toBe(EXIT_GENERIC_ERROR);
|
|
272
|
-
expect(result.summary).toContain('docker daemon');
|
|
273
|
-
});
|
|
274
|
-
it('exits EXIT_BOOTSTRAP_PULL_FAILED (3) when the auth pull fails terminally', async () => {
|
|
275
|
-
const docker = makeMockDocker({
|
|
276
|
-
pullResults: new Map([
|
|
277
|
-
[`ghcr.io/pleri/olam-auth@${FIXTURE_DIGESTS.auth}`, err('manifest unknown', 1)],
|
|
278
|
-
]),
|
|
279
|
-
});
|
|
280
|
-
let recreated = 0;
|
|
281
|
-
const result = await runAuthUpgradePullByDigest({
|
|
282
|
-
docker,
|
|
283
|
-
digests: FIXTURE_DIGESTS,
|
|
284
|
-
tagImpl: () => ({ ok: true }),
|
|
285
|
-
recreateAuth: async () => {
|
|
286
|
-
recreated++;
|
|
287
|
-
return { ok: true };
|
|
288
|
-
},
|
|
289
|
-
});
|
|
290
|
-
expect(result.exitCode).toBe(EXIT_BOOTSTRAP_PULL_FAILED);
|
|
291
|
-
expect(result.summary).toContain('pull failed');
|
|
292
|
-
expect(recreated).toBe(0); // bailed before recreate
|
|
293
|
-
});
|
|
294
|
-
it('exits EXIT_PROTOCOL_MISMATCH (4) when LABEL declares non-overlapping versions', async () => {
|
|
295
|
-
const docker = makeMockDocker({
|
|
296
|
-
inspectLabels: new Map([
|
|
297
|
-
[`ghcr.io/pleri/olam-auth@${FIXTURE_DIGESTS.auth}`, '99'],
|
|
298
|
-
]),
|
|
299
|
-
});
|
|
300
|
-
const result = await runAuthUpgradePullByDigest({
|
|
301
|
-
docker,
|
|
302
|
-
digests: FIXTURE_DIGESTS,
|
|
303
|
-
tagImpl: () => ({ ok: true }),
|
|
304
|
-
recreateAuth: async () => ({ ok: true }),
|
|
305
|
-
});
|
|
306
|
-
expect(result.exitCode).toBe(EXIT_PROTOCOL_MISMATCH);
|
|
307
|
-
expect(result.summary).toContain('auth');
|
|
308
|
-
});
|
|
309
|
-
it('exits EXIT_PROTOCOL_MISMATCH when LABEL is missing', async () => {
|
|
310
|
-
const docker = makeMockDocker({
|
|
311
|
-
inspectLabels: new Map([
|
|
312
|
-
[`ghcr.io/pleri/olam-auth@${FIXTURE_DIGESTS.auth}`, '<no value>'],
|
|
313
|
-
]),
|
|
314
|
-
});
|
|
315
|
-
const result = await runAuthUpgradePullByDigest({
|
|
316
|
-
docker,
|
|
317
|
-
digests: FIXTURE_DIGESTS,
|
|
318
|
-
tagImpl: () => ({ ok: true }),
|
|
319
|
-
recreateAuth: async () => ({ ok: true }),
|
|
320
|
-
});
|
|
321
|
-
expect(result.exitCode).toBe(EXIT_PROTOCOL_MISMATCH);
|
|
322
|
-
});
|
|
323
|
-
it('exits EXIT_GENERIC_ERROR when docker tag fails', async () => {
|
|
324
|
-
const docker = makeMockDocker();
|
|
325
|
-
const result = await runAuthUpgradePullByDigest({
|
|
326
|
-
docker,
|
|
327
|
-
digests: FIXTURE_DIGESTS,
|
|
328
|
-
tagImpl: () => ({ ok: false, error: 'image not found' }),
|
|
329
|
-
recreateAuth: async () => ({ ok: true }),
|
|
330
|
-
});
|
|
331
|
-
expect(result.exitCode).toBe(EXIT_GENERIC_ERROR);
|
|
332
|
-
expect(result.summary).toContain('tag failed');
|
|
333
|
-
});
|
|
334
|
-
it('exits EXIT_GENERIC_ERROR when auth recreate fails', async () => {
|
|
335
|
-
const docker = makeMockDocker();
|
|
336
|
-
const result = await runAuthUpgradePullByDigest({
|
|
337
|
-
docker,
|
|
338
|
-
digests: FIXTURE_DIGESTS,
|
|
339
|
-
tagImpl: () => ({ ok: true }),
|
|
340
|
-
recreateAuth: async () => ({ ok: false, error: 'health check failed' }),
|
|
341
|
-
});
|
|
342
|
-
expect(result.exitCode).toBe(EXIT_GENERIC_ERROR);
|
|
343
|
-
expect(result.summary).toContain('auth recreate');
|
|
344
|
-
});
|
|
345
|
-
});
|
|
346
|
-
// ── --from-source dev-mode gating (Phase C — C6) ──────────────────
|
|
347
|
-
describe('--from-source flag gating — outside dev mode', () => {
|
|
348
|
-
let originalDev;
|
|
349
|
-
beforeEach(() => {
|
|
350
|
-
originalDev = process.env.OLAM_DEV;
|
|
351
|
-
delete process.env.OLAM_DEV;
|
|
352
|
-
});
|
|
353
|
-
afterEach(() => {
|
|
354
|
-
if (originalDev === undefined) {
|
|
355
|
-
delete process.env.OLAM_DEV;
|
|
356
|
-
}
|
|
357
|
-
else {
|
|
358
|
-
process.env.OLAM_DEV = originalDev;
|
|
359
|
-
}
|
|
360
|
-
});
|
|
361
|
-
it('MissingBuildScriptError is the hint surfaced when --from-source runs outside dev mode', async () => {
|
|
362
|
-
const { isDevMode, MissingBuildScriptError } = await import('../install-root.js');
|
|
363
|
-
expect(isDevMode()).toBe(false);
|
|
364
|
-
const e = new MissingBuildScriptError('packages/adapters/src/docker/build-auth.sh');
|
|
365
|
-
expect(e.message).toMatch(/Build script .* not available/);
|
|
366
|
-
expect(e.message).toMatch(/OLAM_DEV=1/);
|
|
367
|
-
expect(e.message).toMatch(/--from-source/);
|
|
368
|
-
});
|
|
369
|
-
});
|
|
370
|
-
describe('--from-source flag gating — inside dev mode', () => {
|
|
371
|
-
let originalDev;
|
|
372
|
-
let tmpDir;
|
|
373
|
-
beforeEach(() => {
|
|
374
|
-
originalDev = process.env.OLAM_DEV;
|
|
375
|
-
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-auth-c6-fromsource-'));
|
|
376
|
-
process.env.OLAM_DEV = '1';
|
|
377
|
-
});
|
|
378
|
-
afterEach(() => {
|
|
379
|
-
if (originalDev === undefined) {
|
|
380
|
-
delete process.env.OLAM_DEV;
|
|
381
|
-
}
|
|
382
|
-
else {
|
|
383
|
-
process.env.OLAM_DEV = originalDev;
|
|
384
|
-
}
|
|
385
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
386
|
-
});
|
|
387
|
-
it('isDevMode returns true when OLAM_DEV=1 + packages/ sibling exists', async () => {
|
|
388
|
-
const repoRoot = path.join(tmpDir, 'repo');
|
|
389
|
-
const installRootDir = path.join(repoRoot, 'packages', 'cli');
|
|
390
|
-
fs.mkdirSync(installRootDir, { recursive: true });
|
|
391
|
-
fs.mkdirSync(path.join(repoRoot, 'packages'), { recursive: true });
|
|
392
|
-
fs.writeFileSync(path.join(repoRoot, 'package.json'), '{}');
|
|
393
|
-
const { isDevMode } = await import('../install-root.js');
|
|
394
|
-
expect(isDevMode(process.env, installRootDir)).toBe(true);
|
|
395
|
-
});
|
|
396
|
-
});
|
|
397
|
-
//# sourceMappingURL=auth-upgrade.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-upgrade.test.js","sourceRoot":"","sources":["../../src/__tests__/auth-upgrade.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* bootstrap-tag-mcp-auth.test.ts — contractual regression for the
|
|
3
|
-
* fix that makes `olam bootstrap` tag mcp-auth.
|
|
4
|
-
*
|
|
5
|
-
* Bug history: PR #361 added `'mcp-auth'?: string` to the
|
|
6
|
-
* ImageDigests type and started PUBLISHING image-digests.json with
|
|
7
|
-
* the field, but `olam bootstrap` never read it. The image was
|
|
8
|
-
* neither pulled nor tagged. Downstream `olam auth up` (called
|
|
9
|
-
* during bootstrap chain + by the D3 conformance CI smoke) failed
|
|
10
|
-
* with: "mcp-auth image 'olam-mcp-auth:local' not found locally".
|
|
11
|
-
* Every fresh-machine install + the D3 fixture-asserts CI job
|
|
12
|
-
* silently broke for ~24h until #366's CI run surfaced it.
|
|
13
|
-
*
|
|
14
|
-
* Pin the contract: when the digests blob carries an `mcp-auth` key,
|
|
15
|
-
* bootstrap.ts MUST (a) reference it in the imageRefs construction,
|
|
16
|
-
* (b) tag the pulled digest as `olam-mcp-auth:local` (the
|
|
17
|
-
* services.ts MCP_AUTH_LOCAL_TAG constant). The previous PR-validator
|
|
18
|
-
* pattern wins again — string-level assertion against the source is
|
|
19
|
-
* the cheapest enforcement.
|
|
20
|
-
*/
|
|
21
|
-
export {};
|
|
22
|
-
//# sourceMappingURL=bootstrap-tag-mcp-auth.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-tag-mcp-auth.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/bootstrap-tag-mcp-auth.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG"}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* bootstrap-tag-mcp-auth.test.ts — contractual regression for the
|
|
3
|
-
* fix that makes `olam bootstrap` tag mcp-auth.
|
|
4
|
-
*
|
|
5
|
-
* Bug history: PR #361 added `'mcp-auth'?: string` to the
|
|
6
|
-
* ImageDigests type and started PUBLISHING image-digests.json with
|
|
7
|
-
* the field, but `olam bootstrap` never read it. The image was
|
|
8
|
-
* neither pulled nor tagged. Downstream `olam auth up` (called
|
|
9
|
-
* during bootstrap chain + by the D3 conformance CI smoke) failed
|
|
10
|
-
* with: "mcp-auth image 'olam-mcp-auth:local' not found locally".
|
|
11
|
-
* Every fresh-machine install + the D3 fixture-asserts CI job
|
|
12
|
-
* silently broke for ~24h until #366's CI run surfaced it.
|
|
13
|
-
*
|
|
14
|
-
* Pin the contract: when the digests blob carries an `mcp-auth` key,
|
|
15
|
-
* bootstrap.ts MUST (a) reference it in the imageRefs construction,
|
|
16
|
-
* (b) tag the pulled digest as `olam-mcp-auth:local` (the
|
|
17
|
-
* services.ts MCP_AUTH_LOCAL_TAG constant). The previous PR-validator
|
|
18
|
-
* pattern wins again — string-level assertion against the source is
|
|
19
|
-
* the cheapest enforcement.
|
|
20
|
-
*/
|
|
21
|
-
import { describe, it, expect } from 'vitest';
|
|
22
|
-
import * as fs from 'node:fs';
|
|
23
|
-
import * as path from 'node:path';
|
|
24
|
-
import { fileURLToPath } from 'node:url';
|
|
25
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
26
|
-
const __dirname = path.dirname(__filename);
|
|
27
|
-
const BOOTSTRAP_PATH = path.join(__dirname, '..', 'commands', 'bootstrap.ts');
|
|
28
|
-
describe("bootstrap.ts mcp-auth tagging contract", () => {
|
|
29
|
-
it('imageRefs handles mcp-auth as a possible entry', () => {
|
|
30
|
-
const src = fs.readFileSync(BOOTSTRAP_PATH, 'utf-8');
|
|
31
|
-
// The imageRefs name union (or push) must include mcp-auth.
|
|
32
|
-
expect(src).toMatch(/['"]mcp-auth['"]/);
|
|
33
|
-
// Push or array-literal entry, either is fine.
|
|
34
|
-
expect(src).toMatch(/olam-mcp-auth@\$\{/);
|
|
35
|
-
});
|
|
36
|
-
it('tagPlan tags mcp-auth as olam-mcp-auth:local when digest is present', () => {
|
|
37
|
-
const src = fs.readFileSync(BOOTSTRAP_PATH, 'utf-8');
|
|
38
|
-
// The canonical local tag — services.ts expects exactly this string.
|
|
39
|
-
expect(src).toMatch(/['"]olam-mcp-auth:local['"]/);
|
|
40
|
-
// The push must be guarded so older image-digests.json without
|
|
41
|
-
// the field still bootstrap successfully. Either via .find() with a
|
|
42
|
-
// 'mcp-auth' string check or an `if (digests['mcp-auth'])` style.
|
|
43
|
-
expect(src).toMatch(/['"]mcp-auth['"][\s\S]{0,100}olam-mcp-auth:local/);
|
|
44
|
-
});
|
|
45
|
-
it('the guarded push pattern survives', () => {
|
|
46
|
-
const src = fs.readFileSync(BOOTSTRAP_PATH, 'utf-8');
|
|
47
|
-
// Either pattern is acceptable; the key invariant is "guarded".
|
|
48
|
-
const hasFindPattern = /imageRefs\.find\(/.test(src);
|
|
49
|
-
const hasIfPattern = /if\s*\(\s*digests\[['"]mcp-auth['"]\]\s*\)/.test(src);
|
|
50
|
-
expect(hasFindPattern || hasIfPattern).toBe(true);
|
|
51
|
-
});
|
|
52
|
-
it('handshake + tag spinner messages are NOT hardcoded to "3 images"', () => {
|
|
53
|
-
// Once mcp-auth is in the pull list, "3" is wrong. This guards
|
|
54
|
-
// against a future revert that puts the literal back.
|
|
55
|
-
const src = fs.readFileSync(BOOTSTRAP_PATH, 'utf-8');
|
|
56
|
-
// The handshake success log line should reference the count
|
|
57
|
-
// dynamically, not a literal "3".
|
|
58
|
-
expect(src).not.toMatch(/handshake passed \(all 3 images\)/);
|
|
59
|
-
// Either dynamic interpolation (`${count} images`) or absent.
|
|
60
|
-
expect(src).toMatch(/handshake passed \(all \$\{[^}]+\.length\} images\)/);
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
//# sourceMappingURL=bootstrap-tag-mcp-auth.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-tag-mcp-auth.test.js","sourceRoot":"","sources":["../../src/__tests__/bootstrap-tag-mcp-auth.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;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,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAC3C,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;AAE9E,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACtD,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACrD,4DAA4D;QAC5D,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACxC,+CAA+C;QAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACrD,qEAAqE;QACrE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;QAEnD,+DAA+D;QAC/D,oEAAoE;QACpE,kEAAkE;QAClE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACrD,gEAAgE;QAChE,MAAM,cAAc,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrD,MAAM,YAAY,GAAG,4CAA4C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5E,MAAM,CAAC,cAAc,IAAI,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,+DAA+D;QAC/D,sDAAsD;QACtD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAErD,4DAA4D;QAC5D,kCAAkC;QAClC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC;QAC7D,8DAA8D;QAC9D,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-mcp-revoke.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/cli-mcp-revoke.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|