@pleri/olam-cli 0.1.66 → 0.1.69

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.
@@ -0,0 +1,26 @@
1
+ /**
2
+ * audit-publish-deps-contract.test.ts — contractual regression for the fix
3
+ * that prevents the May-2026 release-pipeline wedge.
4
+ *
5
+ * Bug history: PR #375 added `_require('json-source-map')` to
6
+ * src/commands/config.ts but rewrite-publish-package-json.mjs's hand-curated
7
+ * PUBLISH_DEPS list never picked it up. Versions 0.1.66 / 0.1.67 / 0.1.68
8
+ * published to npm without json-source-map declared. host-cp Dockerfile's
9
+ * `npm install -g @pleri/olam-cli@latest && olam --version` crashed with
10
+ * `Cannot find module 'json-source-map'`. Three consecutive release runs
11
+ * failed; pipeline wedged because the host-cp build sat upstream of the
12
+ * commit-and-publish-npm step that would have shipped the fix.
13
+ *
14
+ * Pin the contract:
15
+ * 1. PUBLISH_DEPS must contain json-source-map.
16
+ * 2. EXTERNAL must contain json-source-map (esbuild can't bundle dynamic
17
+ * _require()'d modules; without external, the require survives in the
18
+ * bundle and crashes if not also installed at runtime).
19
+ * 3. The audit-publish-deps.mjs script exists and is wired into prepublishOnly
20
+ * so this drift class fails fast rather than wedging the pipeline.
21
+ * 4. The host-cp Dockerfile installs from a local tarball (cli.tgz), not
22
+ * from npm @latest — eliminates the wedge class permanently.
23
+ * 5. The release.yml workflow stages cli.tgz before the host-cp build.
24
+ */
25
+ export {};
26
+ //# sourceMappingURL=audit-publish-deps-contract.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-publish-deps-contract.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/audit-publish-deps-contract.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * audit-publish-deps-contract.test.ts — contractual regression for the fix
3
+ * that prevents the May-2026 release-pipeline wedge.
4
+ *
5
+ * Bug history: PR #375 added `_require('json-source-map')` to
6
+ * src/commands/config.ts but rewrite-publish-package-json.mjs's hand-curated
7
+ * PUBLISH_DEPS list never picked it up. Versions 0.1.66 / 0.1.67 / 0.1.68
8
+ * published to npm without json-source-map declared. host-cp Dockerfile's
9
+ * `npm install -g @pleri/olam-cli@latest && olam --version` crashed with
10
+ * `Cannot find module 'json-source-map'`. Three consecutive release runs
11
+ * failed; pipeline wedged because the host-cp build sat upstream of the
12
+ * commit-and-publish-npm step that would have shipped the fix.
13
+ *
14
+ * Pin the contract:
15
+ * 1. PUBLISH_DEPS must contain json-source-map.
16
+ * 2. EXTERNAL must contain json-source-map (esbuild can't bundle dynamic
17
+ * _require()'d modules; without external, the require survives in the
18
+ * bundle and crashes if not also installed at runtime).
19
+ * 3. The audit-publish-deps.mjs script exists and is wired into prepublishOnly
20
+ * so this drift class fails fast rather than wedging the pipeline.
21
+ * 4. The host-cp Dockerfile installs from a local tarball (cli.tgz), not
22
+ * from npm @latest — eliminates the wedge class permanently.
23
+ * 5. The release.yml workflow stages cli.tgz before the host-cp build.
24
+ */
25
+ import { describe, it, expect } from 'vitest';
26
+ import { readFileSync } from 'node:fs';
27
+ import { join } from 'node:path';
28
+ import { fileURLToPath } from 'node:url';
29
+ import { dirname } from 'node:path';
30
+ const __filename = fileURLToPath(import.meta.url);
31
+ const __dirname = dirname(__filename);
32
+ const CLI_ROOT = join(__dirname, '..', '..');
33
+ const REPO_ROOT = join(CLI_ROOT, '..', '..');
34
+ describe('release pipeline wedge — invariants', () => {
35
+ it('PUBLISH_DEPS contains json-source-map', () => {
36
+ const src = readFileSync(join(CLI_ROOT, 'scripts', 'rewrite-publish-package-json.mjs'), 'utf8');
37
+ expect(src).toMatch(/['"]json-source-map['"]\s*:\s*['"]\^?0\.6\./);
38
+ });
39
+ it('bundle-cli.mjs marks json-source-map external (dynamic _require)', () => {
40
+ const src = readFileSync(join(CLI_ROOT, 'scripts', 'bundle-cli.mjs'), 'utf8');
41
+ // Must appear inside the EXTERNAL array literal.
42
+ const externalBlock = src.slice(src.indexOf('const EXTERNAL = ['));
43
+ expect(externalBlock).toMatch(/['"]json-source-map['"]/);
44
+ });
45
+ it('audit-publish-deps.mjs exists and is wired into prepublishOnly', () => {
46
+ const auditScript = readFileSync(join(CLI_ROOT, 'scripts', 'audit-publish-deps.mjs'), 'utf8');
47
+ expect(auditScript).toMatch(/PUBLISH_DEPS/);
48
+ expect(auditScript).toMatch(/EXTERNAL/);
49
+ const pkg = JSON.parse(readFileSync(join(CLI_ROOT, 'package.json'), 'utf8'));
50
+ // prepublishOnly must run audit:publish-deps before rewrite-publish-package-json.
51
+ expect(pkg.scripts.prepublishOnly).toMatch(/audit:publish-deps/);
52
+ // The script itself must exist as an npm script too.
53
+ expect(pkg.scripts['audit:publish-deps']).toBeDefined();
54
+ });
55
+ it('host-cp Dockerfile installs from local cli.tgz, not npm @latest', () => {
56
+ const dockerfile = readFileSync(join(REPO_ROOT, 'packages', 'host-cp', 'Dockerfile'), 'utf8');
57
+ // Must NOT pull from npm @latest — that's the wedge.
58
+ // Match only ACTUAL run-shape lines (npm install at line start or after
59
+ // backslash-continuation), not the comment block that documents the
60
+ // historical bug.
61
+ const runLines = dockerfile
62
+ .split('\n')
63
+ .filter((l) => !l.trim().startsWith('#'))
64
+ .join('\n');
65
+ expect(runLines).not.toMatch(/npm install -g @pleri\/olam-cli@latest/);
66
+ // Must install from the staged tarball.
67
+ expect(dockerfile).toMatch(/COPY cli\.tgz/);
68
+ expect(dockerfile).toMatch(/npm install -g \/tmp\/olam-cli\.tgz/);
69
+ });
70
+ it('release.yml stages cli.tgz before host-cp docker build', () => {
71
+ const workflow = readFileSync(join(REPO_ROOT, '.github', 'workflows', 'release.yml'), 'utf8');
72
+ expect(workflow).toMatch(/scripts\/ci\/stage-host-cp-cli\.sh/);
73
+ // Order matters: stage-host-cp-cli.sh must appear BEFORE the
74
+ // docker/build-push-action@v6 invocation in publish-host-cp.
75
+ const publishHostCpBlock = workflow.slice(workflow.indexOf('publish-host-cp:'));
76
+ const stageIdx = publishHostCpBlock.indexOf('stage-host-cp-cli.sh');
77
+ const buildIdx = publishHostCpBlock.indexOf('docker/build-push-action');
78
+ expect(stageIdx).toBeGreaterThan(0);
79
+ expect(buildIdx).toBeGreaterThan(stageIdx);
80
+ });
81
+ it('ci.yml audit job runs audit:publish-deps', () => {
82
+ const ci = readFileSync(join(REPO_ROOT, '.github', 'workflows', 'ci.yml'), 'utf8');
83
+ expect(ci).toMatch(/audit:publish-deps/);
84
+ });
85
+ });
86
+ //# sourceMappingURL=audit-publish-deps-contract.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-publish-deps-contract.test.js","sourceRoot":"","sources":["../../src/__tests__/audit-publish-deps-contract.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,95 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerConfig(program: Command): void;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiDrD"}
@@ -0,0 +1,53 @@
1
+ import * as fs from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import { GlobalConfigSchema } from '@olam/core/src/global-config/index.js';
4
+ import { globalConfigPath } from '@olam/core/src/global-config/store.js';
5
+ const _require = createRequire(import.meta.url);
6
+ const { parse: parseWithMap } = _require('json-source-map');
7
+ export function registerConfig(program) {
8
+ const config = program.command('config').description('Manage global olam configuration');
9
+ config
10
+ .command('validate [path]')
11
+ .description('Validate ~/.olam/config.json (or a custom path) against the schema')
12
+ .action((filePath) => {
13
+ const resolvedPath = filePath ?? globalConfigPath();
14
+ if (!fs.existsSync(resolvedPath)) {
15
+ process.stderr.write(`config file not found: ${resolvedPath}\n`);
16
+ process.exit(1);
17
+ }
18
+ let raw;
19
+ try {
20
+ raw = fs.readFileSync(resolvedPath, 'utf-8');
21
+ }
22
+ catch (err) {
23
+ const msg = err instanceof Error ? err.message : String(err);
24
+ process.stderr.write(`cannot read ${resolvedPath}: ${msg}\n`);
25
+ process.exit(1);
26
+ }
27
+ let parsed;
28
+ let pointers;
29
+ try {
30
+ const result = parseWithMap(raw);
31
+ parsed = result.data;
32
+ pointers = result.pointers;
33
+ }
34
+ catch (err) {
35
+ const msg = err instanceof Error ? err.message : String(err);
36
+ process.stderr.write(`${resolvedPath}: invalid JSON — ${msg}\n`);
37
+ process.exit(1);
38
+ }
39
+ const result = GlobalConfigSchema.safeParse(parsed);
40
+ if (result.success) {
41
+ process.exit(0);
42
+ }
43
+ for (const issue of result.error.issues) {
44
+ const pointer = '/' + issue.path.join('/');
45
+ const entry = pointers[pointer];
46
+ const rawLine = entry?.value?.line ?? entry?.key?.line ?? -1;
47
+ const lineStr = rawLine >= 0 ? `Line ${rawLine + 1}: ` : '';
48
+ process.stderr.write(`${lineStr}${pointer}: ${issue.message}\n`);
49
+ }
50
+ process.exit(1);
51
+ });
52
+ }
53
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * olam repos — manage the global repo registry (~/.olam/config.json).
3
+ *
4
+ * olam repos list
5
+ * olam repos add --name <n> --path <p> [--description <d>] [--default-branch <b>]
6
+ * olam repos remove <name>
7
+ * olam repos update <name> [--path <p>] [--description <d>] [--default-branch <b>]
8
+ */
9
+ import type { Command } from 'commander';
10
+ export declare function registerRepos(program: Command): void;
11
+ //# sourceMappingURL=repos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repos.d.ts","sourceRoot":"","sources":["../../src/commands/repos.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAczC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+EpD"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * olam repos — manage the global repo registry (~/.olam/config.json).
3
+ *
4
+ * olam repos list
5
+ * olam repos add --name <n> --path <p> [--description <d>] [--default-branch <b>]
6
+ * olam repos remove <name>
7
+ * olam repos update <name> [--path <p>] [--description <d>] [--default-branch <b>]
8
+ */
9
+ import pc from 'picocolors';
10
+ import { listRepos, addRepo, removeRepo, updateRepo, } from '@olam/core/src/global-config/index.js';
11
+ import { printError, printSuccess, printHeader } from '../output.js';
12
+ function asMessage(err) {
13
+ return err instanceof Error ? err.message : String(err);
14
+ }
15
+ export function registerRepos(program) {
16
+ const repos = program
17
+ .command('repos')
18
+ .description('Manage the global repo registry');
19
+ repos
20
+ .command('list')
21
+ .description('List all registered repos')
22
+ .action(() => {
23
+ const all = listRepos();
24
+ if (all.length === 0) {
25
+ console.log(pc.dim('0 repo(s) registered. Add one with: olam repos add --name <n> --path <p>'));
26
+ return;
27
+ }
28
+ printHeader(`${all.length} repo(s)`);
29
+ for (const r of all) {
30
+ const when = new Date(r.addedAt).toISOString().slice(0, 10);
31
+ console.log(` ${pc.bold(r.name.padEnd(24))} ${r.path.padEnd(48)} ${pc.dim(when)}`);
32
+ }
33
+ });
34
+ repos
35
+ .command('add')
36
+ .description('Register a local repo path')
37
+ .requiredOption('--name <name>', 'Repo name (lowercase, digits, dash)')
38
+ .requiredOption('--path <path>', 'Absolute or ~/... path to the local repo')
39
+ .option('--description <desc>', 'Optional human-readable description')
40
+ .option('--default-branch <branch>', 'Default branch name (e.g. main)')
41
+ .action((opts) => {
42
+ try {
43
+ const entry = addRepo({
44
+ name: opts.name,
45
+ path: opts.path,
46
+ description: opts.description,
47
+ defaultBranch: opts.defaultBranch,
48
+ });
49
+ printSuccess(`registered repo "${entry.name}" at ${entry.path}`);
50
+ }
51
+ catch (err) {
52
+ printError(asMessage(err));
53
+ process.exitCode = 1;
54
+ }
55
+ });
56
+ repos
57
+ .command('remove')
58
+ .description('Remove a repo from the registry')
59
+ .argument('<name>', 'Repo name to remove')
60
+ .action((name) => {
61
+ try {
62
+ removeRepo(name);
63
+ printSuccess(`removed repo "${name}"`);
64
+ }
65
+ catch (err) {
66
+ printError(asMessage(err));
67
+ process.exitCode = 1;
68
+ }
69
+ });
70
+ repos
71
+ .command('update')
72
+ .description('Update a registered repo')
73
+ .argument('<name>', 'Repo name to update')
74
+ .option('--path <path>', 'New path')
75
+ .option('--description <desc>', 'New description')
76
+ .option('--default-branch <branch>', 'New default branch')
77
+ .action((name, opts) => {
78
+ try {
79
+ const entry = updateRepo(name, {
80
+ path: opts.path,
81
+ description: opts.description,
82
+ defaultBranch: opts.defaultBranch,
83
+ });
84
+ printSuccess(`updated repo "${entry.name}"`);
85
+ }
86
+ catch (err) {
87
+ printError(asMessage(err));
88
+ process.exitCode = 1;
89
+ }
90
+ });
91
+ }
92
+ //# sourceMappingURL=repos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repos.js","sourceRoot":"","sources":["../../src/commands/repos.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  {
2
- "auth": "sha256:1e6d3574077ba70ba908b5ae343e9ff669937468ff1f48e3e9a449ac38578cc6",
3
- "devbox": "sha256:51d091385dfea24529a97f0949780b92a3f2fad4011a3b32106645046de3213e",
4
- "host-cp": "sha256:b96191c00ca6f1ef5c12990a5802f8737a44500c0d28bcea5182052e28cf0838",
5
- "mcp-auth": "sha256:cccf9fc022a3b58080007761ff10e4820080d26491e7b6e758e3e766c9eac896",
2
+ "auth": "sha256:ab26e55f6b6835720596edcc6e969740298ee6b4f42b0a2070886527d3b8d83b",
3
+ "devbox": "sha256:f1b6e9b92c89bc9d76d83a718f0345e7a9a8484fb8157d2007409c413ae80b35",
4
+ "host-cp": "sha256:60b01e6c33251ab52be32bcfd5cd798dda7f9be5078e6a1cc104737471ed73c6",
5
+ "mcp-auth": "sha256:c8dcaf921b5da00474a3c9585dac9b8a095bd2da60836cbc8637995d62b83f9c",
6
6
  "$schema_version": 1,
7
- "$published_version": "0.1.66",
7
+ "$published_version": "0.1.69",
8
8
  "$registry": "ghcr.io/pleri"
9
9
  }