@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,44 +0,0 @@
|
|
|
1
|
-
// C5 (Phase C — fresh-install self-bootstrap): image-presence pre-flight
|
|
2
|
-
// helper. Decision #6 (revised pass 3) — `olam bootstrap` is the SOLE
|
|
3
|
-
// on-ramp; commands that need an image fail-fast with a named remedy
|
|
4
|
-
// instead of auto-pulling.
|
|
5
|
-
import { describe, it, expect } from 'vitest';
|
|
6
|
-
import { checkImagePresent } from '../image-presence.js';
|
|
7
|
-
describe('checkImagePresent', () => {
|
|
8
|
-
it('returns present:true when docker image inspect exits 0', () => {
|
|
9
|
-
const inspect = () => ({ exitCode: 0 });
|
|
10
|
-
const result = checkImagePresent({ imageRef: 'ghcr.io/pleri/olam-devbox:0.2.0', callerCommand: 'olam create' }, inspect);
|
|
11
|
-
expect(result.present).toBe(true);
|
|
12
|
-
expect(result.stderrLine).toBe('');
|
|
13
|
-
});
|
|
14
|
-
it('returns present:false with named remedy when inspect exits non-zero', () => {
|
|
15
|
-
const inspect = () => ({ exitCode: 1 });
|
|
16
|
-
const result = checkImagePresent({ imageRef: 'ghcr.io/pleri/olam-devbox:0.2.0', callerCommand: 'olam create' }, inspect);
|
|
17
|
-
expect(result.present).toBe(false);
|
|
18
|
-
expect(result.stderrLine).toContain("'ghcr.io/pleri/olam-devbox:0.2.0' not found locally");
|
|
19
|
-
expect(result.stderrLine).toContain('olam create does not auto-pull');
|
|
20
|
-
expect(result.stderrLine).toContain('Remedy: run `olam bootstrap`');
|
|
21
|
-
});
|
|
22
|
-
it('names the caller command in the remedy (so operators know which command failed)', () => {
|
|
23
|
-
const inspect = () => ({ exitCode: 1 });
|
|
24
|
-
const create = checkImagePresent({ imageRef: 'ghcr.io/pleri/olam-devbox:0.2.0', callerCommand: 'olam create' }, inspect);
|
|
25
|
-
const hostCp = checkImagePresent({ imageRef: 'ghcr.io/pleri/olam-host-cp:0.2.0', callerCommand: 'olam host-cp start' }, inspect);
|
|
26
|
-
const authUp = checkImagePresent({ imageRef: 'ghcr.io/pleri/olam-auth:0.2.0', callerCommand: 'olam auth up' }, inspect);
|
|
27
|
-
expect(create.stderrLine).toContain('olam create');
|
|
28
|
-
expect(hostCp.stderrLine).toContain('olam host-cp start');
|
|
29
|
-
expect(authUp.stderrLine).toContain('olam auth up');
|
|
30
|
-
});
|
|
31
|
-
it('mentions Decision #6 lineage in the remedy (audit trail for support questions)', () => {
|
|
32
|
-
const inspect = () => ({ exitCode: 1 });
|
|
33
|
-
const result = checkImagePresent({ imageRef: 'foo:bar', callerCommand: 'olam x' }, inspect);
|
|
34
|
-
expect(result.stderrLine).toContain('Decision #6');
|
|
35
|
-
expect(result.stderrLine).toContain('olam-fresh-install-self-bootstrap');
|
|
36
|
-
});
|
|
37
|
-
it('handles inspect timeout / docker daemon down (negative exitCode)', () => {
|
|
38
|
-
const inspect = () => ({ exitCode: -1 });
|
|
39
|
-
const result = checkImagePresent({ imageRef: 'foo:bar', callerCommand: 'olam x' }, inspect);
|
|
40
|
-
expect(result.present).toBe(false);
|
|
41
|
-
expect(result.stderrLine).toContain('not found locally');
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
//# sourceMappingURL=image-presence.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"image-presence.test.js","sourceRoot":"","sources":["../../src/__tests__/image-presence.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"install-root.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/install-root.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
// B6 (Phase B — fresh-install self-bootstrap): installRoot + isDevMode
|
|
2
|
-
// + resolveBuildScript. 2-condition dev-mode opt-in (OLAM_DEV=1 + packages/
|
|
3
|
-
// sibling) — adequate for local-dev / dogfood audience per pass-3 reframe.
|
|
4
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
5
|
-
import * as fs from 'node:fs';
|
|
6
|
-
import * as os from 'node:os';
|
|
7
|
-
import * as path from 'node:path';
|
|
8
|
-
import { installRoot, isDevMode, resolveBuildScript, MissingBuildScriptError, } from '../install-root.js';
|
|
9
|
-
describe('installRoot', () => {
|
|
10
|
-
it('resolves to the package root from src/install-root.ts', () => {
|
|
11
|
-
// From src/, dirname is .../packages/cli/src; .. lands at .../packages/cli.
|
|
12
|
-
const root = installRoot();
|
|
13
|
-
expect(root.endsWith('/packages/cli')).toBe(true);
|
|
14
|
-
});
|
|
15
|
-
it('accepts an injected metaUrl for testing', () => {
|
|
16
|
-
// Synthetic: pretend we're at /tmp/foo/dist/install-root.js → root /tmp/foo
|
|
17
|
-
const fakeUrl = `file:///tmp/foo/dist/install-root.js`;
|
|
18
|
-
expect(installRoot(fakeUrl)).toBe('/tmp/foo');
|
|
19
|
-
});
|
|
20
|
-
});
|
|
21
|
-
describe('isDevMode — 2-condition opt-in', () => {
|
|
22
|
-
let tmpRoot;
|
|
23
|
-
let originalDev;
|
|
24
|
-
beforeEach(() => {
|
|
25
|
-
originalDev = process.env.OLAM_DEV;
|
|
26
|
-
delete process.env.OLAM_DEV;
|
|
27
|
-
tmpRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-installroot-'));
|
|
28
|
-
});
|
|
29
|
-
afterEach(() => {
|
|
30
|
-
if (originalDev !== undefined)
|
|
31
|
-
process.env.OLAM_DEV = originalDev;
|
|
32
|
-
else
|
|
33
|
-
delete process.env.OLAM_DEV;
|
|
34
|
-
fs.rmSync(tmpRoot, { recursive: true, force: true });
|
|
35
|
-
});
|
|
36
|
-
/** Synthesize a "package install root" that sits at <tmp>/x/y/packages/cli. */
|
|
37
|
-
function makeFakeInstall(root, withMonorepo) {
|
|
38
|
-
const pkgRoot = path.join(root, 'packages', 'cli');
|
|
39
|
-
fs.mkdirSync(pkgRoot, { recursive: true });
|
|
40
|
-
if (withMonorepo) {
|
|
41
|
-
// Add the monorepo-marker siblings: packages/ exists (already created
|
|
42
|
-
// above) and a top-level package.json. From pkgRoot, two levels up
|
|
43
|
-
// (`..`/`..`) is the monorepo root.
|
|
44
|
-
fs.writeFileSync(path.join(root, 'package.json'), '{"private": true}');
|
|
45
|
-
}
|
|
46
|
-
return pkgRoot;
|
|
47
|
-
}
|
|
48
|
-
it('returns false when OLAM_DEV is not set, even with a packages/ sibling', () => {
|
|
49
|
-
const installDir = makeFakeInstall(tmpRoot, /*withMonorepo*/ true);
|
|
50
|
-
expect(isDevMode({}, installDir)).toBe(false);
|
|
51
|
-
});
|
|
52
|
-
it('returns false when OLAM_DEV=1 but no packages/ + package.json siblings', () => {
|
|
53
|
-
const installDir = makeFakeInstall(tmpRoot, /*withMonorepo*/ false);
|
|
54
|
-
// Note: makeFakeInstall always creates packages/ (as part of the install
|
|
55
|
-
// dir layout). For "no monorepo" we just don't write the top-level
|
|
56
|
-
// package.json. The check requires BOTH packages/ AND package.json.
|
|
57
|
-
expect(isDevMode({ OLAM_DEV: '1' }, installDir)).toBe(false);
|
|
58
|
-
});
|
|
59
|
-
it('returns true when OLAM_DEV=1 AND both packages/ + package.json siblings exist', () => {
|
|
60
|
-
const installDir = makeFakeInstall(tmpRoot, /*withMonorepo*/ true);
|
|
61
|
-
expect(isDevMode({ OLAM_DEV: '1' }, installDir)).toBe(true);
|
|
62
|
-
});
|
|
63
|
-
it('returns false when OLAM_DEV is set to a non-"1" value', () => {
|
|
64
|
-
const installDir = makeFakeInstall(tmpRoot, /*withMonorepo*/ true);
|
|
65
|
-
expect(isDevMode({ OLAM_DEV: 'true' }, installDir)).toBe(false);
|
|
66
|
-
expect(isDevMode({ OLAM_DEV: 'yes' }, installDir)).toBe(false);
|
|
67
|
-
expect(isDevMode({ OLAM_DEV: '0' }, installDir)).toBe(false);
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
describe('resolveBuildScript', () => {
|
|
71
|
-
let tmpRoot;
|
|
72
|
-
beforeEach(() => {
|
|
73
|
-
tmpRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-resolve-script-'));
|
|
74
|
-
});
|
|
75
|
-
afterEach(() => {
|
|
76
|
-
fs.rmSync(tmpRoot, { recursive: true, force: true });
|
|
77
|
-
});
|
|
78
|
-
it('returns the absolute path to the script when in dev mode', () => {
|
|
79
|
-
const installDir = path.join(tmpRoot, 'packages', 'cli');
|
|
80
|
-
fs.mkdirSync(installDir, { recursive: true });
|
|
81
|
-
fs.writeFileSync(path.join(tmpRoot, 'package.json'), '{}');
|
|
82
|
-
const result = resolveBuildScript({
|
|
83
|
-
scriptRelPath: 'packages/adapters/src/docker/build-auth.sh',
|
|
84
|
-
env: { OLAM_DEV: '1' },
|
|
85
|
-
installRootDir: installDir,
|
|
86
|
-
});
|
|
87
|
-
expect(result).toBe(path.join(tmpRoot, 'packages/adapters/src/docker/build-auth.sh'));
|
|
88
|
-
});
|
|
89
|
-
it('throws MissingBuildScriptError when not in dev mode', () => {
|
|
90
|
-
const installDir = path.join(tmpRoot, 'packages', 'cli');
|
|
91
|
-
fs.mkdirSync(installDir, { recursive: true });
|
|
92
|
-
expect(() => resolveBuildScript({
|
|
93
|
-
scriptRelPath: 'packages/adapters/src/docker/build-auth.sh',
|
|
94
|
-
env: {},
|
|
95
|
-
installRootDir: installDir,
|
|
96
|
-
})).toThrow(MissingBuildScriptError);
|
|
97
|
-
});
|
|
98
|
-
it('error message names the remedy (clone + OLAM_DEV=1)', () => {
|
|
99
|
-
const installDir = path.join(tmpRoot, 'packages', 'cli');
|
|
100
|
-
fs.mkdirSync(installDir, { recursive: true });
|
|
101
|
-
try {
|
|
102
|
-
resolveBuildScript({
|
|
103
|
-
scriptRelPath: 'packages/adapters/src/docker/build-auth.sh',
|
|
104
|
-
env: {},
|
|
105
|
-
installRootDir: installDir,
|
|
106
|
-
});
|
|
107
|
-
throw new Error('expected throw');
|
|
108
|
-
}
|
|
109
|
-
catch (err) {
|
|
110
|
-
expect(err).toBeInstanceOf(MissingBuildScriptError);
|
|
111
|
-
const msg = err.message;
|
|
112
|
-
expect(msg).toContain('git clone');
|
|
113
|
-
expect(msg).toContain('OLAM_DEV=1');
|
|
114
|
-
expect(msg).toContain('--from-source');
|
|
115
|
-
expect(msg).toContain('ghcr.io/pleri');
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
//# sourceMappingURL=install-root.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"install-root.test.js","sourceRoot":"","sources":["../../src/__tests__/install-root.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for keys.ts pure helpers.
|
|
3
|
-
*
|
|
4
|
-
* Covers readKeysFile (missing/empty/malformed/valid) and the
|
|
5
|
-
* env-merge precedence contract (OLAM_LLM_* keys do not overwrite
|
|
6
|
-
* existing worldEnv entries).
|
|
7
|
-
*/
|
|
8
|
-
export {};
|
|
9
|
-
//# sourceMappingURL=keys.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"keys.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/keys.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for keys.ts pure helpers.
|
|
3
|
-
*
|
|
4
|
-
* Covers readKeysFile (missing/empty/malformed/valid) and the
|
|
5
|
-
* env-merge precedence contract (OLAM_LLM_* keys do not overwrite
|
|
6
|
-
* existing worldEnv entries).
|
|
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 { readKeysFile, keysFilePath } from '../commands/keys.js';
|
|
13
|
-
let tmpHome;
|
|
14
|
-
let originalHome;
|
|
15
|
-
beforeEach(() => {
|
|
16
|
-
tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-keys-test-'));
|
|
17
|
-
originalHome = process.env.OLAM_HOME;
|
|
18
|
-
process.env.OLAM_HOME = tmpHome;
|
|
19
|
-
});
|
|
20
|
-
afterEach(() => {
|
|
21
|
-
if (originalHome === undefined)
|
|
22
|
-
delete process.env.OLAM_HOME;
|
|
23
|
-
else
|
|
24
|
-
process.env.OLAM_HOME = originalHome;
|
|
25
|
-
fs.rmSync(tmpHome, { recursive: true, force: true });
|
|
26
|
-
});
|
|
27
|
-
// ── keysFilePath ──────────────────────────────────────────────────
|
|
28
|
-
describe('keysFilePath', () => {
|
|
29
|
-
it('returns path under OLAM_HOME', () => {
|
|
30
|
-
expect(keysFilePath()).toBe(path.join(tmpHome, 'keys.yaml'));
|
|
31
|
-
});
|
|
32
|
-
it('honors OLAM_HOME so tests do not stomp on the real ~/.olam', () => {
|
|
33
|
-
expect(keysFilePath()).not.toContain(os.homedir() + path.sep + '.olam');
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
// ── readKeysFile ──────────────────────────────────────────────────
|
|
37
|
-
describe('readKeysFile', () => {
|
|
38
|
-
it('returns null when ~/.olam/keys.yaml does not exist', () => {
|
|
39
|
-
expect(readKeysFile()).toBeNull();
|
|
40
|
-
});
|
|
41
|
-
it('returns null for an empty file', () => {
|
|
42
|
-
fs.mkdirSync(tmpHome, { recursive: true });
|
|
43
|
-
fs.writeFileSync(keysFilePath(), '');
|
|
44
|
-
expect(readKeysFile()).toBeNull();
|
|
45
|
-
});
|
|
46
|
-
it('returns null for a whitespace-only file', () => {
|
|
47
|
-
fs.mkdirSync(tmpHome, { recursive: true });
|
|
48
|
-
fs.writeFileSync(keysFilePath(), ' \n\n');
|
|
49
|
-
expect(readKeysFile()).toBeNull();
|
|
50
|
-
});
|
|
51
|
-
it('returns null for malformed YAML', () => {
|
|
52
|
-
fs.mkdirSync(tmpHome, { recursive: true });
|
|
53
|
-
fs.writeFileSync(keysFilePath(), ': bad: yaml: [}');
|
|
54
|
-
expect(readKeysFile()).toBeNull();
|
|
55
|
-
});
|
|
56
|
-
it('returns null when YAML is not an object (array)', () => {
|
|
57
|
-
fs.mkdirSync(tmpHome, { recursive: true });
|
|
58
|
-
fs.writeFileSync(keysFilePath(), '- item1\n- item2\n');
|
|
59
|
-
expect(readKeysFile()).toBeNull();
|
|
60
|
-
});
|
|
61
|
-
it('returns null when YAML is a scalar', () => {
|
|
62
|
-
fs.mkdirSync(tmpHome, { recursive: true });
|
|
63
|
-
fs.writeFileSync(keysFilePath(), 'just a string\n');
|
|
64
|
-
expect(readKeysFile()).toBeNull();
|
|
65
|
-
});
|
|
66
|
-
it('parses a valid single-key file', () => {
|
|
67
|
-
fs.mkdirSync(tmpHome, { recursive: true });
|
|
68
|
-
fs.writeFileSync(keysFilePath(), 'OPENAI: sk-proj-testvalue\n');
|
|
69
|
-
expect(readKeysFile()).toEqual({ OPENAI: 'sk-proj-testvalue' });
|
|
70
|
-
});
|
|
71
|
-
it('parses multiple keys', () => {
|
|
72
|
-
fs.mkdirSync(tmpHome, { recursive: true });
|
|
73
|
-
fs.writeFileSync(keysFilePath(), 'OPENAI: sk-proj-aaa\nGEMINI: AIzaBBB\n');
|
|
74
|
-
expect(readKeysFile()).toEqual({ OPENAI: 'sk-proj-aaa', GEMINI: 'AIzaBBB' });
|
|
75
|
-
});
|
|
76
|
-
it('skips non-string values silently', () => {
|
|
77
|
-
fs.mkdirSync(tmpHome, { recursive: true });
|
|
78
|
-
fs.writeFileSync(keysFilePath(), 'OPENAI: sk-valid\nnumeric: 12345\n');
|
|
79
|
-
// numeric is a YAML integer, not a string — should be skipped
|
|
80
|
-
const result = readKeysFile();
|
|
81
|
-
expect(result).not.toBeNull();
|
|
82
|
-
expect(result.OPENAI).toBe('sk-valid');
|
|
83
|
-
expect('numeric' in result).toBe(false);
|
|
84
|
-
});
|
|
85
|
-
it('returns null when all values are non-string', () => {
|
|
86
|
-
fs.mkdirSync(tmpHome, { recursive: true });
|
|
87
|
-
fs.writeFileSync(keysFilePath(), 'count: 42\nflag: true\n');
|
|
88
|
-
expect(readKeysFile()).toBeNull();
|
|
89
|
-
});
|
|
90
|
-
it('honors OLAM_HOME so tests do not stomp on the real ~/.olam', () => {
|
|
91
|
-
fs.mkdirSync(tmpHome, { recursive: true });
|
|
92
|
-
fs.writeFileSync(keysFilePath(), 'OPENAI: sentinel\n');
|
|
93
|
-
expect(readKeysFile()).toEqual({ OPENAI: 'sentinel' });
|
|
94
|
-
expect(keysFilePath()).toBe(path.join(tmpHome, 'keys.yaml'));
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
// ── env-merge precedence helper ───────────────────────────────────
|
|
98
|
-
//
|
|
99
|
-
// The manager.ts injection logic is: only set OLAM_LLM_<KEY> when it
|
|
100
|
-
// is NOT already present in worldEnv. Verify that contract here by
|
|
101
|
-
// simulating the merge logic used in manager.ts.
|
|
102
|
-
function mergeKeysIntoEnv(keys, existing) {
|
|
103
|
-
const env = { ...existing };
|
|
104
|
-
for (const [k, v] of Object.entries(keys)) {
|
|
105
|
-
const envKey = `OLAM_LLM_${k.toUpperCase()}`;
|
|
106
|
-
if (!(envKey in env)) {
|
|
107
|
-
env[envKey] = v;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
return env;
|
|
111
|
-
}
|
|
112
|
-
describe('env-merge precedence', () => {
|
|
113
|
-
it('injects OLAM_LLM_<UPPER_KEY> for each key', () => {
|
|
114
|
-
const result = mergeKeysIntoEnv({ OPENAI: 'sk-abc', GEMINI: 'AIza-xyz' }, {});
|
|
115
|
-
expect(result).toEqual({
|
|
116
|
-
OLAM_LLM_OPENAI: 'sk-abc',
|
|
117
|
-
OLAM_LLM_GEMINI: 'AIza-xyz',
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
it('uppercases the key name regardless of file case', () => {
|
|
121
|
-
const result = mergeKeysIntoEnv({ openai: 'sk-lower' }, {});
|
|
122
|
-
expect(result.OLAM_LLM_OPENAI).toBe('sk-lower');
|
|
123
|
-
});
|
|
124
|
-
it('does NOT overwrite an existing OLAM_LLM_* entry', () => {
|
|
125
|
-
const result = mergeKeysIntoEnv({ OPENAI: 'from-file' }, { OLAM_LLM_OPENAI: 'already-set' });
|
|
126
|
-
expect(result.OLAM_LLM_OPENAI).toBe('already-set');
|
|
127
|
-
});
|
|
128
|
-
it('does NOT overwrite OLAM_TASK or other protected env keys', () => {
|
|
129
|
-
const result = mergeKeysIntoEnv({ TASK: 'injected' }, { OLAM_LLM_TASK: 'protected' });
|
|
130
|
-
expect(result.OLAM_LLM_TASK).toBe('protected');
|
|
131
|
-
});
|
|
132
|
-
it('does not inject anything when keys map is empty', () => {
|
|
133
|
-
const existing = { OLAM_TASK: 'build feature' };
|
|
134
|
-
const result = mergeKeysIntoEnv({}, existing);
|
|
135
|
-
expect(result).toEqual(existing);
|
|
136
|
-
});
|
|
137
|
-
it('preserves all existing env entries unchanged', () => {
|
|
138
|
-
const existing = { OLAM_TASK: 'task', OLAM_R2_BUCKET: 'bucket' };
|
|
139
|
-
const result = mergeKeysIntoEnv({ OPENAI: 'sk-new' }, existing);
|
|
140
|
-
expect(result.OLAM_TASK).toBe('task');
|
|
141
|
-
expect(result.OLAM_R2_BUCKET).toBe('bucket');
|
|
142
|
-
expect(result.OLAM_LLM_OPENAI).toBe('sk-new');
|
|
143
|
-
});
|
|
144
|
-
});
|
|
145
|
-
//# sourceMappingURL=keys.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"keys.test.js","sourceRoot":"","sources":["../../src/__tests__/keys.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for logs.ts pure helpers.
|
|
3
|
-
*
|
|
4
|
-
* The colorLine and formatLine functions are exported for testability.
|
|
5
|
-
* http.get streaming is exercised by manual `olam logs` invocation against
|
|
6
|
-
* a running world (see B1 Verification in the tracker).
|
|
7
|
-
*/
|
|
8
|
-
export {};
|
|
9
|
-
//# sourceMappingURL=logs.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logs.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/logs.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for logs.ts pure helpers.
|
|
3
|
-
*
|
|
4
|
-
* The colorLine and formatLine functions are exported for testability.
|
|
5
|
-
* http.get streaming is exercised by manual `olam logs` invocation against
|
|
6
|
-
* a running world (see B1 Verification in the tracker).
|
|
7
|
-
*/
|
|
8
|
-
import { describe, it, expect } from 'vitest';
|
|
9
|
-
import { colorLine, formatLine, parseSseEvent } from '../commands/logs.js';
|
|
10
|
-
// picocolors is applied in the tests; we test the string content rather than
|
|
11
|
-
// exact ANSI codes since ANSI output depends on the terminal environment.
|
|
12
|
-
// To make assertions deterministic, we strip ANSI codes via a simple regex.
|
|
13
|
-
const ANSI_RE = /\x1b\[[0-9;]*[A-Za-z]/g;
|
|
14
|
-
function strip(s) {
|
|
15
|
-
return s.replace(ANSI_RE, '');
|
|
16
|
-
}
|
|
17
|
-
describe('parseSseEvent', () => {
|
|
18
|
-
it('returns null for non-data lines', () => {
|
|
19
|
-
expect(parseSseEvent('')).toBeNull();
|
|
20
|
-
expect(parseSseEvent(': ping')).toBeNull();
|
|
21
|
-
expect(parseSseEvent('event: heartbeat')).toBeNull();
|
|
22
|
-
expect(parseSseEvent(': connected')).toBeNull();
|
|
23
|
-
});
|
|
24
|
-
it('returns null for malformed JSON', () => {
|
|
25
|
-
expect(parseSseEvent('data: {bad json')).toBeNull();
|
|
26
|
-
expect(parseSseEvent('data: not-json')).toBeNull();
|
|
27
|
-
});
|
|
28
|
-
it('returns null for unknown event types', () => {
|
|
29
|
-
expect(parseSseEvent('data: {"type":"unknown","foo":"bar"}')).toBeNull();
|
|
30
|
-
expect(parseSseEvent('data: {"type":"error","message":"x"}')).toBeNull();
|
|
31
|
-
});
|
|
32
|
-
it('parses replay events correctly', () => {
|
|
33
|
-
const ev = parseSseEvent('data: {"type":"replay","service":"atlas-core","lines":["a","b"]}');
|
|
34
|
-
expect(ev).not.toBeNull();
|
|
35
|
-
expect(ev.type).toBe('replay');
|
|
36
|
-
if (ev !== null && ev.type === 'replay') {
|
|
37
|
-
expect(ev.service).toBe('atlas-core');
|
|
38
|
-
expect(ev.lines).toEqual(['a', 'b']);
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
it('parses replay events without service field', () => {
|
|
42
|
-
const ev = parseSseEvent('data: {"type":"replay","lines":["x"]}');
|
|
43
|
-
expect(ev).not.toBeNull();
|
|
44
|
-
expect(ev.type).toBe('replay');
|
|
45
|
-
});
|
|
46
|
-
it('parses line events correctly', () => {
|
|
47
|
-
const ev = parseSseEvent('data: {"type":"line","service":"diner-app","line":"server started","ts":1234567}');
|
|
48
|
-
expect(ev).not.toBeNull();
|
|
49
|
-
expect(ev.type).toBe('line');
|
|
50
|
-
if (ev !== null && ev.type === 'line') {
|
|
51
|
-
expect(ev.service).toBe('diner-app');
|
|
52
|
-
expect(ev.line).toBe('server started');
|
|
53
|
-
expect(ev.ts).toBe(1234567);
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
it('returns null for replay with non-array lines', () => {
|
|
57
|
-
expect(parseSseEvent('data: {"type":"replay","lines":"not-array"}')).toBeNull();
|
|
58
|
-
});
|
|
59
|
-
it('returns null for line event with non-string line', () => {
|
|
60
|
-
expect(parseSseEvent('data: {"type":"line","line":42,"ts":0}')).toBeNull();
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
describe('colorLine', () => {
|
|
64
|
-
it('returns plain text unchanged', () => {
|
|
65
|
-
expect(strip(colorLine('server started'))).toBe('server started');
|
|
66
|
-
});
|
|
67
|
-
it('colors ERROR lines (output contains the text)', () => {
|
|
68
|
-
const result = colorLine('ERROR: database unreachable');
|
|
69
|
-
expect(strip(result)).toBe('ERROR: database unreachable');
|
|
70
|
-
// Colored output should differ from plain (ANSI codes present or same in no-color mode).
|
|
71
|
-
// We verify the content is preserved, not the specific ANSI code.
|
|
72
|
-
});
|
|
73
|
-
it('colors WARN lines', () => {
|
|
74
|
-
const result = colorLine('WARN: slow query detected');
|
|
75
|
-
expect(strip(result)).toBe('WARN: slow query detected');
|
|
76
|
-
});
|
|
77
|
-
it('dims INFO lines', () => {
|
|
78
|
-
const result = colorLine('INFO: server listening on port 3000');
|
|
79
|
-
expect(strip(result)).toBe('INFO: server listening on port 3000');
|
|
80
|
-
});
|
|
81
|
-
it('does not false-positive on ERRORS (plural) — word boundary check', () => {
|
|
82
|
-
// "ERRORS" should still match \bERROR\b in some regex flavors; check it works
|
|
83
|
-
const result = colorLine('ERRORS found: 3');
|
|
84
|
-
// "ERRORS" contains "ERROR" — \bERROR\b does NOT match inside "ERRORS"
|
|
85
|
-
// because \b is a word boundary and S follows R. Actually \bERROR\b will NOT
|
|
86
|
-
// match in "ERRORS" because after the R comes S, not a non-word char. Good.
|
|
87
|
-
expect(strip(result)).toBe('ERRORS found: 3');
|
|
88
|
-
});
|
|
89
|
-
it('preserves multi-word lines', () => {
|
|
90
|
-
const line = '2024-01-15T10:00:00Z INFO [atlas-core] Request completed in 42ms';
|
|
91
|
-
expect(strip(colorLine(line))).toBe(line);
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
describe('formatLine', () => {
|
|
95
|
-
it('no prefix when showService=false', () => {
|
|
96
|
-
const result = formatLine('hello world', 'atlas-core', false);
|
|
97
|
-
expect(strip(result)).toBe('hello world');
|
|
98
|
-
});
|
|
99
|
-
it('no prefix when showService=true but service is undefined', () => {
|
|
100
|
-
const result = formatLine('hello world', undefined, true);
|
|
101
|
-
expect(strip(result)).toBe('hello world');
|
|
102
|
-
});
|
|
103
|
-
it('prepends [service] when showService=true and service provided', () => {
|
|
104
|
-
const result = formatLine('server started', 'atlas-core', true);
|
|
105
|
-
expect(strip(result)).toContain('[atlas-core]');
|
|
106
|
-
expect(strip(result)).toContain('server started');
|
|
107
|
-
// Service prefix comes first
|
|
108
|
-
const plain = strip(result);
|
|
109
|
-
expect(plain.indexOf('[atlas-core]')).toBeLessThan(plain.indexOf('server started'));
|
|
110
|
-
});
|
|
111
|
-
it('prepends [service] for multi-service stream with diner-app', () => {
|
|
112
|
-
const result = formatLine('compiled successfully', 'diner-app', true);
|
|
113
|
-
const plain = strip(result);
|
|
114
|
-
expect(plain).toContain('[diner-app]');
|
|
115
|
-
expect(plain).toContain('compiled successfully');
|
|
116
|
-
});
|
|
117
|
-
it('applies color AND prefix together — ERROR line with service', () => {
|
|
118
|
-
const result = formatLine('ERROR: crash', 'atlas-core', true);
|
|
119
|
-
const plain = strip(result);
|
|
120
|
-
expect(plain).toContain('[atlas-core]');
|
|
121
|
-
expect(plain).toContain('ERROR: crash');
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
//# sourceMappingURL=logs.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logs.test.js","sourceRoot":"","sources":["../../src/__tests__/logs.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for olam mcp import discovery + validation.
|
|
3
|
-
*
|
|
4
|
-
* Acceptance:
|
|
5
|
-
* discovery_sweep — fixture with 10 MCPs across 4 source paths →
|
|
6
|
-
* all 10 discovered + dedupe correct < 500ms
|
|
7
|
-
* idempotent_rerun — importing twice imports 10 then 0
|
|
8
|
-
* validation_probe — exit 0 + stdout → validated=true; exit 1 → validated=false
|
|
9
|
-
*/
|
|
10
|
-
export {};
|
|
11
|
-
//# sourceMappingURL=mcp-import.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-import.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/mcp-import.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|