@pleri/olam-cli 0.1.65 → 0.1.68

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,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":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EACL,SAAS,EACT,OAAO,EACP,UAAU,EACV,UAAU,GACX,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAErE,SAAS,SAAS,CAAC,GAAY;IAC7B,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,iCAAiC,CAAC,CAAC;IAElD,KAAK;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC,CAAC;YAChG,OAAO;QACT,CAAC;QACD,WAAW,CAAC,GAAG,GAAG,CAAC,MAAM,UAAU,CAAC,CAAC;QACrC,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CACT,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CACvE,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,4BAA4B,CAAC;SACzC,cAAc,CAAC,eAAe,EAAE,qCAAqC,CAAC;SACtE,cAAc,CAAC,eAAe,EAAE,0CAA0C,CAAC;SAC3E,MAAM,CAAC,sBAAsB,EAAE,qCAAqC,CAAC;SACrE,MAAM,CAAC,2BAA2B,EAAE,iCAAiC,CAAC;SACtE,MAAM,CAAC,CAAC,IAAkF,EAAE,EAAE;QAC7F,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,OAAO,CAAC;gBACpB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;aAClC,CAAC,CAAC;YACH,YAAY,CAAC,oBAAoB,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC;SACzC,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,YAAY,CAAC,iBAAiB,IAAI,GAAG,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0BAA0B,CAAC;SACvC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC;SACzC,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC;SACnC,MAAM,CAAC,sBAAsB,EAAE,iBAAiB,CAAC;SACjD,MAAM,CAAC,2BAA2B,EAAE,oBAAoB,CAAC;SACzD,MAAM,CAAC,CAAC,IAAY,EAAE,IAAqE,EAAE,EAAE;QAC9F,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE;gBAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;aAClC,CAAC,CAAC;YACH,YAAY,CAAC,iBAAiB,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "auth": "sha256:1e6d3574077ba70ba908b5ae343e9ff669937468ff1f48e3e9a449ac38578cc6",
3
- "devbox": "sha256:74ccac7911aad8f9679d27b1c05a74a5414e4aba0c12e336735161ea3d08a19a",
4
- "host-cp": "sha256:c747251056dda0aa8c53a69f69972ff789a842d4ca2cf2cdfd91bc51e803ec9b",
3
+ "devbox": "sha256:6de8b15bc7e4b07b84ea10b011e939bd874c0ac5c2fb0c4c53db668c6c53b2b8",
4
+ "host-cp": "sha256:0a533a638300bda05a45440c62a673300c6d122be74eb83e9b21a0ea4432f174",
5
5
  "mcp-auth": "sha256:cccf9fc022a3b58080007761ff10e4820080d26491e7b6e758e3e766c9eac896",
6
6
  "$schema_version": 1,
7
- "$published_version": "0.1.65",
7
+ "$published_version": "0.1.68",
8
8
  "$registry": "ghcr.io/pleri"
9
9
  }