@elaraai/e3-cli 0.0.2-beta.9 → 1.0.1
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/LICENSE.md +4 -0
- package/README.md +169 -46
- package/dist/src/cli.js +197 -73
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/auth.d.ts +23 -0
- package/dist/src/commands/auth.d.ts.map +1 -0
- package/dist/src/commands/auth.js +200 -0
- package/dist/src/commands/auth.js.map +1 -0
- package/dist/src/commands/complete.d.ts +14 -0
- package/dist/src/commands/complete.d.ts.map +1 -0
- package/dist/src/commands/complete.js +166 -0
- package/dist/src/commands/complete.js.map +1 -0
- package/dist/src/commands/complete.spec.d.ts +6 -0
- package/dist/src/commands/complete.spec.d.ts.map +1 -0
- package/dist/src/commands/complete.spec.js +63 -0
- package/dist/src/commands/complete.spec.js.map +1 -0
- package/dist/src/commands/completion-install.d.ts +47 -0
- package/dist/src/commands/completion-install.d.ts.map +1 -0
- package/dist/src/commands/completion-install.js +141 -0
- package/dist/src/commands/completion-install.js.map +1 -0
- package/dist/src/commands/completion-install.spec.d.ts +6 -0
- package/dist/src/commands/completion-install.spec.d.ts.map +1 -0
- package/dist/src/commands/completion-install.spec.js +136 -0
- package/dist/src/commands/completion-install.spec.js.map +1 -0
- package/dist/src/commands/completion.d.ts +12 -0
- package/dist/src/commands/completion.d.ts.map +1 -0
- package/dist/src/commands/completion.js +75 -0
- package/dist/src/commands/completion.js.map +1 -0
- package/dist/src/commands/completion.spec.d.ts +6 -0
- package/dist/src/commands/completion.spec.d.ts.map +1 -0
- package/dist/src/commands/completion.spec.js +48 -0
- package/dist/src/commands/completion.spec.js.map +1 -0
- package/dist/src/commands/convert.impl.spec.d.ts +6 -0
- package/dist/src/commands/convert.impl.spec.d.ts.map +1 -0
- package/dist/src/commands/convert.impl.spec.js +245 -0
- package/dist/src/commands/convert.impl.spec.js.map +1 -0
- package/dist/src/commands/dataset-status.d.ts +9 -0
- package/dist/src/commands/dataset-status.d.ts.map +1 -0
- package/dist/src/commands/dataset-status.js +77 -0
- package/dist/src/commands/dataset-status.js.map +1 -0
- package/dist/src/commands/find.d.ts +17 -0
- package/dist/src/commands/find.d.ts.map +1 -0
- package/dist/src/commands/find.js +59 -0
- package/dist/src/commands/find.js.map +1 -0
- package/dist/src/commands/find.spec.d.ts +6 -0
- package/dist/src/commands/find.spec.d.ts.map +1 -0
- package/dist/src/commands/find.spec.js +43 -0
- package/dist/src/commands/find.spec.js.map +1 -0
- package/dist/src/commands/get.d.ts +3 -0
- package/dist/src/commands/get.d.ts.map +1 -1
- package/dist/src/commands/get.js +43 -20
- package/dist/src/commands/get.js.map +1 -1
- package/dist/src/commands/get.spec.d.ts +6 -0
- package/dist/src/commands/get.spec.d.ts.map +1 -0
- package/dist/src/commands/get.spec.js +28 -0
- package/dist/src/commands/get.spec.js.map +1 -0
- package/dist/src/commands/list.d.ts +6 -2
- package/dist/src/commands/list.d.ts.map +1 -1
- package/dist/src/commands/list.js +189 -30
- package/dist/src/commands/list.js.map +1 -1
- package/dist/src/commands/logs.d.ts.map +1 -1
- package/dist/src/commands/logs.js +96 -70
- package/dist/src/commands/logs.js.map +1 -1
- package/dist/src/commands/package.d.ts.map +1 -1
- package/dist/src/commands/package.js +78 -18
- package/dist/src/commands/package.js.map +1 -1
- package/dist/src/commands/repo.d.ts +44 -0
- package/dist/src/commands/repo.d.ts.map +1 -0
- package/dist/src/commands/repo.js +278 -0
- package/dist/src/commands/repo.js.map +1 -0
- package/dist/src/commands/run.d.ts +12 -0
- package/dist/src/commands/run.d.ts.map +1 -1
- package/dist/src/commands/run.js +21 -13
- package/dist/src/commands/run.js.map +1 -1
- package/dist/src/commands/run.spec.d.ts +6 -0
- package/dist/src/commands/run.spec.d.ts.map +1 -0
- package/dist/src/commands/run.spec.js +39 -0
- package/dist/src/commands/run.spec.js.map +1 -0
- package/dist/src/commands/set.d.ts +1 -0
- package/dist/src/commands/set.d.ts.map +1 -1
- package/dist/src/commands/set.js +33 -32
- package/dist/src/commands/set.js.map +1 -1
- package/dist/src/commands/start.d.ts.map +1 -1
- package/dist/src/commands/start.js +270 -52
- package/dist/src/commands/start.js.map +1 -1
- package/dist/src/commands/watch.d.ts +5 -2
- package/dist/src/commands/watch.d.ts.map +1 -1
- package/dist/src/commands/watch.js +32 -26
- package/dist/src/commands/watch.js.map +1 -1
- package/dist/src/commands/workspace.d.ts +12 -1
- package/dist/src/commands/workspace.d.ts.map +1 -1
- package/dist/src/commands/workspace.js +332 -38
- package/dist/src/commands/workspace.js.map +1 -1
- package/dist/src/credentials.d.ts +123 -0
- package/dist/src/credentials.d.ts.map +1 -0
- package/dist/src/credentials.js +213 -0
- package/dist/src/credentials.js.map +1 -0
- package/dist/src/format.d.ts +18 -0
- package/dist/src/format.d.ts.map +1 -0
- package/dist/src/format.js +43 -0
- package/dist/src/format.js.map +1 -0
- package/dist/src/path-resolver.d.ts +86 -0
- package/dist/src/path-resolver.d.ts.map +1 -0
- package/dist/src/path-resolver.js +241 -0
- package/dist/src/path-resolver.js.map +1 -0
- package/dist/src/path-resolver.spec.d.ts +6 -0
- package/dist/src/path-resolver.spec.d.ts.map +1 -0
- package/dist/src/path-resolver.spec.js +247 -0
- package/dist/src/path-resolver.spec.js.map +1 -0
- package/dist/src/utils.d.ts +76 -1
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +104 -1
- package/dist/src/utils.js.map +1 -1
- package/dist/src/utils.spec.d.ts +6 -0
- package/dist/src/utils.spec.d.ts.map +1 -0
- package/dist/src/utils.spec.js +199 -0
- package/dist/src/utils.spec.js.map +1 -0
- package/package.json +22 -18
- package/scripts/postinstall.cjs +26 -0
- package/dist/src/commands/gc.d.ts +0 -12
- package/dist/src/commands/gc.d.ts.map +0 -1
- package/dist/src/commands/gc.js +0 -44
- package/dist/src/commands/gc.js.map +0 -1
- package/dist/src/commands/init.d.ts +0 -9
- package/dist/src/commands/init.d.ts.map +0 -1
- package/dist/src/commands/init.js +0 -33
- package/dist/src/commands/init.js.map +0 -1
- package/dist/src/commands/status.d.ts +0 -9
- package/dist/src/commands/status.d.ts.map +0 -1
- package/dist/src/commands/status.js +0 -157
- package/dist/src/commands/status.js.map +0 -1
- package/dist/src/commands/tree.d.ts +0 -14
- package/dist/src/commands/tree.d.ts.map +0 -1
- package/dist/src/commands/tree.js +0 -77
- package/dist/src/commands/tree.js.map +0 -1
|
@@ -10,13 +10,14 @@
|
|
|
10
10
|
* e3 logs . ws.taskName # Show logs for task's latest execution
|
|
11
11
|
* e3 logs . ws.taskName --follow # Follow log output
|
|
12
12
|
*/
|
|
13
|
-
import { workspaceListTasks, workspaceGetTaskHash, executionListForTask, executionReadLog,
|
|
14
|
-
import {
|
|
13
|
+
import { workspaceListTasks, workspaceGetTaskHash, executionListForTask, executionReadLog, executionGetLatest, executionFindCurrent, isProcessAlive, LocalStorage, } from '@elaraai/e3-core';
|
|
14
|
+
import { taskList as taskListRemote, taskExecutionList as taskExecutionListRemote, taskLogs as taskLogsRemote, ApiError, } from '@elaraai/e3-api-client';
|
|
15
|
+
import { parseRepoLocation, formatError, exitError, HASH_DISPLAY_WIDTH } from '../utils.js';
|
|
15
16
|
/**
|
|
16
|
-
* Format a hash for display (abbreviated).
|
|
17
|
+
* Format a hash for display (abbreviated to `HASH_DISPLAY_WIDTH`).
|
|
17
18
|
*/
|
|
18
19
|
function abbrev(hash) {
|
|
19
|
-
return hash.slice(0,
|
|
20
|
+
return hash.slice(0, HASH_DISPLAY_WIDTH);
|
|
20
21
|
}
|
|
21
22
|
/**
|
|
22
23
|
* Parse task path: ws.taskName
|
|
@@ -34,8 +35,8 @@ function parseTaskPath(pathSpec) {
|
|
|
34
35
|
/**
|
|
35
36
|
* List tasks in a workspace with their execution status.
|
|
36
37
|
*/
|
|
37
|
-
async function listWorkspaceTasks(repoPath, ws) {
|
|
38
|
-
const tasks = await workspaceListTasks(repoPath, ws);
|
|
38
|
+
async function listWorkspaceTasks(storage, repoPath, ws) {
|
|
39
|
+
const tasks = await workspaceListTasks(storage, repoPath, ws);
|
|
39
40
|
if (tasks.length === 0) {
|
|
40
41
|
console.log(`No tasks in workspace: ${ws}`);
|
|
41
42
|
return;
|
|
@@ -43,15 +44,15 @@ async function listWorkspaceTasks(repoPath, ws) {
|
|
|
43
44
|
console.log(`Tasks in workspace: ${ws}`);
|
|
44
45
|
console.log('');
|
|
45
46
|
for (const taskName of tasks) {
|
|
46
|
-
const taskHash = await workspaceGetTaskHash(repoPath, ws, taskName);
|
|
47
|
-
const executions = await executionListForTask(repoPath, taskHash);
|
|
47
|
+
const taskHash = await workspaceGetTaskHash(storage, repoPath, ws, taskName);
|
|
48
|
+
const executions = await executionListForTask(storage, repoPath, taskHash);
|
|
48
49
|
if (executions.length === 0) {
|
|
49
50
|
console.log(` ${taskName} (no executions)`);
|
|
50
51
|
}
|
|
51
52
|
else {
|
|
52
53
|
// Get status of the most recent execution
|
|
53
54
|
const latestInHash = executions[0];
|
|
54
|
-
const status = await
|
|
55
|
+
const status = await executionGetLatest(storage, repoPath, taskHash, latestInHash);
|
|
55
56
|
let state = status?.type ?? 'unknown';
|
|
56
57
|
// Check if running process is actually alive
|
|
57
58
|
if (status?.type === 'running') {
|
|
@@ -70,41 +71,9 @@ async function listWorkspaceTasks(repoPath, ws) {
|
|
|
70
71
|
console.log(`Use "e3 logs . ${ws}.<taskName>" to view logs.`);
|
|
71
72
|
}
|
|
72
73
|
/**
|
|
73
|
-
*
|
|
74
|
-
* This matches the execution that corresponds to the current input values.
|
|
74
|
+
* Display logs and optionally follow for new output.
|
|
75
75
|
*/
|
|
76
|
-
async function
|
|
77
|
-
const taskHash = await workspaceGetTaskHash(repoPath, ws, taskName);
|
|
78
|
-
const task = await workspaceGetTask(repoPath, ws, taskName);
|
|
79
|
-
// Get the current input hashes from the workspace
|
|
80
|
-
const currentInputHashes = [];
|
|
81
|
-
for (const inputPath of task.inputs) {
|
|
82
|
-
const { refType, hash } = await workspaceGetDatasetHash(repoPath, ws, inputPath);
|
|
83
|
-
if (refType !== 'value' || hash === null) {
|
|
84
|
-
// Input not assigned - can't find matching execution
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
|
-
currentInputHashes.push(hash);
|
|
88
|
-
}
|
|
89
|
-
const inHash = inputsHash(currentInputHashes);
|
|
90
|
-
// Check if this execution exists
|
|
91
|
-
const executions = await executionListForTask(repoPath, taskHash);
|
|
92
|
-
if (executions.includes(inHash)) {
|
|
93
|
-
return { taskHash, inHash };
|
|
94
|
-
}
|
|
95
|
-
// Fall back to the most recent execution if current inputs don't match
|
|
96
|
-
if (executions.length > 0) {
|
|
97
|
-
return { taskHash, inHash: executions[0] };
|
|
98
|
-
}
|
|
99
|
-
return null;
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Show logs for a specific execution.
|
|
103
|
-
*/
|
|
104
|
-
async function showLogs(repoPath, taskHash, inHash, follow) {
|
|
105
|
-
// Read stdout and stderr
|
|
106
|
-
const stdout = await executionReadLog(repoPath, taskHash, inHash, 'stdout');
|
|
107
|
-
const stderr = await executionReadLog(repoPath, taskHash, inHash, 'stderr');
|
|
76
|
+
async function displayLogs(stdout, stderr, follow, poll) {
|
|
108
77
|
if (stdout.totalSize === 0 && stderr.totalSize === 0) {
|
|
109
78
|
console.log('No log output.');
|
|
110
79
|
return;
|
|
@@ -121,19 +90,14 @@ async function showLogs(repoPath, taskHash, inHash, follow) {
|
|
|
121
90
|
console.log(stderr.data);
|
|
122
91
|
}
|
|
123
92
|
if (follow) {
|
|
124
|
-
// Follow mode: poll for new content
|
|
125
93
|
let stdoutOffset = stdout.offset + stdout.size;
|
|
126
94
|
let stderrOffset = stderr.offset + stderr.size;
|
|
127
95
|
console.log('');
|
|
128
96
|
console.log('[Following... press Ctrl+C to stop]');
|
|
129
97
|
const pollInterval = 500; // ms
|
|
130
|
-
const
|
|
131
|
-
const newStdout = await
|
|
132
|
-
|
|
133
|
-
});
|
|
134
|
-
const newStderr = await executionReadLog(repoPath, taskHash, inHash, 'stderr', {
|
|
135
|
-
offset: stderrOffset,
|
|
136
|
-
});
|
|
98
|
+
const tick = async () => {
|
|
99
|
+
const newStdout = await poll('stdout', stdoutOffset);
|
|
100
|
+
const newStderr = await poll('stderr', stderrOffset);
|
|
137
101
|
if (newStdout.size > 0) {
|
|
138
102
|
process.stdout.write(newStdout.data);
|
|
139
103
|
stdoutOffset += newStdout.size;
|
|
@@ -143,44 +107,106 @@ async function showLogs(repoPath, taskHash, inHash, follow) {
|
|
|
143
107
|
stderrOffset += newStderr.size;
|
|
144
108
|
}
|
|
145
109
|
};
|
|
146
|
-
|
|
147
|
-
const intervalId = setInterval(() => void poll(), pollInterval);
|
|
110
|
+
const intervalId = setInterval(() => void tick(), pollInterval);
|
|
148
111
|
process.on('SIGINT', () => {
|
|
149
112
|
clearInterval(intervalId);
|
|
150
113
|
console.log('\n[Stopped]');
|
|
151
114
|
process.exit(0);
|
|
152
115
|
});
|
|
153
|
-
// Keep the process alive
|
|
154
|
-
await new Promise(() => {
|
|
155
|
-
// Never resolves - will be interrupted by Ctrl+C
|
|
156
|
-
});
|
|
116
|
+
// Keep the process alive — interrupted by Ctrl+C
|
|
117
|
+
await new Promise(() => { });
|
|
157
118
|
}
|
|
158
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* List tasks in a workspace (remote).
|
|
122
|
+
*/
|
|
123
|
+
async function listWorkspaceTasksRemote(baseUrl, repo, ws, token) {
|
|
124
|
+
const tasks = await taskListRemote(baseUrl, repo, ws, { token });
|
|
125
|
+
if (tasks.length === 0) {
|
|
126
|
+
console.log(`No tasks in workspace: ${ws}`);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
console.log(`Tasks in workspace: ${ws}`);
|
|
130
|
+
console.log('');
|
|
131
|
+
for (const task of tasks) {
|
|
132
|
+
const executions = await taskExecutionListRemote(baseUrl, repo, ws, task.name, { token });
|
|
133
|
+
if (executions.length === 0) {
|
|
134
|
+
console.log(` ${task.name} (no executions)`);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
// Get status of the most recent execution
|
|
138
|
+
const latest = executions[0];
|
|
139
|
+
const state = latest.status.type;
|
|
140
|
+
console.log(` ${task.name} [${state}] (${executions.length} execution(s))`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
console.log('');
|
|
144
|
+
console.log(`Use "e3 logs <repo> ${ws}.<taskName>" to view logs.`);
|
|
145
|
+
}
|
|
146
|
+
/** Convert a remote LogChunk (bigint fields) to LogData. */
|
|
147
|
+
function toLogData(chunk) {
|
|
148
|
+
return {
|
|
149
|
+
data: chunk.data,
|
|
150
|
+
offset: Number(chunk.offset),
|
|
151
|
+
size: Number(chunk.size),
|
|
152
|
+
totalSize: Number(chunk.totalSize),
|
|
153
|
+
complete: chunk.complete,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
159
156
|
/**
|
|
160
157
|
* View execution logs for workspace tasks.
|
|
161
158
|
*/
|
|
162
159
|
export async function logsCommand(repoArg, pathSpec, options = {}) {
|
|
163
160
|
try {
|
|
164
|
-
const
|
|
161
|
+
const location = await parseRepoLocation(repoArg);
|
|
165
162
|
if (!pathSpec) {
|
|
166
163
|
exitError('Usage: e3 logs <repo> <ws> or e3 logs <repo> <ws.taskName>');
|
|
167
164
|
}
|
|
168
165
|
// Parse the path: ws or ws.taskName
|
|
169
166
|
const { ws, taskName } = parseTaskPath(pathSpec);
|
|
170
|
-
if (
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
167
|
+
if (location.type === 'local') {
|
|
168
|
+
const storage = new LocalStorage();
|
|
169
|
+
if (!taskName) {
|
|
170
|
+
// No task specified - list tasks in workspace
|
|
171
|
+
await listWorkspaceTasks(storage, location.path, ws);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
// Find the execution for this task
|
|
175
|
+
const execution = await executionFindCurrent(storage, location.path, ws, taskName);
|
|
176
|
+
if (!execution) {
|
|
177
|
+
exitError(`No executions found for task: ${ws}.${taskName}`);
|
|
178
|
+
}
|
|
179
|
+
const { taskHash, inputsHash, executionId } = execution;
|
|
180
|
+
console.log(`Task: ${ws}.${taskName}`);
|
|
181
|
+
console.log(`Execution: ${abbrev(taskHash)}/${abbrev(inputsHash)}/${abbrev(executionId)}`);
|
|
182
|
+
console.log('');
|
|
183
|
+
const stdout = await executionReadLog(storage, location.path, taskHash, inputsHash, executionId, 'stdout');
|
|
184
|
+
const stderr = await executionReadLog(storage, location.path, taskHash, inputsHash, executionId, 'stderr');
|
|
185
|
+
await displayLogs(stdout, stderr, options.follow ?? false, (stream, offset) => executionReadLog(storage, location.path, taskHash, inputsHash, executionId, stream, { offset }));
|
|
174
186
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
187
|
+
else {
|
|
188
|
+
// Remote
|
|
189
|
+
if (!taskName) {
|
|
190
|
+
// No task specified - list tasks in workspace
|
|
191
|
+
await listWorkspaceTasksRemote(location.baseUrl, location.repo, ws, location.token);
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
console.log(`Task: ${ws}.${taskName}`);
|
|
195
|
+
console.log('');
|
|
196
|
+
const { baseUrl, repo, token } = location;
|
|
197
|
+
let stdout, stderr;
|
|
198
|
+
try {
|
|
199
|
+
stdout = toLogData(await taskLogsRemote(baseUrl, repo, ws, taskName, { stream: 'stdout' }, { token }));
|
|
200
|
+
stderr = toLogData(await taskLogsRemote(baseUrl, repo, ws, taskName, { stream: 'stderr' }, { token }));
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
if (err instanceof ApiError && err.code === 'execution_not_found') {
|
|
204
|
+
exitError(`No executions found for task: ${ws}.${taskName}`);
|
|
205
|
+
}
|
|
206
|
+
throw err;
|
|
207
|
+
}
|
|
208
|
+
await displayLogs(stdout, stderr, options.follow ?? false, async (stream, offset) => toLogData(await taskLogsRemote(baseUrl, repo, ws, taskName, { stream, offset }, { token })));
|
|
179
209
|
}
|
|
180
|
-
console.log(`Task: ${ws}.${taskName}`);
|
|
181
|
-
console.log(`Execution: ${abbrev(execution.taskHash)}/${abbrev(execution.inHash)}`);
|
|
182
|
-
console.log('');
|
|
183
|
-
await showLogs(repoPath, execution.taskHash, execution.inHash, options.follow ?? false);
|
|
184
210
|
}
|
|
185
211
|
catch (err) {
|
|
186
212
|
exitError(formatError(err));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/commands/logs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AAEH,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,EAChB,YAAY,
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/commands/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../../../src/commands/package.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../../../src/commands/package.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuBH,eAAO,MAAM,cAAc;IACzB;;OAEG;oBACmB,MAAM,WAAW,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA8C7D;;OAEG;oBACmB,MAAM,WAAW,MAAM,WAAW,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC9E;;OAEG;kBACiB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B1C;;OAEG;oBACmB,MAAM,WAAW,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAkB9D,CAAC"}
|
|
@@ -5,19 +5,52 @@
|
|
|
5
5
|
/**
|
|
6
6
|
* e3 package commands - Package management
|
|
7
7
|
*/
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { readFileSync, writeFileSync } from 'node:fs';
|
|
9
|
+
import { packageImport, packageExport, packageList, packageRemove, LocalStorage, } from '@elaraai/e3-core';
|
|
10
|
+
import { packageImport as packageImportRemote, packageExport as packageExportRemote, packageList as packageListRemote, packageRemove as packageRemoveRemote, } from '@elaraai/e3-api-client';
|
|
11
|
+
import { parseRepoLocation, parsePackageSpec, formatError, exitError } from '../utils.js';
|
|
12
|
+
import { writeExportProgress, clearProgress } from '../format.js';
|
|
10
13
|
export const packageCommand = {
|
|
11
14
|
/**
|
|
12
15
|
* Import a package from a .zip file.
|
|
13
16
|
*/
|
|
14
17
|
async import(repoArg, zipPath) {
|
|
15
18
|
try {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
const location = await parseRepoLocation(repoArg);
|
|
20
|
+
if (location.type === 'local') {
|
|
21
|
+
const storage = new LocalStorage();
|
|
22
|
+
const result = await packageImport(storage, location.path, zipPath);
|
|
23
|
+
console.log(`Imported ${result.name}@${result.version}`);
|
|
24
|
+
console.log(` Package hash: ${result.packageHash.slice(0, 12)}...`);
|
|
25
|
+
console.log(` Objects: ${result.objectCount}`);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// Remote import - read local zip and send to server
|
|
29
|
+
const zipBytes = readFileSync(zipPath);
|
|
30
|
+
const result = await packageImportRemote(location.baseUrl, location.repo, new Uint8Array(zipBytes), { token: location.token }, {
|
|
31
|
+
onUploadProgress: (uploaded, total) => {
|
|
32
|
+
const pct = Math.round((uploaded / total) * 100);
|
|
33
|
+
const mb = (uploaded / 1024 / 1024).toFixed(1);
|
|
34
|
+
const totalMb = (total / 1024 / 1024).toFixed(1);
|
|
35
|
+
process.stdout.write(`\rUploading... ${mb}/${totalMb} MB (${pct}%)`);
|
|
36
|
+
},
|
|
37
|
+
onProgress: (progress) => {
|
|
38
|
+
if (progress.type === 'pending') {
|
|
39
|
+
process.stdout.write(`\rPending...\x1b[K`);
|
|
40
|
+
}
|
|
41
|
+
else if (progress.type === 'downloading') {
|
|
42
|
+
process.stdout.write(`\rPreparing...\x1b[K`);
|
|
43
|
+
}
|
|
44
|
+
else if (progress.type === 'importing') {
|
|
45
|
+
process.stdout.write(`\rImporting... ${progress.value.objectsProcessed} objects processed\x1b[K`);
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
clearProgress();
|
|
50
|
+
console.log(`Imported ${result.name}@${result.version}`);
|
|
51
|
+
console.log(` Package hash: ${result.packageHash.slice(0, 12)}...`);
|
|
52
|
+
console.log(` Objects: ${result.objectCount}`);
|
|
53
|
+
}
|
|
21
54
|
}
|
|
22
55
|
catch (err) {
|
|
23
56
|
exitError(formatError(err));
|
|
@@ -28,12 +61,25 @@ export const packageCommand = {
|
|
|
28
61
|
*/
|
|
29
62
|
async export(repoArg, pkgSpec, zipPath) {
|
|
30
63
|
try {
|
|
31
|
-
const
|
|
64
|
+
const location = await parseRepoLocation(repoArg);
|
|
32
65
|
const { name, version } = parsePackageSpec(pkgSpec);
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
66
|
+
if (location.type === 'local') {
|
|
67
|
+
const storage = new LocalStorage();
|
|
68
|
+
const result = await packageExport(storage, location.path, name, version, zipPath);
|
|
69
|
+
console.log(`Exported ${name}@${version} to ${zipPath}`);
|
|
70
|
+
console.log(` Package hash: ${result.packageHash.slice(0, 12)}...`);
|
|
71
|
+
console.log(` Objects: ${result.objectCount}`);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// Remote export - fetch zip bytes and write locally
|
|
75
|
+
const zipBytes = await packageExportRemote(location.baseUrl, location.repo, name, version, { token: location.token }, {
|
|
76
|
+
onProgress: writeExportProgress,
|
|
77
|
+
});
|
|
78
|
+
clearProgress();
|
|
79
|
+
writeFileSync(zipPath, zipBytes);
|
|
80
|
+
console.log(`Exported ${name}@${version} to ${zipPath}`);
|
|
81
|
+
console.log(` Size: ${zipBytes.length} bytes`);
|
|
82
|
+
}
|
|
37
83
|
}
|
|
38
84
|
catch (err) {
|
|
39
85
|
exitError(formatError(err));
|
|
@@ -44,8 +90,15 @@ export const packageCommand = {
|
|
|
44
90
|
*/
|
|
45
91
|
async list(repoArg) {
|
|
46
92
|
try {
|
|
47
|
-
const
|
|
48
|
-
|
|
93
|
+
const location = await parseRepoLocation(repoArg);
|
|
94
|
+
let packages;
|
|
95
|
+
if (location.type === 'local') {
|
|
96
|
+
const storage = new LocalStorage();
|
|
97
|
+
packages = await packageList(storage, location.path);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
packages = await packageListRemote(location.baseUrl, location.repo, { token: location.token });
|
|
101
|
+
}
|
|
49
102
|
if (packages.length === 0) {
|
|
50
103
|
console.log('No packages installed');
|
|
51
104
|
return;
|
|
@@ -64,11 +117,18 @@ export const packageCommand = {
|
|
|
64
117
|
*/
|
|
65
118
|
async remove(repoArg, pkgSpec) {
|
|
66
119
|
try {
|
|
67
|
-
const
|
|
120
|
+
const location = await parseRepoLocation(repoArg);
|
|
68
121
|
const { name, version } = parsePackageSpec(pkgSpec);
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
122
|
+
if (location.type === 'local') {
|
|
123
|
+
const storage = new LocalStorage();
|
|
124
|
+
await packageRemove(storage, location.path, name, version);
|
|
125
|
+
console.log(`Removed ${name}@${version}`);
|
|
126
|
+
console.log('Run `e3 gc` to reclaim disk space');
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
await packageRemoveRemote(location.baseUrl, location.repo, name, version, { token: location.token });
|
|
130
|
+
console.log(`Removed ${name}@${version}`);
|
|
131
|
+
}
|
|
72
132
|
}
|
|
73
133
|
catch (err) {
|
|
74
134
|
exitError(formatError(err));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.js","sourceRoot":"","sources":["../../../src/commands/package.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AAEH,OAAO,EACL,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,
|
|
1
|
+
{"version":3,"file":"package.js","sourceRoot":"","sources":["../../../src/commands/package.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
export declare const repoCommand: {
|
|
6
|
+
/**
|
|
7
|
+
* Create a new repository.
|
|
8
|
+
*
|
|
9
|
+
* Local: e3 repo create <path>
|
|
10
|
+
* Remote: e3 repo create <url> (e.g., http://server/repos/name)
|
|
11
|
+
*/
|
|
12
|
+
create(repoArg: string): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Remove a repository.
|
|
15
|
+
*
|
|
16
|
+
* With `--recursive`, lists and removes all workspaces before removing the repository.
|
|
17
|
+
* Without `--recursive`, fails if the repository contains workspaces.
|
|
18
|
+
*
|
|
19
|
+
* @param locationArg - Repository path or URL
|
|
20
|
+
* @param options - Command options
|
|
21
|
+
* @param options.recursive - Remove all workspaces first
|
|
22
|
+
*/
|
|
23
|
+
remove(locationArg: string, options: {
|
|
24
|
+
recursive?: boolean;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Show repository status.
|
|
28
|
+
*/
|
|
29
|
+
status(locationArg: string): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Run garbage collection.
|
|
32
|
+
*/
|
|
33
|
+
gc(locationArg: string, options: {
|
|
34
|
+
dryRun?: boolean;
|
|
35
|
+
minAge?: string;
|
|
36
|
+
}): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* List repositories on a server.
|
|
39
|
+
*
|
|
40
|
+
* Remote only: e3 repo list <server-url>
|
|
41
|
+
*/
|
|
42
|
+
list(serverUrl: string): Promise<void>;
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../../src/commands/repo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA+CH,eAAO,MAAM,WAAW;IACtB;;;;;OAKG;oBACmB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC5C;;;;;;;;;OASG;wBACuB,MAAM,WAAW;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAsDlF;;OAEG;wBACuB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmDhD;;OAEG;oBACmB,MAAM,WAAW;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiF5F;;;;OAIG;oBACmB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAyB7C,CAAC"}
|