@elaraai/e3-cli 0.0.2-beta.8 → 1.0.0
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
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* e3 repo commands - Repository management
|
|
7
|
+
*/
|
|
8
|
+
import { resolve } from 'path';
|
|
9
|
+
import { rmSync } from 'fs';
|
|
10
|
+
import { repoInit, repoGc, packageList, workspaceList, workspaceRemove, workspaceGetState, LocalStorage, } from '@elaraai/e3-core';
|
|
11
|
+
import { repoStatus as repoStatusRemote, repoGcStart as repoGcStartRemote, repoGcStatus as repoGcStatusRemote, repoCreate as repoCreateRemote, repoRemove as repoRemoveRemote, repoList as repoListRemote, workspaceList as workspaceListRemote, workspaceRemove as workspaceRemoveRemote, } from '@elaraai/e3-api-client';
|
|
12
|
+
import { some, none } from '@elaraai/east';
|
|
13
|
+
import { parseRepoLocation, formatError, exitError } from '../utils.js';
|
|
14
|
+
import { getValidToken } from '../credentials.js';
|
|
15
|
+
/**
|
|
16
|
+
* Parse repo URL for create command (doesn't validate existence).
|
|
17
|
+
* Returns { type: 'remote', baseUrl, repo } for URLs, or { type: 'local', path } for paths.
|
|
18
|
+
*/
|
|
19
|
+
function parseRepoForCreate(arg) {
|
|
20
|
+
if (arg.startsWith('https://') || arg.startsWith('http://')) {
|
|
21
|
+
const url = new URL(arg);
|
|
22
|
+
const match = url.pathname.match(/^\/repos\/([^/]+)/);
|
|
23
|
+
if (!match) {
|
|
24
|
+
throw new Error(`Invalid remote URL: expected /repos/{repo} in path, got ${url.pathname}`);
|
|
25
|
+
}
|
|
26
|
+
return { type: 'remote', baseUrl: url.origin, repo: match[1] };
|
|
27
|
+
}
|
|
28
|
+
return { type: 'local', path: resolve(arg) };
|
|
29
|
+
}
|
|
30
|
+
export const repoCommand = {
|
|
31
|
+
/**
|
|
32
|
+
* Create a new repository.
|
|
33
|
+
*
|
|
34
|
+
* Local: e3 repo create <path>
|
|
35
|
+
* Remote: e3 repo create <url> (e.g., http://server/repos/name)
|
|
36
|
+
*/
|
|
37
|
+
async create(repoArg) {
|
|
38
|
+
try {
|
|
39
|
+
const location = parseRepoForCreate(repoArg);
|
|
40
|
+
if (location.type === 'remote') {
|
|
41
|
+
const token = await getValidToken(location.baseUrl);
|
|
42
|
+
await repoCreateRemote(location.baseUrl, location.repo, { token });
|
|
43
|
+
console.log(`Created repository: ${location.repo}`);
|
|
44
|
+
console.log(` URL: ${location.baseUrl}/repos/${location.repo}`);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
const result = repoInit(location.path);
|
|
48
|
+
if (!result.success) {
|
|
49
|
+
if (result.alreadyExists) {
|
|
50
|
+
exitError(`e3 repository already exists at ${result.repoPath}`);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
exitError(`Failed to create repository: ${formatError(result.error)}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
console.log(`Initialized e3 repository at ${result.repoPath}`);
|
|
57
|
+
console.log('');
|
|
58
|
+
console.log('Created:');
|
|
59
|
+
console.log(' objects/ Content-addressable storage');
|
|
60
|
+
console.log(' packages/ Package references');
|
|
61
|
+
console.log(' workspaces/ Workspace state');
|
|
62
|
+
console.log(' executions/ Task execution cache');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
exitError(formatError(err));
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
/**
|
|
70
|
+
* Remove a repository.
|
|
71
|
+
*
|
|
72
|
+
* With `--recursive`, lists and removes all workspaces before removing the repository.
|
|
73
|
+
* Without `--recursive`, fails if the repository contains workspaces.
|
|
74
|
+
*
|
|
75
|
+
* @param locationArg - Repository path or URL
|
|
76
|
+
* @param options - Command options
|
|
77
|
+
* @param options.recursive - Remove all workspaces first
|
|
78
|
+
*/
|
|
79
|
+
async remove(locationArg, options) {
|
|
80
|
+
try {
|
|
81
|
+
const location = await parseRepoLocation(locationArg);
|
|
82
|
+
if (location.type === 'local') {
|
|
83
|
+
const storage = new LocalStorage();
|
|
84
|
+
// Check for workspaces
|
|
85
|
+
const workspaces = await workspaceList(storage, location.path);
|
|
86
|
+
if (workspaces.length > 0 && !options.recursive) {
|
|
87
|
+
console.log('Repository contains workspaces:');
|
|
88
|
+
for (const ws of workspaces) {
|
|
89
|
+
console.log(` ${ws}`);
|
|
90
|
+
}
|
|
91
|
+
exitError('Use --recursive (-r) to remove all workspaces and the repository');
|
|
92
|
+
}
|
|
93
|
+
// Remove workspaces first
|
|
94
|
+
for (const ws of workspaces) {
|
|
95
|
+
await workspaceRemove(storage, location.path, ws);
|
|
96
|
+
console.log(`Removed workspace: ${ws}`);
|
|
97
|
+
}
|
|
98
|
+
// Remove the repository directory
|
|
99
|
+
rmSync(location.path, { recursive: true, force: true });
|
|
100
|
+
console.log(`Removed repository at ${location.path}`);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
// Check for workspaces
|
|
104
|
+
const workspaces = await workspaceListRemote(location.baseUrl, location.repo, { token: location.token });
|
|
105
|
+
if (workspaces.length > 0 && !options.recursive) {
|
|
106
|
+
console.log('Repository contains workspaces:');
|
|
107
|
+
for (const info of workspaces) {
|
|
108
|
+
console.log(` ${info.name}`);
|
|
109
|
+
}
|
|
110
|
+
exitError('Use --recursive (-r) to remove all workspaces and the repository');
|
|
111
|
+
}
|
|
112
|
+
// Remove workspaces first
|
|
113
|
+
for (const info of workspaces) {
|
|
114
|
+
await workspaceRemoveRemote(location.baseUrl, location.repo, info.name, { token: location.token });
|
|
115
|
+
console.log(`Removed workspace: ${info.name}`);
|
|
116
|
+
}
|
|
117
|
+
// Remove repository via API
|
|
118
|
+
await repoRemoveRemote(location.baseUrl, location.repo, { token: location.token });
|
|
119
|
+
console.log(`Removed repository: ${location.repo}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
exitError(formatError(err));
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
/**
|
|
127
|
+
* Show repository status.
|
|
128
|
+
*/
|
|
129
|
+
async status(locationArg) {
|
|
130
|
+
try {
|
|
131
|
+
const location = await parseRepoLocation(locationArg);
|
|
132
|
+
if (location.type === 'local') {
|
|
133
|
+
const storage = new LocalStorage();
|
|
134
|
+
console.log(`Repository: ${location.path}`);
|
|
135
|
+
console.log('');
|
|
136
|
+
// List packages
|
|
137
|
+
const packages = await packageList(storage, location.path);
|
|
138
|
+
console.log('Packages:');
|
|
139
|
+
if (packages.length === 0) {
|
|
140
|
+
console.log(' (none)');
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
for (const pkg of packages) {
|
|
144
|
+
console.log(` ${pkg.name}@${pkg.version}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
console.log('');
|
|
148
|
+
// List workspaces
|
|
149
|
+
const workspaces = await workspaceList(storage, location.path);
|
|
150
|
+
console.log('Workspaces:');
|
|
151
|
+
if (workspaces.length === 0) {
|
|
152
|
+
console.log(' (none)');
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
for (const ws of workspaces) {
|
|
156
|
+
const state = await workspaceGetState(storage, location.path, ws);
|
|
157
|
+
if (state) {
|
|
158
|
+
console.log(` ${ws}`);
|
|
159
|
+
console.log(` Package: ${state.packageName}@${state.packageVersion}`);
|
|
160
|
+
console.log(` Deployed: ${state.deployedAt.toISOString()}`);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
console.log(` ${ws} (not deployed)`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
const status = await repoStatusRemote(location.baseUrl, location.repo, { token: location.token });
|
|
170
|
+
console.log(`Repository: ${location.repo}`);
|
|
171
|
+
console.log('');
|
|
172
|
+
console.log(` Objects: ${status.objectCount}`);
|
|
173
|
+
console.log(` Packages: ${status.packageCount}`);
|
|
174
|
+
console.log(` Workspaces: ${status.workspaceCount}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
exitError(formatError(err));
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
/**
|
|
182
|
+
* Run garbage collection.
|
|
183
|
+
*/
|
|
184
|
+
async gc(locationArg, options) {
|
|
185
|
+
try {
|
|
186
|
+
const location = await parseRepoLocation(locationArg);
|
|
187
|
+
const minAge = options.minAge ? parseInt(options.minAge, 10) : 60000;
|
|
188
|
+
if (options.dryRun) {
|
|
189
|
+
console.log('Dry run - no files will be deleted');
|
|
190
|
+
}
|
|
191
|
+
console.log(`Minimum age: ${minAge}ms`);
|
|
192
|
+
console.log('');
|
|
193
|
+
if (location.type === 'local') {
|
|
194
|
+
const storage = new LocalStorage();
|
|
195
|
+
const result = await repoGc(storage, location.path, {
|
|
196
|
+
dryRun: options.dryRun,
|
|
197
|
+
minAge,
|
|
198
|
+
});
|
|
199
|
+
console.log('Garbage collection complete:');
|
|
200
|
+
console.log(` Objects retained: ${result.retainedObjects}`);
|
|
201
|
+
console.log(` Objects deleted: ${result.deletedObjects}`);
|
|
202
|
+
console.log(` Partials deleted: ${result.deletedPartials}`);
|
|
203
|
+
console.log(` Skipped (young): ${result.skippedYoung}`);
|
|
204
|
+
if (result.bytesFreed > 0) {
|
|
205
|
+
const mb = (result.bytesFreed / 1024 / 1024).toFixed(2);
|
|
206
|
+
console.log(` Space reclaimed: ${mb} MB`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
// Start async GC
|
|
211
|
+
const { executionId } = await repoGcStartRemote(location.baseUrl, location.repo, {
|
|
212
|
+
dryRun: options.dryRun ?? false,
|
|
213
|
+
minAge: minAge ? some(BigInt(minAge)) : none,
|
|
214
|
+
}, { token: location.token });
|
|
215
|
+
console.log('Running garbage collection...');
|
|
216
|
+
// Poll for completion
|
|
217
|
+
const pollInterval = 500;
|
|
218
|
+
while (true) {
|
|
219
|
+
const status = await repoGcStatusRemote(location.baseUrl, location.repo, executionId, { token: location.token });
|
|
220
|
+
if (status.status.type === 'succeeded') {
|
|
221
|
+
if (status.stats.type !== 'some') {
|
|
222
|
+
exitError('GC succeeded but no stats returned');
|
|
223
|
+
}
|
|
224
|
+
const result = status.stats.value;
|
|
225
|
+
console.log('');
|
|
226
|
+
console.log('Garbage collection complete:');
|
|
227
|
+
console.log(` Objects retained: ${result.retainedObjects}`);
|
|
228
|
+
console.log(` Objects deleted: ${result.deletedObjects}`);
|
|
229
|
+
console.log(` Partials deleted: ${result.deletedPartials}`);
|
|
230
|
+
console.log(` Skipped (young): ${result.skippedYoung}`);
|
|
231
|
+
if (result.bytesFreed > 0n) {
|
|
232
|
+
const mb = (Number(result.bytesFreed) / 1024 / 1024).toFixed(2);
|
|
233
|
+
console.log(` Space reclaimed: ${mb} MB`);
|
|
234
|
+
}
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
if (status.status.type === 'failed') {
|
|
238
|
+
const errorMsg = status.error.type === 'some' ? status.error.value : 'Unknown error';
|
|
239
|
+
exitError(`GC failed: ${errorMsg}`);
|
|
240
|
+
}
|
|
241
|
+
// Still running, wait and poll again
|
|
242
|
+
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
exitError(formatError(err));
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
/**
|
|
251
|
+
* List repositories on a server.
|
|
252
|
+
*
|
|
253
|
+
* Remote only: e3 repo list <server-url>
|
|
254
|
+
*/
|
|
255
|
+
async list(serverUrl) {
|
|
256
|
+
try {
|
|
257
|
+
if (!serverUrl.startsWith('http://') && !serverUrl.startsWith('https://')) {
|
|
258
|
+
exitError('Server URL must start with http:// or https://');
|
|
259
|
+
}
|
|
260
|
+
const url = new URL(serverUrl);
|
|
261
|
+
const baseUrl = url.origin;
|
|
262
|
+
const token = await getValidToken(baseUrl);
|
|
263
|
+
const repos = await repoListRemote(baseUrl, { token });
|
|
264
|
+
if (repos.length === 0) {
|
|
265
|
+
console.log('No repositories');
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
console.log('Repositories:');
|
|
269
|
+
for (const repo of repos) {
|
|
270
|
+
console.log(` ${repo}`);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
catch (err) {
|
|
274
|
+
exitError(formatError(err));
|
|
275
|
+
}
|
|
276
|
+
},
|
|
277
|
+
};
|
|
278
|
+
//# sourceMappingURL=repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.js","sourceRoot":"","sources":["../../../src/commands/repo.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
3
|
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* Parse task specifier: `pkg.task` or `pkg@version.task`.
|
|
7
|
+
*
|
|
8
|
+
* The task name is the segment after the last `.`. Everything before is the
|
|
9
|
+
* package ref (with optional `@version`). Scoped names containing a `.` in
|
|
10
|
+
* the package or task portion are not supported.
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseTaskSpec(spec: string): {
|
|
13
|
+
name: string;
|
|
14
|
+
version: string;
|
|
15
|
+
task: string;
|
|
16
|
+
};
|
|
5
17
|
/**
|
|
6
18
|
* Run a task ad-hoc with file inputs and output.
|
|
7
19
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/run.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/run.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAsBH;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAoB3F;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5C,OAAO,CAAC,IAAI,CAAC,CAwEf"}
|
package/dist/src/commands/run.js
CHANGED
|
@@ -11,21 +11,28 @@
|
|
|
11
11
|
* e3 run . my-pkg/task ./data.beast2 -o ./out.beast2 --force
|
|
12
12
|
*/
|
|
13
13
|
import { readFile, writeFile } from 'fs/promises';
|
|
14
|
-
import { packageRead, objectWrite, objectRead, taskExecute, } from '@elaraai/e3-core';
|
|
14
|
+
import { packageRead, objectWrite, objectRead, taskExecute, LocalStorage, } from '@elaraai/e3-core';
|
|
15
15
|
import { decodeBeast2 } from '@elaraai/east';
|
|
16
|
-
import { resolveRepo, parsePackageSpec, formatError, exitError } from '../utils.js';
|
|
16
|
+
import { resolveRepo, parsePackageSpec, formatError, exitError, shortHash } from '../utils.js';
|
|
17
17
|
/**
|
|
18
|
-
* Parse task specifier: pkg
|
|
18
|
+
* Parse task specifier: `pkg.task` or `pkg@version.task`.
|
|
19
|
+
*
|
|
20
|
+
* The task name is the segment after the last `.`. Everything before is the
|
|
21
|
+
* package ref (with optional `@version`). Scoped names containing a `.` in
|
|
22
|
+
* the package or task portion are not supported.
|
|
19
23
|
*/
|
|
20
|
-
function parseTaskSpec(spec) {
|
|
21
|
-
const
|
|
22
|
-
if (
|
|
23
|
-
throw new Error(`Invalid task specifier: ${spec}. Expected format: pkg
|
|
24
|
+
export function parseTaskSpec(spec) {
|
|
25
|
+
const dotIndex = spec.lastIndexOf('.');
|
|
26
|
+
if (dotIndex === -1) {
|
|
27
|
+
throw new Error(`Invalid task specifier: '${spec}'. Expected format: pkg.task or pkg@version.task`);
|
|
28
|
+
}
|
|
29
|
+
const pkgPart = spec.slice(0, dotIndex);
|
|
30
|
+
const task = spec.slice(dotIndex + 1);
|
|
31
|
+
if (!pkgPart) {
|
|
32
|
+
throw new Error(`Invalid task specifier: '${spec}'. Package name cannot be empty.`);
|
|
24
33
|
}
|
|
25
|
-
const pkgPart = spec.slice(0, slashIndex);
|
|
26
|
-
const task = spec.slice(slashIndex + 1);
|
|
27
34
|
if (!task) {
|
|
28
|
-
throw new Error(`Invalid task specifier: ${spec}. Task name cannot be empty.`);
|
|
35
|
+
throw new Error(`Invalid task specifier: '${spec}'. Task name cannot be empty.`);
|
|
29
36
|
}
|
|
30
37
|
const { name, version } = parsePackageSpec(pkgPart);
|
|
31
38
|
return { name, version, task };
|
|
@@ -36,6 +43,7 @@ function parseTaskSpec(spec) {
|
|
|
36
43
|
export async function runCommand(repoArg, taskSpec, inputs, options) {
|
|
37
44
|
try {
|
|
38
45
|
const repoPath = resolveRepo(repoArg);
|
|
46
|
+
const storage = new LocalStorage();
|
|
39
47
|
// Parse task specifier
|
|
40
48
|
const { name, version, task } = parseTaskSpec(taskSpec);
|
|
41
49
|
// Validate output is provided
|
|
@@ -43,7 +51,7 @@ export async function runCommand(repoArg, taskSpec, inputs, options) {
|
|
|
43
51
|
exitError('Output file is required. Use -o <path> to specify output.');
|
|
44
52
|
}
|
|
45
53
|
// Get package and find task hash
|
|
46
|
-
const pkg = await packageRead(repoPath, name, version);
|
|
54
|
+
const pkg = await packageRead(storage, repoPath, name, version);
|
|
47
55
|
const taskHash = pkg.tasks.get(task);
|
|
48
56
|
if (!taskHash) {
|
|
49
57
|
const available = Array.from(pkg.tasks.keys()).join(', ');
|
|
@@ -63,11 +71,11 @@ export async function runCommand(repoArg, taskSpec, inputs, options) {
|
|
|
63
71
|
}
|
|
64
72
|
const hash = await objectWrite(repoPath, data);
|
|
65
73
|
inputHashes.push(hash);
|
|
66
|
-
console.log(` Input: ${inputPath} -> ${hash
|
|
74
|
+
console.log(` Input: ${inputPath} -> ${shortHash(hash)}`);
|
|
67
75
|
}
|
|
68
76
|
// Execute the task
|
|
69
77
|
const startTime = Date.now();
|
|
70
|
-
const result = await taskExecute(repoPath, taskHash, inputHashes, {
|
|
78
|
+
const result = await taskExecute(storage, repoPath, taskHash, inputHashes, {
|
|
71
79
|
force: options.force,
|
|
72
80
|
});
|
|
73
81
|
const elapsed = Date.now() - startTime;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/run.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EACL,WAAW,EACX,WAAW,EACX,UAAU,EACV,WAAW,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.spec.d.ts","sourceRoot":"","sources":["../../../src/commands/run.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it } from 'node:test';
|
|
6
|
+
import assert from 'node:assert/strict';
|
|
7
|
+
import { parseTaskSpec } from './run.js';
|
|
8
|
+
describe('parseTaskSpec', () => {
|
|
9
|
+
it('parses pkg.task with default version', () => {
|
|
10
|
+
assert.deepStrictEqual(parseTaskSpec('hello.greet'), {
|
|
11
|
+
name: 'hello',
|
|
12
|
+
version: 'latest',
|
|
13
|
+
task: 'greet',
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
it('parses pkg@version.task with explicit version', () => {
|
|
17
|
+
assert.deepStrictEqual(parseTaskSpec('hello@1.2.3.greet'), {
|
|
18
|
+
name: 'hello',
|
|
19
|
+
version: '1.2.3',
|
|
20
|
+
task: 'greet',
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
it('uses the last dot as the task separator (versions contain dots)', () => {
|
|
24
|
+
// pkg = 'hello@1.0.0', task = 'greet'
|
|
25
|
+
const result = parseTaskSpec('hello@1.0.0.greet');
|
|
26
|
+
assert.strictEqual(result.task, 'greet');
|
|
27
|
+
assert.strictEqual(result.version, '1.0.0');
|
|
28
|
+
});
|
|
29
|
+
it('throws when no dot is present', () => {
|
|
30
|
+
assert.throws(() => parseTaskSpec('helloPkg'), /Expected format: pkg.task/);
|
|
31
|
+
});
|
|
32
|
+
it('throws when package portion is empty', () => {
|
|
33
|
+
assert.throws(() => parseTaskSpec('.greet'), /Package name cannot be empty/);
|
|
34
|
+
});
|
|
35
|
+
it('throws when task portion is empty', () => {
|
|
36
|
+
assert.throws(() => parseTaskSpec('hello.'), /Task name cannot be empty/);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=run.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.spec.js","sourceRoot":"","sources":["../../../src/commands/run.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,eAAe,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE;YACnD,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,QAAQ;YACjB,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,eAAe,CAAC,aAAa,CAAC,mBAAmB,CAAC,EAAE;YACzD,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,sCAAsC;QACtC,MAAM,MAAM,GAAG,aAAa,CAAC,mBAAmB,CAAC,CAAC;QAClD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,2BAA2B,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,8BAA8B,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,2BAA2B,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../../src/commands/set.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../../src/commands/set.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA+CH;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GACjD,OAAO,CAAC,IAAI,CAAC,CAoGf"}
|
package/dist/src/commands/set.js
CHANGED
|
@@ -6,24 +6,24 @@
|
|
|
6
6
|
* e3 set command - Set dataset value from file
|
|
7
7
|
*
|
|
8
8
|
* Usage:
|
|
9
|
-
* e3 set . ws.
|
|
10
|
-
* e3 set . ws.
|
|
11
|
-
* e3 set . ws.
|
|
12
|
-
* e3 set . ws.
|
|
9
|
+
* e3 dataset set . ws.name ./data.beast2
|
|
10
|
+
* e3 dataset set . ws.name ./data.east
|
|
11
|
+
* e3 dataset set . ws.name ./data.json --type ".Integer"
|
|
12
|
+
* e3 dataset set . ws.name ./data.csv --type-file schema.east
|
|
13
|
+
* e3 dataset set https://server/repos/myrepo ws.name ./data.east
|
|
14
|
+
*
|
|
15
|
+
* Paths use the flat form `<ws>.<name>`. The resolver maps `<name>` to
|
|
16
|
+
* its storage location automatically.
|
|
13
17
|
*/
|
|
14
18
|
import { readFile } from 'fs/promises';
|
|
15
19
|
import { extname } from 'path';
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
20
|
+
import { workspaceSetDataset, LocalStorage } from '@elaraai/e3-core';
|
|
21
|
+
import { datasetSet as datasetSetRemote } from '@elaraai/e3-api-client';
|
|
22
|
+
import { decodeBeast2, parseFor, fromJSONFor, decodeCsvFor, encodeBeast2For, EastTypeType, parseInferred, toEastTypeValue, } from '@elaraai/east';
|
|
23
|
+
import { parseRepoLocation, formatError, exitError } from '../utils.js';
|
|
24
|
+
import { resolveDatasetPath } from '../path-resolver.js';
|
|
19
25
|
/**
|
|
20
26
|
* 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
27
|
*/
|
|
28
28
|
function parseTypeSpec(typeSpec) {
|
|
29
29
|
const parser = parseFor(EastTypeType);
|
|
@@ -38,16 +38,20 @@ function parseTypeSpec(typeSpec) {
|
|
|
38
38
|
*/
|
|
39
39
|
export async function setCommand(repoArg, pathSpec, filePath, options = {}) {
|
|
40
40
|
try {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
if (path.length === 0) {
|
|
44
|
-
exitError('Path must include at least one field (e.g., ws.field)');
|
|
41
|
+
if (options.type && options.typeFile) {
|
|
42
|
+
exitError('Specify either --type or --type-file, not both');
|
|
45
43
|
}
|
|
46
|
-
|
|
44
|
+
const location = await parseRepoLocation(repoArg);
|
|
45
|
+
const { ws, path } = await resolveDatasetPath(location, pathSpec);
|
|
46
|
+
// Parse type specification if provided (inline or from file)
|
|
47
47
|
let providedType;
|
|
48
48
|
if (options.type) {
|
|
49
49
|
providedType = parseTypeSpec(options.type);
|
|
50
50
|
}
|
|
51
|
+
else if (options.typeFile) {
|
|
52
|
+
const typeContent = (await readFile(options.typeFile)).toString('utf-8');
|
|
53
|
+
providedType = parseTypeSpec(typeContent);
|
|
54
|
+
}
|
|
51
55
|
// Read and decode the file based on extension
|
|
52
56
|
const fileContent = await readFile(filePath);
|
|
53
57
|
const ext = extname(filePath).toLowerCase();
|
|
@@ -55,7 +59,6 @@ export async function setCommand(repoArg, pathSpec, filePath, options = {}) {
|
|
|
55
59
|
let type;
|
|
56
60
|
switch (ext) {
|
|
57
61
|
case '.beast2': {
|
|
58
|
-
// Beast2 is self-describing, type spec is optional (for override)
|
|
59
62
|
const decoded = decodeBeast2(fileContent);
|
|
60
63
|
value = decoded.value;
|
|
61
64
|
type = providedType ?? decoded.type;
|
|
@@ -64,7 +67,6 @@ export async function setCommand(repoArg, pathSpec, filePath, options = {}) {
|
|
|
64
67
|
case '.east': {
|
|
65
68
|
const content = fileContent.toString('utf-8');
|
|
66
69
|
if (providedType) {
|
|
67
|
-
// Parse with provided type for stricter validation
|
|
68
70
|
const parser = parseFor(providedType);
|
|
69
71
|
const result = parser(content);
|
|
70
72
|
if (!result.success) {
|
|
@@ -74,10 +76,7 @@ export async function setCommand(repoArg, pathSpec, filePath, options = {}) {
|
|
|
74
76
|
type = providedType;
|
|
75
77
|
}
|
|
76
78
|
else {
|
|
77
|
-
// Use parseInferred for type inference from .east syntax
|
|
78
79
|
const [parsedType, parsedValue] = parseInferred(content);
|
|
79
|
-
// parseInferred returns EastType, but we need EastTypeValue
|
|
80
|
-
// Use toEastTypeValue to convert
|
|
81
80
|
value = parsedValue;
|
|
82
81
|
type = toEastTypeValue(parsedType);
|
|
83
82
|
}
|
|
@@ -85,7 +84,7 @@ export async function setCommand(repoArg, pathSpec, filePath, options = {}) {
|
|
|
85
84
|
}
|
|
86
85
|
case '.json': {
|
|
87
86
|
if (!providedType) {
|
|
88
|
-
exitError('JSON files require --type
|
|
87
|
+
exitError('JSON files require --type or --type-file. Example: --type ".Integer"');
|
|
89
88
|
}
|
|
90
89
|
const content = fileContent.toString('utf-8');
|
|
91
90
|
const jsonValue = JSON.parse(content);
|
|
@@ -96,9 +95,8 @@ export async function setCommand(repoArg, pathSpec, filePath, options = {}) {
|
|
|
96
95
|
}
|
|
97
96
|
case '.csv': {
|
|
98
97
|
if (!providedType) {
|
|
99
|
-
exitError('CSV files require --type
|
|
98
|
+
exitError('CSV files require --type or --type-file. Example: --type-file schema.east');
|
|
100
99
|
}
|
|
101
|
-
// CSV expects .Array .Struct [...] - check the variant type
|
|
102
100
|
if (providedType.type !== 'Array') {
|
|
103
101
|
exitError('CSV files require an Array type. Example: --type ".Array .Struct [...]"');
|
|
104
102
|
}
|
|
@@ -114,15 +112,18 @@ export async function setCommand(repoArg, pathSpec, filePath, options = {}) {
|
|
|
114
112
|
default:
|
|
115
113
|
exitError(`Unknown file extension: ${ext}. Supported: .beast2, .east, .json, .csv`);
|
|
116
114
|
}
|
|
117
|
-
|
|
115
|
+
if (location.type === 'local') {
|
|
116
|
+
const storage = new LocalStorage();
|
|
117
|
+
await workspaceSetDataset(storage, location.path, ws, path, value, type);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
const encoder = encodeBeast2For(type);
|
|
121
|
+
const beast2Data = encoder(value);
|
|
122
|
+
await datasetSetRemote(location.baseUrl, location.repo, ws, path, beast2Data, { token: location.token });
|
|
123
|
+
}
|
|
118
124
|
console.log(`Set ${pathSpec} from ${filePath}`);
|
|
119
125
|
}
|
|
120
126
|
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
127
|
exitError(formatError(err));
|
|
127
128
|
}
|
|
128
129
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set.js","sourceRoot":"","sources":["../../../src/commands/set.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH
|
|
1
|
+
{"version":3,"file":"set.js","sourceRoot":"","sources":["../../../src/commands/set.ts"],"names":[],"mappings":"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"}
|