@elaraai/e3-cli 0.0.1-alpha.2

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.
Files changed (71) hide show
  1. package/LICENSE.md +50 -0
  2. package/README.md +121 -0
  3. package/dist/src/cli-test-helpers.d.ts +17 -0
  4. package/dist/src/cli-test-helpers.d.ts.map +1 -0
  5. package/dist/src/cli-test-helpers.js +48 -0
  6. package/dist/src/cli-test-helpers.js.map +1 -0
  7. package/dist/src/cli.d.ts +7 -0
  8. package/dist/src/cli.d.ts.map +1 -0
  9. package/dist/src/cli.js +144 -0
  10. package/dist/src/cli.js.map +1 -0
  11. package/dist/src/commands/convert.d.ts +11 -0
  12. package/dist/src/commands/convert.d.ts.map +1 -0
  13. package/dist/src/commands/convert.impl.d.ts +31 -0
  14. package/dist/src/commands/convert.impl.d.ts.map +1 -0
  15. package/dist/src/commands/convert.impl.js +197 -0
  16. package/dist/src/commands/convert.impl.js.map +1 -0
  17. package/dist/src/commands/convert.js +11 -0
  18. package/dist/src/commands/convert.js.map +1 -0
  19. package/dist/src/commands/gc.d.ts +12 -0
  20. package/dist/src/commands/gc.d.ts.map +1 -0
  21. package/dist/src/commands/gc.js +44 -0
  22. package/dist/src/commands/gc.js.map +1 -0
  23. package/dist/src/commands/get.d.ts +11 -0
  24. package/dist/src/commands/get.d.ts.map +1 -0
  25. package/dist/src/commands/get.js +60 -0
  26. package/dist/src/commands/get.js.map +1 -0
  27. package/dist/src/commands/init.d.ts +9 -0
  28. package/dist/src/commands/init.d.ts.map +1 -0
  29. package/dist/src/commands/init.js +33 -0
  30. package/dist/src/commands/init.js.map +1 -0
  31. package/dist/src/commands/list.d.ts +9 -0
  32. package/dist/src/commands/list.d.ts.map +1 -0
  33. package/dist/src/commands/list.js +54 -0
  34. package/dist/src/commands/list.js.map +1 -0
  35. package/dist/src/commands/logs.d.ts +11 -0
  36. package/dist/src/commands/logs.d.ts.map +1 -0
  37. package/dist/src/commands/logs.js +179 -0
  38. package/dist/src/commands/logs.js.map +1 -0
  39. package/dist/src/commands/package.d.ts +23 -0
  40. package/dist/src/commands/package.d.ts.map +1 -0
  41. package/dist/src/commands/package.js +78 -0
  42. package/dist/src/commands/package.js.map +1 -0
  43. package/dist/src/commands/run.d.ts +12 -0
  44. package/dist/src/commands/run.d.ts.map +1 -0
  45. package/dist/src/commands/run.js +99 -0
  46. package/dist/src/commands/run.js.map +1 -0
  47. package/dist/src/commands/set.d.ts +11 -0
  48. package/dist/src/commands/set.d.ts.map +1 -0
  49. package/dist/src/commands/set.js +129 -0
  50. package/dist/src/commands/set.js.map +1 -0
  51. package/dist/src/commands/start.d.ts +13 -0
  52. package/dist/src/commands/start.d.ts.map +1 -0
  53. package/dist/src/commands/start.js +111 -0
  54. package/dist/src/commands/start.js.map +1 -0
  55. package/dist/src/commands/status.d.ts +9 -0
  56. package/dist/src/commands/status.d.ts.map +1 -0
  57. package/dist/src/commands/status.js +157 -0
  58. package/dist/src/commands/status.js.map +1 -0
  59. package/dist/src/commands/workspace.d.ts +30 -0
  60. package/dist/src/commands/workspace.d.ts.map +1 -0
  61. package/dist/src/commands/workspace.js +106 -0
  62. package/dist/src/commands/workspace.js.map +1 -0
  63. package/dist/src/index.d.ts +6 -0
  64. package/dist/src/index.d.ts.map +1 -0
  65. package/dist/src/index.js +6 -0
  66. package/dist/src/index.js.map +1 -0
  67. package/dist/src/utils.d.ts +28 -0
  68. package/dist/src/utils.d.ts.map +1 -0
  69. package/dist/src/utils.js +45 -0
  70. package/dist/src/utils.js.map +1 -0
  71. package/package.json +50 -0
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ /**
6
+ * e3 run command - Ad-hoc task execution
7
+ *
8
+ * Usage:
9
+ * e3 run . acme-forecast/train ./sales.beast2 -o ./model.beast2
10
+ * e3 run . my-pkg@1.0.0/process ./input1.beast2 ./input2.beast2 -o ./output.beast2
11
+ * e3 run . my-pkg/task ./data.beast2 -o ./out.beast2 --force
12
+ */
13
+ import { readFile, writeFile } from 'fs/promises';
14
+ import { packageRead, objectWrite, objectRead, taskExecute, } from '@elaraai/e3-core';
15
+ import { decodeBeast2 } from '@elaraai/east';
16
+ import { resolveRepo, parsePackageSpec, formatError, exitError } from '../utils.js';
17
+ /**
18
+ * Parse task specifier: pkg/task or pkg@version/task
19
+ */
20
+ function parseTaskSpec(spec) {
21
+ const slashIndex = spec.indexOf('/');
22
+ if (slashIndex === -1) {
23
+ throw new Error(`Invalid task specifier: ${spec}. Expected format: pkg/task or pkg@version/task`);
24
+ }
25
+ const pkgPart = spec.slice(0, slashIndex);
26
+ const task = spec.slice(slashIndex + 1);
27
+ if (!task) {
28
+ throw new Error(`Invalid task specifier: ${spec}. Task name cannot be empty.`);
29
+ }
30
+ const { name, version } = parsePackageSpec(pkgPart);
31
+ return { name, version, task };
32
+ }
33
+ /**
34
+ * Run a task ad-hoc with file inputs and output.
35
+ */
36
+ export async function runCommand(repoArg, taskSpec, inputs, options) {
37
+ try {
38
+ const repoPath = resolveRepo(repoArg);
39
+ // Parse task specifier
40
+ const { name, version, task } = parseTaskSpec(taskSpec);
41
+ // Validate output is provided
42
+ if (!options.output) {
43
+ exitError('Output file is required. Use -o <path> to specify output.');
44
+ }
45
+ // Get package and find task hash
46
+ const pkg = await packageRead(repoPath, name, version);
47
+ const taskHash = pkg.tasks.get(task);
48
+ if (!taskHash) {
49
+ const available = Array.from(pkg.tasks.keys()).join(', ');
50
+ exitError(`Task '${task}' not found in ${name}@${version}. Available: ${available || '(none)'}`);
51
+ }
52
+ console.log(`Running ${name}@${version}/${task}`);
53
+ // Read input files and store as objects
54
+ const inputHashes = [];
55
+ for (const inputPath of inputs) {
56
+ const data = await readFile(inputPath);
57
+ // Verify it's valid beast2 (will throw if not)
58
+ try {
59
+ decodeBeast2(data);
60
+ }
61
+ catch {
62
+ exitError(`Invalid beast2 file: ${inputPath}`);
63
+ }
64
+ const hash = await objectWrite(repoPath, data);
65
+ inputHashes.push(hash);
66
+ console.log(` Input: ${inputPath} -> ${hash.slice(0, 8)}...`);
67
+ }
68
+ // Execute the task
69
+ const startTime = Date.now();
70
+ const result = await taskExecute(repoPath, taskHash, inputHashes, {
71
+ force: options.force,
72
+ });
73
+ const elapsed = Date.now() - startTime;
74
+ if (result.cached) {
75
+ console.log(`Cached (${elapsed}ms)`);
76
+ }
77
+ else {
78
+ console.log(`Done (${elapsed}ms)`);
79
+ }
80
+ // Handle result
81
+ if (result.state === 'success' && result.outputHash) {
82
+ // Read output object and write to file
83
+ const outputData = await objectRead(repoPath, result.outputHash);
84
+ await writeFile(options.output, outputData);
85
+ console.log(`Output: ${options.output}`);
86
+ }
87
+ else if (result.state === 'failed') {
88
+ console.error(`Task failed with exit code: ${result.exitCode}`);
89
+ process.exit(1);
90
+ }
91
+ else if (result.state === 'error') {
92
+ exitError(result.error ?? 'Unknown error');
93
+ }
94
+ }
95
+ catch (err) {
96
+ exitError(formatError(err));
97
+ }
98
+ }
99
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Set dataset value from a file.
7
+ */
8
+ export declare function setCommand(repoArg: string, pathSpec: string, filePath: string, options?: {
9
+ type?: string;
10
+ }): Promise<void>;
11
+ //# sourceMappingURL=set.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../../src/commands/set.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA8CH;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9B,OAAO,CAAC,IAAI,CAAC,CA8Ff"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ /**
6
+ * e3 set command - Set dataset value from file
7
+ *
8
+ * Usage:
9
+ * e3 set . ws.path.to.dataset ./data.beast2
10
+ * e3 set . ws.path.to.dataset ./data.east
11
+ * e3 set . ws.path.to.dataset ./data.json --type ".Integer"
12
+ * e3 set . ws.path.to.dataset ./data.csv --type ".Array .Struct [{name: \"name\", type: .String}, {name: \"value\", type: .Integer}]"
13
+ */
14
+ import { readFile } from 'fs/promises';
15
+ import { extname } from 'path';
16
+ import { WorkspaceLockError, workspaceSetDataset } from '@elaraai/e3-core';
17
+ import { decodeBeast2, parseFor, fromJSONFor, decodeCsvFor, EastTypeType, parseInferred, toEastTypeValue, } from '@elaraai/east';
18
+ import { resolveRepo, parseDatasetPath, formatError, exitError } from '../utils.js';
19
+ /**
20
+ * Parse a type specification in .east format.
21
+ * Types are represented as EastTypeValue variants.
22
+ *
23
+ * Examples:
24
+ * ".Integer" -> variant("Integer", null)
25
+ * ".Array .Integer" -> variant("Array", variant("Integer", null))
26
+ * ".Struct [{name: \"x\", type: .Integer}]" -> variant("Struct", [{name: "x", type: variant("Integer", null)}])
27
+ */
28
+ function parseTypeSpec(typeSpec) {
29
+ const parser = parseFor(EastTypeType);
30
+ const result = parser(typeSpec);
31
+ if (!result.success) {
32
+ throw new Error(`Invalid type specification: ${result.error}`);
33
+ }
34
+ return result.value;
35
+ }
36
+ /**
37
+ * Set dataset value from a file.
38
+ */
39
+ export async function setCommand(repoArg, pathSpec, filePath, options = {}) {
40
+ try {
41
+ const repoPath = resolveRepo(repoArg);
42
+ const { ws, path } = parseDatasetPath(pathSpec);
43
+ if (path.length === 0) {
44
+ exitError('Path must include at least one field (e.g., ws.field)');
45
+ }
46
+ // Parse type specification if provided
47
+ let providedType;
48
+ if (options.type) {
49
+ providedType = parseTypeSpec(options.type);
50
+ }
51
+ // Read and decode the file based on extension
52
+ const fileContent = await readFile(filePath);
53
+ const ext = extname(filePath).toLowerCase();
54
+ let value;
55
+ let type;
56
+ switch (ext) {
57
+ case '.beast2': {
58
+ // Beast2 is self-describing, type spec is optional (for override)
59
+ const decoded = decodeBeast2(fileContent);
60
+ value = decoded.value;
61
+ type = providedType ?? decoded.type;
62
+ break;
63
+ }
64
+ case '.east': {
65
+ const content = fileContent.toString('utf-8');
66
+ if (providedType) {
67
+ // Parse with provided type for stricter validation
68
+ const parser = parseFor(providedType);
69
+ const result = parser(content);
70
+ if (!result.success) {
71
+ exitError(`Failed to parse .east file: ${result.error}`);
72
+ }
73
+ value = result.value;
74
+ type = providedType;
75
+ }
76
+ else {
77
+ // Use parseInferred for type inference from .east syntax
78
+ const [parsedType, parsedValue] = parseInferred(content);
79
+ // parseInferred returns EastType, but we need EastTypeValue
80
+ // Use toEastTypeValue to convert
81
+ value = parsedValue;
82
+ type = toEastTypeValue(parsedType);
83
+ }
84
+ break;
85
+ }
86
+ case '.json': {
87
+ if (!providedType) {
88
+ exitError('JSON files require --type flag. Example: --type ".Integer"');
89
+ }
90
+ const content = fileContent.toString('utf-8');
91
+ const jsonValue = JSON.parse(content);
92
+ const fromJSON = fromJSONFor(providedType);
93
+ value = fromJSON(jsonValue);
94
+ type = providedType;
95
+ break;
96
+ }
97
+ case '.csv': {
98
+ if (!providedType) {
99
+ exitError('CSV files require --type flag. Example: --type ".Array .Struct [{name: \\"name\\", type: .String}]"');
100
+ }
101
+ // CSV expects .Array .Struct [...] - check the variant type
102
+ if (providedType.type !== 'Array') {
103
+ exitError('CSV files require an Array type. Example: --type ".Array .Struct [...]"');
104
+ }
105
+ const elementType = providedType.value;
106
+ if (elementType.type !== 'Struct') {
107
+ exitError('CSV files require Array of Struct type. Example: --type ".Array .Struct [{name: \\"x\\", type: .Integer}]"');
108
+ }
109
+ const decoder = decodeCsvFor(elementType);
110
+ value = decoder(fileContent);
111
+ type = providedType;
112
+ break;
113
+ }
114
+ default:
115
+ exitError(`Unknown file extension: ${ext}. Supported: .beast2, .east, .json, .csv`);
116
+ }
117
+ await workspaceSetDataset(repoPath, ws, path, value, type);
118
+ console.log(`Set ${pathSpec} from ${filePath}`);
119
+ }
120
+ catch (err) {
121
+ if (err instanceof WorkspaceLockError) {
122
+ console.log('');
123
+ console.log(`Workspace is locked by another process with PID: ${err.holder?.pid ?? 'unknown'}`);
124
+ process.exit(1);
125
+ }
126
+ exitError(formatError(err));
127
+ }
128
+ }
129
+ //# sourceMappingURL=set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.js","sourceRoot":"","sources":["../../../src/commands/set.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Execute tasks in a workspace.
7
+ */
8
+ export declare function startCommand(repoArg: string, ws: string, options: {
9
+ filter?: string;
10
+ concurrency?: string;
11
+ force?: boolean;
12
+ }): Promise<void>;
13
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/commands/start.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAClE,OAAO,CAAC,IAAI,CAAC,CAkFf"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ /**
6
+ * e3 start command - Execute tasks in a workspace
7
+ *
8
+ * Usage:
9
+ * e3 start . my-workspace
10
+ * e3 start . my-workspace --concurrency 2
11
+ * e3 start . my-workspace --force
12
+ */
13
+ import { dataflowExecute, DataflowAbortedError, WorkspaceLockError } from '@elaraai/e3-core';
14
+ import { resolveRepo, formatError, exitError } from '../utils.js';
15
+ /**
16
+ * Execute tasks in a workspace.
17
+ */
18
+ export async function startCommand(repoArg, ws, options) {
19
+ // Set up abort controller for signal handling
20
+ const controller = new AbortController();
21
+ // Handle SIGINT (Ctrl+C) and SIGTERM gracefully
22
+ const signalHandler = (signal) => {
23
+ console.log('');
24
+ console.log(`Received ${signal}, aborting...`);
25
+ controller.abort();
26
+ };
27
+ process.on('SIGINT', () => signalHandler('SIGINT'));
28
+ process.on('SIGTERM', () => signalHandler('SIGTERM'));
29
+ try {
30
+ const repoPath = resolveRepo(repoArg);
31
+ const concurrency = options.concurrency ? parseInt(options.concurrency, 10) : 4;
32
+ console.log(`Starting tasks in workspace: ${ws}`);
33
+ if (options.filter) {
34
+ console.log(`Filter: ${options.filter}`);
35
+ }
36
+ console.log(`Concurrency: ${concurrency}`);
37
+ if (options.force) {
38
+ console.log('Force: re-executing all tasks');
39
+ }
40
+ console.log('');
41
+ const result = await dataflowExecute(repoPath, ws, {
42
+ concurrency,
43
+ force: options.force,
44
+ filter: options.filter,
45
+ signal: controller.signal,
46
+ onTaskStart: (name) => {
47
+ console.log(` [START] ${name}`);
48
+ },
49
+ onTaskComplete: (taskResult) => {
50
+ const status = formatTaskStatus(taskResult);
51
+ const cached = taskResult.cached ? ' (cached)' : '';
52
+ const duration = taskResult.duration > 0 ? ` [${taskResult.duration}ms]` : '';
53
+ console.log(` [${status}] ${taskResult.name}${cached}${duration}`);
54
+ },
55
+ });
56
+ console.log('');
57
+ console.log('Summary:');
58
+ console.log(` Executed: ${result.executed}`);
59
+ console.log(` Cached: ${result.cached}`);
60
+ console.log(` Failed: ${result.failed}`);
61
+ console.log(` Skipped: ${result.skipped}`);
62
+ console.log(` Duration: ${result.duration}ms`);
63
+ if (!result.success) {
64
+ console.log('');
65
+ console.log('Failed tasks:');
66
+ for (const task of result.tasks) {
67
+ if (task.state === 'failed') {
68
+ const exitInfo = task.exitCode != null ? `exit code ${task.exitCode}` : 'spawn failed';
69
+ const errorInfo = task.error ? ` - ${task.error}` : '';
70
+ console.log(` ${task.name}: ${exitInfo}${errorInfo}`);
71
+ }
72
+ else if (task.state === 'error') {
73
+ console.log(` ${task.name}: ${task.error}`);
74
+ }
75
+ }
76
+ process.exit(1);
77
+ }
78
+ }
79
+ catch (err) {
80
+ if (err instanceof DataflowAbortedError) {
81
+ console.log('');
82
+ console.log('Aborted.');
83
+ if (err.partialResults && err.partialResults.length > 0) {
84
+ const completed = err.partialResults.filter(r => r.state === 'success').length;
85
+ console.log(` Completed before abort: ${completed}`);
86
+ }
87
+ process.exit(130); // Standard exit code for SIGINT (128 + 2)
88
+ }
89
+ else if (err instanceof WorkspaceLockError) {
90
+ console.log('');
91
+ console.log(`Workspace is locked by another process with PID: ${err.holder?.pid ?? 'unknown'}`);
92
+ process.exit(1);
93
+ }
94
+ exitError(formatError(err));
95
+ }
96
+ }
97
+ function formatTaskStatus(result) {
98
+ switch (result.state) {
99
+ case 'success':
100
+ return 'DONE';
101
+ case 'failed':
102
+ return 'FAIL';
103
+ case 'error':
104
+ return 'ERR';
105
+ case 'skipped':
106
+ return 'SKIP';
107
+ default:
108
+ return '???';
109
+ }
110
+ }
111
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Show repository or workspace status.
7
+ */
8
+ export declare function statusCommand(repoArg: string, workspace?: string): Promise<void>;
9
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYtF"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ /**
6
+ * e3 status command - Show repository or workspace status
7
+ *
8
+ * Usage:
9
+ * e3 status . # Show repository status
10
+ * e3 status . production # Show detailed workspace status
11
+ */
12
+ import { packageList, workspaceList, workspaceGetState, workspaceStatus, } from '@elaraai/e3-core';
13
+ import { resolveRepo, formatError, exitError } from '../utils.js';
14
+ /**
15
+ * Show repository or workspace status.
16
+ */
17
+ export async function statusCommand(repoArg, workspace) {
18
+ try {
19
+ const repoPath = resolveRepo(repoArg);
20
+ if (workspace) {
21
+ await showWorkspaceStatus(repoPath, workspace);
22
+ }
23
+ else {
24
+ await showRepoStatus(repoPath);
25
+ }
26
+ }
27
+ catch (err) {
28
+ exitError(formatError(err));
29
+ }
30
+ }
31
+ /**
32
+ * Show repository-level status.
33
+ */
34
+ async function showRepoStatus(repoPath) {
35
+ console.log(`Repository: ${repoPath}`);
36
+ console.log('');
37
+ // List packages
38
+ const packages = await packageList(repoPath);
39
+ console.log('Packages:');
40
+ if (packages.length === 0) {
41
+ console.log(' (none)');
42
+ }
43
+ else {
44
+ for (const pkg of packages) {
45
+ console.log(` ${pkg.name}@${pkg.version}`);
46
+ }
47
+ }
48
+ console.log('');
49
+ // List workspaces with status
50
+ const workspaces = await workspaceList(repoPath);
51
+ console.log('Workspaces:');
52
+ if (workspaces.length === 0) {
53
+ console.log(' (none)');
54
+ }
55
+ else {
56
+ for (const ws of workspaces) {
57
+ const state = await workspaceGetState(repoPath, ws);
58
+ if (state) {
59
+ console.log(` ${ws}`);
60
+ console.log(` Package: ${state.packageName}@${state.packageVersion}`);
61
+ console.log(` Deployed: ${state.deployedAt.toISOString()}`);
62
+ console.log(` Updated: ${state.rootUpdatedAt.toISOString()}`);
63
+ }
64
+ else {
65
+ console.log(` ${ws} (not deployed)`);
66
+ }
67
+ }
68
+ }
69
+ }
70
+ /**
71
+ * Show detailed workspace status.
72
+ */
73
+ async function showWorkspaceStatus(repoPath, ws) {
74
+ const status = await workspaceStatus(repoPath, ws);
75
+ console.log(`Workspace: ${status.workspace}`);
76
+ console.log('');
77
+ // Lock status
78
+ if (status.lock) {
79
+ console.log('Lock:');
80
+ console.log(` Held by PID ${status.lock.pid}`);
81
+ console.log(` Since: ${status.lock.acquiredAt}`);
82
+ if (status.lock.command) {
83
+ console.log(` Command: ${status.lock.command}`);
84
+ }
85
+ console.log('');
86
+ }
87
+ // Summary
88
+ console.log('Summary:');
89
+ console.log(` Datasets: ${status.summary.datasets.upToDate} up-to-date, ${status.summary.datasets.stale} stale, ${status.summary.datasets.unset} unset`);
90
+ // Build task summary line - only include non-zero counts
91
+ const taskParts = [];
92
+ if (status.summary.tasks.upToDate > 0)
93
+ taskParts.push(`${status.summary.tasks.upToDate} up-to-date`);
94
+ if (status.summary.tasks.ready > 0)
95
+ taskParts.push(`${status.summary.tasks.ready} ready`);
96
+ if (status.summary.tasks.waiting > 0)
97
+ taskParts.push(`${status.summary.tasks.waiting} waiting`);
98
+ if (status.summary.tasks.inProgress > 0)
99
+ taskParts.push(`${status.summary.tasks.inProgress} in-progress`);
100
+ if (status.summary.tasks.failed > 0)
101
+ taskParts.push(`${status.summary.tasks.failed} failed`);
102
+ if (status.summary.tasks.error > 0)
103
+ taskParts.push(`${status.summary.tasks.error} error`);
104
+ if (status.summary.tasks.staleRunning > 0)
105
+ taskParts.push(`${status.summary.tasks.staleRunning} stale-running`);
106
+ console.log(` Tasks: ${taskParts.join(', ') || 'none'}`);
107
+ console.log('');
108
+ // Tasks section
109
+ if (status.tasks.length > 0) {
110
+ console.log('Tasks:');
111
+ for (const task of status.tasks) {
112
+ const statusStr = formatTaskStatus(task.status);
113
+ console.log(` ${task.name}: ${statusStr}`);
114
+ if (task.dependsOn.length > 0) {
115
+ console.log(` depends on: ${task.dependsOn.join(', ')}`);
116
+ }
117
+ }
118
+ console.log('');
119
+ }
120
+ // Datasets section (only show non-up-to-date ones for brevity)
121
+ const nonUpToDate = status.datasets.filter(d => d.status.type !== 'up-to-date');
122
+ if (nonUpToDate.length > 0) {
123
+ console.log('Datasets needing attention:');
124
+ for (const dataset of nonUpToDate) {
125
+ const statusStr = dataset.status.type === 'unset' ? 'unset' : 'stale';
126
+ const producer = dataset.producedBy ? ` (from ${dataset.producedBy})` : ' (input)';
127
+ console.log(` ${dataset.path}: ${statusStr}${producer}`);
128
+ }
129
+ }
130
+ else if (status.datasets.length > 0) {
131
+ console.log('All datasets up-to-date');
132
+ }
133
+ }
134
+ /**
135
+ * Format task status for display.
136
+ */
137
+ function formatTaskStatus(status) {
138
+ switch (status.type) {
139
+ case 'up-to-date':
140
+ return status.cached ? 'up-to-date (cached)' : 'up-to-date';
141
+ case 'ready':
142
+ return 'ready to run';
143
+ case 'waiting':
144
+ return `waiting (${status.reason})`;
145
+ case 'in-progress':
146
+ return status.pid ? `in-progress (PID ${status.pid})` : 'in-progress';
147
+ case 'failed':
148
+ return `FAILED (exit code ${status.exitCode})`;
149
+ case 'error':
150
+ return `ERROR: ${status.message}`;
151
+ case 'stale-running':
152
+ return `stale-running (PID ${status.pid} no longer exists)`;
153
+ default:
154
+ return 'unknown';
155
+ }
156
+ }
157
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ export declare const workspaceCommand: {
6
+ /**
7
+ * Create an empty workspace.
8
+ */
9
+ create(repoArg: string, name: string): Promise<void>;
10
+ /**
11
+ * Deploy a package to a workspace.
12
+ */
13
+ deploy(repoArg: string, ws: string, pkgSpec: string): Promise<void>;
14
+ /**
15
+ * Export workspace as a package.
16
+ */
17
+ export(repoArg: string, ws: string, zipPath: string, options: {
18
+ name?: string;
19
+ version?: string;
20
+ }): Promise<void>;
21
+ /**
22
+ * List workspaces.
23
+ */
24
+ list(repoArg: string): Promise<void>;
25
+ /**
26
+ * Remove a workspace.
27
+ */
28
+ remove(repoArg: string, ws: string): Promise<void>;
29
+ };
30
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../src/commands/workspace.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,eAAO,MAAM,gBAAgB;IAC3B;;OAEG;oBACmB,MAAM,QAAQ,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY1D;;OAEG;oBACmB,MAAM,MAAM,MAAM,WAAW,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBzE;;OAEG;oBAEQ,MAAM,MACX,MAAM,WACD,MAAM,WACN;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3C,OAAO,CAAC,IAAI,CAAC;IAchB;;OAEG;kBACiB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB1C;;OAEG;oBACmB,MAAM,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAgBzD,CAAC"}