@elaraai/e3-cli 0.0.2-beta.3 → 0.0.2-beta.30
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/README.md +30 -9
- package/dist/src/cli.js +44 -15
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/auth.d.ts +21 -0
- package/dist/src/commands/auth.d.ts.map +1 -0
- package/dist/src/commands/auth.js +204 -0
- package/dist/src/commands/auth.js.map +1 -0
- package/dist/src/commands/get.d.ts.map +1 -1
- package/dist/src/commands/get.js +32 -14
- package/dist/src/commands/get.js.map +1 -1
- package/dist/src/commands/list.d.ts.map +1 -1
- package/dist/src/commands/list.js +47 -14
- 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 +105 -69
- 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 +55 -18
- package/dist/src/commands/package.js.map +1 -1
- package/dist/src/commands/repo.d.ts +35 -0
- package/dist/src/commands/repo.d.ts.map +1 -0
- package/dist/src/commands/repo.js +243 -0
- package/dist/src/commands/repo.js.map +1 -0
- package/dist/src/commands/run.d.ts.map +1 -1
- package/dist/src/commands/run.js +4 -3
- package/dist/src/commands/run.js.map +1 -1
- package/dist/src/commands/set.d.ts.map +1 -1
- package/dist/src/commands/set.js +16 -5
- 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 +188 -47
- package/dist/src/commands/start.js.map +1 -1
- package/dist/src/commands/tree.d.ts +14 -0
- package/dist/src/commands/tree.d.ts.map +1 -0
- package/dist/src/commands/tree.js +171 -0
- package/dist/src/commands/tree.js.map +1 -0
- package/dist/src/commands/watch.d.ts.map +1 -1
- package/dist/src/commands/watch.js +131 -91
- package/dist/src/commands/watch.js.map +1 -1
- package/dist/src/commands/workspace.d.ts +4 -0
- package/dist/src/commands/workspace.d.ts.map +1 -1
- package/dist/src/commands/workspace.js +269 -29
- 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/utils.d.ts +48 -0
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +64 -0
- package/dist/src/utils.js.map +1 -1
- package/package.json +7 -6
- 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/README.md
CHANGED
|
@@ -13,18 +13,19 @@ npm install -g @elaraai/e3-cli
|
|
|
13
13
|
### Repository
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
|
-
e3
|
|
17
|
-
e3 status <repo>
|
|
18
|
-
e3
|
|
16
|
+
e3 repo create <repo> # Create a new repository
|
|
17
|
+
e3 repo status <repo> # Show repository status
|
|
18
|
+
e3 repo remove <repo> # Remove a repository
|
|
19
|
+
e3 repo gc <repo> [--dry-run] # Remove unreferenced objects
|
|
19
20
|
```
|
|
20
21
|
|
|
21
22
|
### Packages
|
|
22
23
|
|
|
23
24
|
```bash
|
|
24
|
-
e3 package import <repo> <zip>
|
|
25
|
+
e3 package import <repo> <zip> # Import package from .zip
|
|
25
26
|
e3 package export <repo> <pkg> <zip> # Export package to .zip
|
|
26
|
-
e3 package list <repo>
|
|
27
|
-
e3 package remove <repo> <pkg>
|
|
27
|
+
e3 package list <repo> # List installed packages
|
|
28
|
+
e3 package remove <repo> <pkg> # Remove a package
|
|
28
29
|
```
|
|
29
30
|
|
|
30
31
|
### Workspaces
|
|
@@ -34,6 +35,7 @@ e3 workspace create <repo> <name> # Create empty workspace
|
|
|
34
35
|
e3 workspace deploy <repo> <ws> <pkg> # Deploy package to workspace
|
|
35
36
|
e3 workspace export <repo> <ws> <zip> # Export workspace as package
|
|
36
37
|
e3 workspace list <repo> # List workspaces
|
|
38
|
+
e3 workspace status <repo> <ws> # Show workspace status
|
|
37
39
|
e3 workspace remove <repo> <ws> # Remove workspace
|
|
38
40
|
```
|
|
39
41
|
|
|
@@ -41,6 +43,7 @@ e3 workspace remove <repo> <ws> # Remove workspace
|
|
|
41
43
|
|
|
42
44
|
```bash
|
|
43
45
|
e3 list <repo> [path] # List workspaces or tree contents
|
|
46
|
+
e3 tree <repo> <path> # Show full tree structure
|
|
44
47
|
e3 get <repo> <path> [-f format] # Get dataset value (east/json/beast2)
|
|
45
48
|
e3 set <repo> <path> <file> # Set dataset value from file
|
|
46
49
|
```
|
|
@@ -48,8 +51,9 @@ e3 set <repo> <path> <file> # Set dataset value from file
|
|
|
48
51
|
### Execution
|
|
49
52
|
|
|
50
53
|
```bash
|
|
51
|
-
e3 run <repo> <task> [inputs...] # Run task ad-hoc
|
|
52
54
|
e3 start <repo> <ws> # Execute tasks in workspace
|
|
55
|
+
e3 run <repo> <task> [inputs...] # Run task ad-hoc
|
|
56
|
+
e3 watch <repo> <ws> <source.ts> # Watch and auto-deploy on changes
|
|
53
57
|
e3 logs <repo> <path> [--follow] # View task logs
|
|
54
58
|
```
|
|
55
59
|
|
|
@@ -59,11 +63,28 @@ e3 logs <repo> <path> [--follow] # View task logs
|
|
|
59
63
|
e3 convert [input] --to <format> # Convert between .east/.json/.beast2
|
|
60
64
|
```
|
|
61
65
|
|
|
66
|
+
### Authentication (for remote servers)
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
e3 login <server> # Log in using OAuth2 Device Flow
|
|
70
|
+
e3 logout <server> # Log out and clear credentials
|
|
71
|
+
e3 auth status # List all saved credentials
|
|
72
|
+
e3 auth token <server> # Print access token (for curl/debugging)
|
|
73
|
+
e3 auth whoami [server] # Show current identity
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
The `e3 auth token` command is useful for debugging API calls:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
curl -H "Authorization: Bearer $(e3 auth token https://example.com)" \
|
|
80
|
+
https://example.com/api/repos/my-repo/status
|
|
81
|
+
```
|
|
82
|
+
|
|
62
83
|
## Example
|
|
63
84
|
|
|
64
85
|
```bash
|
|
65
|
-
#
|
|
66
|
-
e3
|
|
86
|
+
# Create repository and import a package
|
|
87
|
+
e3 repo create ./my-project
|
|
67
88
|
e3 package import ./my-project ./greeting-pkg-1.0.0.zip
|
|
68
89
|
|
|
69
90
|
# Create workspace and deploy package
|
package/dist/src/cli.js
CHANGED
|
@@ -8,40 +8,54 @@
|
|
|
8
8
|
*
|
|
9
9
|
* All commands take a repository path as the first argument (`.` for current directory).
|
|
10
10
|
*/
|
|
11
|
+
import { createRequire } from 'node:module';
|
|
11
12
|
import { Command } from 'commander';
|
|
12
|
-
|
|
13
|
+
const require = createRequire(import.meta.url);
|
|
14
|
+
const packageJson = require('../../package.json');
|
|
15
|
+
import { repoCommand } from './commands/repo.js';
|
|
13
16
|
import { packageCommand } from './commands/package.js';
|
|
14
17
|
import { workspaceCommand } from './commands/workspace.js';
|
|
15
18
|
import { listCommand } from './commands/list.js';
|
|
19
|
+
import { treeCommand } from './commands/tree.js';
|
|
16
20
|
import { getCommand } from './commands/get.js';
|
|
17
21
|
import { setCommand } from './commands/set.js';
|
|
18
22
|
import { startCommand } from './commands/start.js';
|
|
19
23
|
import { runCommand } from './commands/run.js';
|
|
20
24
|
import { logsCommand } from './commands/logs.js';
|
|
21
|
-
import { statusCommand } from './commands/status.js';
|
|
22
|
-
import { gcCommand } from './commands/gc.js';
|
|
23
25
|
import { convertCommand } from './commands/convert.js';
|
|
24
26
|
import { watchCommand } from './commands/watch.js';
|
|
27
|
+
import { createAuthCommand, createLoginCommand, createLogoutCommand } from './commands/auth.js';
|
|
25
28
|
const program = new Command();
|
|
26
29
|
program
|
|
27
30
|
.name('e3')
|
|
28
31
|
.description('East Execution Engine - Execute tasks across multiple runtimes')
|
|
29
|
-
.version(
|
|
32
|
+
.version(packageJson.version);
|
|
30
33
|
// Repository commands
|
|
31
34
|
program
|
|
32
|
-
.command('
|
|
33
|
-
.description('
|
|
34
|
-
.
|
|
35
|
-
|
|
36
|
-
.
|
|
37
|
-
.
|
|
38
|
-
.
|
|
39
|
-
|
|
40
|
-
.
|
|
35
|
+
.command('repo')
|
|
36
|
+
.description('Repository operations')
|
|
37
|
+
.addCommand(new Command('create')
|
|
38
|
+
.description('Create a new repository')
|
|
39
|
+
.argument('<repo>', 'Repository path or URL')
|
|
40
|
+
.action(repoCommand.create))
|
|
41
|
+
.addCommand(new Command('remove')
|
|
42
|
+
.description('Remove a repository')
|
|
43
|
+
.argument('<repo>', 'Repository path or URL')
|
|
44
|
+
.action(repoCommand.remove))
|
|
45
|
+
.addCommand(new Command('status')
|
|
46
|
+
.description('Show repository status')
|
|
47
|
+
.argument('<repo>', 'Repository path or URL')
|
|
48
|
+
.action(repoCommand.status))
|
|
49
|
+
.addCommand(new Command('gc')
|
|
41
50
|
.description('Remove unreferenced objects')
|
|
51
|
+
.argument('<repo>', 'Repository path or URL')
|
|
42
52
|
.option('--dry-run', 'Report what would be deleted without deleting')
|
|
43
53
|
.option('--min-age <ms>', 'Minimum file age in ms before deletion', '60000')
|
|
44
|
-
.action(
|
|
54
|
+
.action(repoCommand.gc))
|
|
55
|
+
.addCommand(new Command('list')
|
|
56
|
+
.description('List repositories on a server')
|
|
57
|
+
.argument('<server>', 'Server URL (e.g., http://localhost:3000)')
|
|
58
|
+
.action(repoCommand.list));
|
|
45
59
|
// Package commands
|
|
46
60
|
program
|
|
47
61
|
.command('package')
|
|
@@ -97,12 +111,23 @@ program
|
|
|
97
111
|
.description('Remove a workspace')
|
|
98
112
|
.argument('<repo>', 'Repository path')
|
|
99
113
|
.argument('<ws>', 'Workspace name')
|
|
100
|
-
.action(workspaceCommand.remove))
|
|
114
|
+
.action(workspaceCommand.remove))
|
|
115
|
+
.addCommand(new Command('status')
|
|
116
|
+
.description('Show detailed workspace status (tasks, datasets, locks)')
|
|
117
|
+
.argument('<repo>', 'Repository path')
|
|
118
|
+
.argument('<ws>', 'Workspace name')
|
|
119
|
+
.action(workspaceCommand.status));
|
|
101
120
|
// Dataset commands
|
|
102
121
|
program
|
|
103
122
|
.command('list <repo> [path]')
|
|
104
123
|
.description('List workspaces or tree contents at path (ws.path.to.tree)')
|
|
105
124
|
.action(listCommand);
|
|
125
|
+
program
|
|
126
|
+
.command('tree <repo> <path>')
|
|
127
|
+
.description('Show full tree structure at path (ws or ws.subtree)')
|
|
128
|
+
.option('--depth <n>', 'Maximum depth to display')
|
|
129
|
+
.option('--types', 'Show dataset types')
|
|
130
|
+
.action(treeCommand);
|
|
106
131
|
program
|
|
107
132
|
.command('get <repo> <path>')
|
|
108
133
|
.description('Get dataset value at path (ws.path.to.dataset)')
|
|
@@ -148,5 +173,9 @@ program
|
|
|
148
173
|
.option('-o, --output <path>', 'Output file path (default: stdout)')
|
|
149
174
|
.option('--type <typespec>', 'Type specification in .east format')
|
|
150
175
|
.action(convertCommand);
|
|
176
|
+
// Authentication commands
|
|
177
|
+
program.addCommand(createLoginCommand());
|
|
178
|
+
program.addCommand(createLogoutCommand());
|
|
179
|
+
program.addCommand(createAuthCommand());
|
|
151
180
|
program.parse();
|
|
152
181
|
//# sourceMappingURL=cli.js.map
|
package/dist/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEhG,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,gEAAgE,CAAC;KAC7E,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAEhC,sBAAsB;AACtB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,uBAAuB,CAAC;KACpC,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC;KAClB,WAAW,CAAC,yBAAyB,CAAC;KACtC,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC;KAC5C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAC9B;KACA,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC;KAClB,WAAW,CAAC,qBAAqB,CAAC;KAClC,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC;KAC5C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAC9B;KACA,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC;KAClB,WAAW,CAAC,wBAAwB,CAAC;KACrC,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC;KAC5C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAC9B;KACA,UAAU,CACT,IAAI,OAAO,CAAC,IAAI,CAAC;KACd,WAAW,CAAC,6BAA6B,CAAC;KAC1C,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC;KAC5C,MAAM,CAAC,WAAW,EAAE,+CAA+C,CAAC;KACpE,MAAM,CAAC,gBAAgB,EAAE,wCAAwC,EAAE,OAAO,CAAC;KAC3E,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAC1B;KACA,UAAU,CACT,IAAI,OAAO,CAAC,MAAM,CAAC;KAChB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,QAAQ,CAAC,UAAU,EAAE,0CAA0C,CAAC;KAChE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAC5B,CAAC;AAEJ,mBAAmB;AACnB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,oBAAoB,CAAC;KACjC,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC;KAClB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;KACrC,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;KAC1C,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CACjC;KACA,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC;KAClB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;KACrC,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;KAC3C,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;KACzC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CACjC;KACA,UAAU,CACT,IAAI,OAAO,CAAC,MAAM,CAAC;KAChB,WAAW,CAAC,yBAAyB,CAAC;KACtC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;KACrC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAC/B;KACA,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC;KAClB,WAAW,CAAC,kBAAkB,CAAC;KAC/B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;KACrC,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;KAC3C,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CACjC,CAAC;AAEJ,qBAAqB;AACrB,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,sBAAsB,CAAC;KACnC,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC;KAClB,WAAW,CAAC,2BAA2B,CAAC;KACxC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;KACrC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KACpC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CACnC;KACA,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC;KAClB,WAAW,CAAC,iCAAiC,CAAC;KAC9C,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;KACrC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;KAClC,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;KAC3C,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CACnC;KACA,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC;KAClB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;KACrC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;KAClC,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;KACzC,MAAM,CAAC,eAAe,EAAE,+CAA+C,CAAC;KACxE,MAAM,CAAC,qBAAqB,EAAE,2CAA2C,CAAC;KAC1E,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CACnC;KACA,UAAU,CACT,IAAI,OAAO,CAAC,MAAM,CAAC;KAChB,WAAW,CAAC,iBAAiB,CAAC;KAC9B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;KACrC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CACjC;KACA,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC;KAClB,WAAW,CAAC,oBAAoB,CAAC;KACjC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;KACrC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CACnC;KACA,UAAU,CACT,IAAI,OAAO,CAAC,QAAQ,CAAC;KAClB,WAAW,CAAC,yDAAyD,CAAC;KACtE,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;KACrC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CACnC,CAAC;AAEJ,mBAAmB;AACnB,OAAO;KACJ,OAAO,CAAC,oBAAoB,CAAC;KAC7B,WAAW,CAAC,4DAA4D,CAAC;KACzE,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,oBAAoB,CAAC;KAC7B,WAAW,CAAC,qDAAqD,CAAC;KAClE,MAAM,CAAC,aAAa,EAAE,0BAA0B,CAAC;KACjD,MAAM,CAAC,SAAS,EAAE,oBAAoB,CAAC;KACvC,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,gDAAgD,CAAC;KAC7D,MAAM,CAAC,uBAAuB,EAAE,mCAAmC,EAAE,MAAM,CAAC;KAC5E,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,OAAO;KACJ,OAAO,CAAC,0BAA0B,CAAC;KACnC,WAAW,CAAC,kDAAkD,CAAC;KAC/D,MAAM,CAAC,mBAAmB,EAAE,oEAAoE,CAAC;KACjG,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,qBAAqB;AACrB,OAAO;KACJ,OAAO,CAAC,+BAA+B,CAAC;KACxC,WAAW,CAAC,6DAA6D,CAAC;KAC1E,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,SAAS,EAAE,mCAAmC,CAAC;KACtD,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,OAAO;KACJ,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,8BAA8B,CAAC;KAC3C,MAAM,CAAC,oBAAoB,EAAE,iCAAiC,CAAC;KAC/D,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,EAAE,GAAG,CAAC;KACxD,MAAM,CAAC,SAAS,EAAE,mCAAmC,CAAC;KACtD,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,mCAAmC,CAAC;KAC5C,WAAW,CAAC,oDAAoD,CAAC;KACjE,MAAM,CAAC,SAAS,EAAE,oCAAoC,CAAC;KACvD,MAAM,CAAC,mBAAmB,EAAE,yCAAyC,EAAE,GAAG,CAAC;KAC3E,MAAM,CAAC,mBAAmB,EAAE,2CAA2C,CAAC;KACxE,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,oBAAoB,CAAC;KAC7B,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,UAAU,EAAE,mBAAmB,CAAC;KACvC,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,mBAAmB;AACnB,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,iBAAiB,EAAE,yDAAyD,CAAC;KACpF,MAAM,CAAC,eAAe,EAAE,mCAAmC,EAAE,MAAM,CAAC;KACpE,MAAM,CAAC,qBAAqB,EAAE,oCAAoC,CAAC;KACnE,MAAM,CAAC,mBAAmB,EAAE,oCAAoC,CAAC;KACjE,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,0BAA0B;AAC1B,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;AACzC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;AAC1C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAExC,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Authentication commands for e3 CLI.
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
/**
|
|
10
|
+
* Create the auth command group.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createAuthCommand(): Command;
|
|
13
|
+
/**
|
|
14
|
+
* Create the login command.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createLoginCommand(): Command;
|
|
17
|
+
/**
|
|
18
|
+
* Create the logout command.
|
|
19
|
+
*/
|
|
20
|
+
export declare function createLogoutCommand(): Command;
|
|
21
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0CpC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAiF3C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CA6E5C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAa7C"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Authentication commands for e3 CLI.
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
import { fetchDiscovery, startDeviceAuth, pollForTokens, setCredential, removeCredential, listCredentials, getCredential, getValidToken, isExpired, decodeJwtPayload, normalizeServerUrl, } from '../credentials.js';
|
|
10
|
+
/**
|
|
11
|
+
* Try to open a URL in the default browser.
|
|
12
|
+
*/
|
|
13
|
+
async function openBrowser(url) {
|
|
14
|
+
const { exec } = await import('node:child_process');
|
|
15
|
+
const { platform } = await import('node:os');
|
|
16
|
+
return new Promise((resolve) => {
|
|
17
|
+
let command;
|
|
18
|
+
switch (platform()) {
|
|
19
|
+
case 'darwin':
|
|
20
|
+
command = `open "${url}"`;
|
|
21
|
+
break;
|
|
22
|
+
case 'win32':
|
|
23
|
+
command = `start "" "${url}"`;
|
|
24
|
+
break;
|
|
25
|
+
default:
|
|
26
|
+
command = `xdg-open "${url}"`;
|
|
27
|
+
}
|
|
28
|
+
exec(command, (error) => {
|
|
29
|
+
resolve(!error);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Create the auth command group.
|
|
35
|
+
*/
|
|
36
|
+
export function createAuthCommand() {
|
|
37
|
+
const auth = new Command('auth')
|
|
38
|
+
.description('Authentication commands');
|
|
39
|
+
// e3 auth status - List all saved credentials
|
|
40
|
+
auth
|
|
41
|
+
.command('status')
|
|
42
|
+
.description('List saved credentials')
|
|
43
|
+
.action(() => {
|
|
44
|
+
const creds = listCredentials();
|
|
45
|
+
if (creds.length === 0) {
|
|
46
|
+
console.log('No saved credentials.');
|
|
47
|
+
console.log('Run: e3 login <server>');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
console.log('Saved credentials:\n');
|
|
51
|
+
for (const { server, expiresAt } of creds) {
|
|
52
|
+
const expired = isExpired(expiresAt);
|
|
53
|
+
const status = expired ? '(expired)' : '(valid)';
|
|
54
|
+
console.log(` ${server} ${status}`);
|
|
55
|
+
console.log(` Token expires: ${expiresAt}`);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
// e3 auth token <server> - Print access token for use with curl
|
|
59
|
+
auth
|
|
60
|
+
.command('token')
|
|
61
|
+
.description('Print access token for a server (for curl/debugging)')
|
|
62
|
+
.argument('<server>', 'Server URL')
|
|
63
|
+
.action(async (server) => {
|
|
64
|
+
const serverUrl = normalizeServerUrl(server);
|
|
65
|
+
try {
|
|
66
|
+
// getValidToken handles refresh automatically if token is expired
|
|
67
|
+
const token = await getValidToken(serverUrl);
|
|
68
|
+
// Print just the token, suitable for: curl -H "Authorization: Bearer $(e3 auth token <server>)"
|
|
69
|
+
console.log(token);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
const message = err instanceof Error ? err.message : 'unknown error';
|
|
73
|
+
console.error(message);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
// e3 auth whoami [server] - Show current identity
|
|
78
|
+
auth
|
|
79
|
+
.command('whoami')
|
|
80
|
+
.description('Show current identity')
|
|
81
|
+
.argument('[server]', 'Server URL')
|
|
82
|
+
.action((server) => {
|
|
83
|
+
const creds = listCredentials();
|
|
84
|
+
if (creds.length === 0) {
|
|
85
|
+
console.log('Not logged in to any servers.');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const servers = server ? [server] : creds.map((c) => c.server);
|
|
89
|
+
for (const serverUrl of servers) {
|
|
90
|
+
const credential = getCredential(serverUrl);
|
|
91
|
+
if (!credential) {
|
|
92
|
+
console.log(`${serverUrl}: Not logged in`);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
const payload = decodeJwtPayload(credential.accessToken);
|
|
97
|
+
const expired = isExpired(credential.expiresAt);
|
|
98
|
+
const status = expired ? '(token expired)' : '';
|
|
99
|
+
console.log(`${serverUrl}: ${status}`);
|
|
100
|
+
console.log(` Subject: ${payload.sub ?? 'unknown'}`);
|
|
101
|
+
if (payload.email) {
|
|
102
|
+
console.log(` Email: ${payload.email}`);
|
|
103
|
+
}
|
|
104
|
+
console.log(` Issuer: ${payload.iss ?? 'unknown'}`);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
console.log(`${serverUrl}: Invalid token`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
return auth;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Create the login command.
|
|
115
|
+
*/
|
|
116
|
+
export function createLoginCommand() {
|
|
117
|
+
return new Command('login')
|
|
118
|
+
.description('Log in to a server using OAuth2 Device Flow')
|
|
119
|
+
.argument('<server>', 'Server URL (e.g., http://localhost:3000)')
|
|
120
|
+
.option('--no-browser', 'Do not open browser (for CI/headless environments)')
|
|
121
|
+
.action(async (server, options) => {
|
|
122
|
+
const serverUrl = normalizeServerUrl(server);
|
|
123
|
+
console.log(`Logging in to ${serverUrl}...`);
|
|
124
|
+
// Fetch OIDC discovery document
|
|
125
|
+
let discovery;
|
|
126
|
+
try {
|
|
127
|
+
discovery = await fetchDiscovery(serverUrl);
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
const message = err instanceof Error ? err.message : 'unknown error';
|
|
131
|
+
console.error(`Failed to connect to server: ${message}`);
|
|
132
|
+
console.error('Make sure the server is running with --oidc enabled.');
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
// Start device authorization
|
|
136
|
+
let deviceAuth;
|
|
137
|
+
try {
|
|
138
|
+
deviceAuth = await startDeviceAuth(discovery);
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
const message = err instanceof Error ? err.message : 'unknown error';
|
|
142
|
+
console.error(`Failed to start login: ${message}`);
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
// Display user code and URL (unless in quiet CI mode)
|
|
146
|
+
if (options.browser) {
|
|
147
|
+
console.log('\nTo complete login:');
|
|
148
|
+
console.log(` 1. Open: ${deviceAuth.verification_uri}`);
|
|
149
|
+
console.log(` 2. Enter code: ${deviceAuth.user_code}`);
|
|
150
|
+
console.log(`\nOr visit this URL directly:`);
|
|
151
|
+
console.log(` ${deviceAuth.verification_uri_complete}`);
|
|
152
|
+
// Try to open browser
|
|
153
|
+
const opened = await openBrowser(deviceAuth.verification_uri_complete);
|
|
154
|
+
if (opened) {
|
|
155
|
+
console.log('\nBrowser opened. Waiting for approval...');
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
console.log('\nWaiting for approval...');
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
console.log('Waiting for server approval (--no-browser mode)...');
|
|
163
|
+
}
|
|
164
|
+
// Poll for tokens
|
|
165
|
+
try {
|
|
166
|
+
const tokens = await pollForTokens(discovery, deviceAuth.device_code, deviceAuth.interval, deviceAuth.expires_in);
|
|
167
|
+
// Save credentials
|
|
168
|
+
const entry = {
|
|
169
|
+
accessToken: tokens.access_token,
|
|
170
|
+
refreshToken: tokens.refresh_token,
|
|
171
|
+
expiresAt: new Date(Date.now() + tokens.expires_in * 1000).toISOString(),
|
|
172
|
+
};
|
|
173
|
+
setCredential(serverUrl, entry);
|
|
174
|
+
// Show identity
|
|
175
|
+
const payload = decodeJwtPayload(tokens.access_token);
|
|
176
|
+
console.log(`\nSuccessfully logged in as: ${payload.sub ?? 'unknown'}`);
|
|
177
|
+
console.log(`Token expires: ${entry.expiresAt}`);
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
const message = err instanceof Error ? err.message : 'unknown error';
|
|
181
|
+
console.error(`\nLogin failed: ${message}`);
|
|
182
|
+
process.exit(1);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Create the logout command.
|
|
188
|
+
*/
|
|
189
|
+
export function createLogoutCommand() {
|
|
190
|
+
return new Command('logout')
|
|
191
|
+
.description('Log out from a server')
|
|
192
|
+
.argument('<server>', 'Server URL')
|
|
193
|
+
.action((server) => {
|
|
194
|
+
const serverUrl = normalizeServerUrl(server);
|
|
195
|
+
const removed = removeCredential(serverUrl);
|
|
196
|
+
if (removed) {
|
|
197
|
+
console.log(`Logged out from ${serverUrl}`);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
console.log(`Not logged in to ${serverUrl}`);
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../src/commands/get.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../src/commands/get.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAuEf"}
|
package/dist/src/commands/get.js
CHANGED
|
@@ -8,32 +8,50 @@
|
|
|
8
8
|
* Usage:
|
|
9
9
|
* e3 get . ws.path.to.dataset
|
|
10
10
|
* e3 get . ws.path.to.dataset -f json
|
|
11
|
+
* e3 get https://server/repos/myrepo ws.path.to.dataset
|
|
11
12
|
*/
|
|
12
|
-
import { workspaceGetDatasetHash, datasetRead } from '@elaraai/e3-core';
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
13
|
+
import { workspaceGetDatasetHash, datasetRead, LocalStorage } from '@elaraai/e3-core';
|
|
14
|
+
import { datasetGet as datasetGetRemote } from '@elaraai/e3-api-client';
|
|
15
|
+
import { printFor, toJSONFor, decodeBeast2, toEastTypeValue, isVariant } from '@elaraai/east';
|
|
16
|
+
import { parseRepoLocation, parseDatasetPath, formatError, exitError } from '../utils.js';
|
|
15
17
|
/**
|
|
16
18
|
* Get dataset value at a path.
|
|
17
19
|
*/
|
|
18
20
|
export async function getCommand(repoArg, pathSpec, options) {
|
|
19
21
|
try {
|
|
20
|
-
const
|
|
22
|
+
const location = await parseRepoLocation(repoArg);
|
|
21
23
|
const { ws, path } = parseDatasetPath(pathSpec);
|
|
22
24
|
if (path.length === 0) {
|
|
23
25
|
exitError('Path must include at least one field (e.g., ws.field)');
|
|
24
26
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
const format = options.format ?? 'east';
|
|
28
|
+
let type;
|
|
29
|
+
let value;
|
|
30
|
+
if (location.type === 'local') {
|
|
31
|
+
const storage = new LocalStorage();
|
|
32
|
+
// Get the hash first, then read with type info
|
|
33
|
+
const { refType, hash } = await workspaceGetDatasetHash(storage, location.path, ws, path);
|
|
34
|
+
if (refType === 'unassigned') {
|
|
35
|
+
exitError('Dataset is unassigned (pending task output)');
|
|
36
|
+
}
|
|
37
|
+
if (refType === 'null' || hash === null) {
|
|
38
|
+
console.log('null');
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// Read the dataset to get both value and type
|
|
42
|
+
const dataset = await datasetRead(storage, location.path, hash);
|
|
43
|
+
// Convert EastType to EastTypeValue if necessary
|
|
44
|
+
type = isVariant(dataset.type) ? dataset.type : toEastTypeValue(dataset.type);
|
|
45
|
+
value = dataset.value;
|
|
29
46
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
47
|
+
else {
|
|
48
|
+
// Remote: get raw BEAST2 bytes and decode
|
|
49
|
+
const beast2Data = await datasetGetRemote(location.baseUrl, location.repo, ws, path, { token: location.token });
|
|
50
|
+
// Decode BEAST2 to get type and value
|
|
51
|
+
const decoded = decodeBeast2(beast2Data);
|
|
52
|
+
type = decoded.type;
|
|
53
|
+
value = decoded.value;
|
|
33
54
|
}
|
|
34
|
-
// Read the dataset to get both value and type
|
|
35
|
-
const { type, value } = await datasetRead(repoPath, hash);
|
|
36
|
-
const format = options.format ?? 'east';
|
|
37
55
|
switch (format) {
|
|
38
56
|
case 'east': {
|
|
39
57
|
const printer = printFor(type);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/commands/get.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/commands/get.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwBH;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqFnF"}
|
|
@@ -10,35 +10,68 @@
|
|
|
10
10
|
* e3 list . ws # List root tree of workspace
|
|
11
11
|
* e3 list . ws.inputs # List fields under inputs
|
|
12
12
|
*/
|
|
13
|
-
import { workspaceList, workspaceListTree, workspaceGetState, } from '@elaraai/e3-core';
|
|
14
|
-
import {
|
|
13
|
+
import { workspaceList, workspaceListTree, workspaceGetState, LocalStorage, } from '@elaraai/e3-core';
|
|
14
|
+
import { workspaceList as workspaceListRemote, datasetList as datasetListRemote, datasetListAt as datasetListAtRemote, } from '@elaraai/e3-api-client';
|
|
15
|
+
import { parseRepoLocation, parseDatasetPath, formatError, exitError } from '../utils.js';
|
|
15
16
|
/**
|
|
16
17
|
* List workspaces or tree contents at a path.
|
|
17
18
|
*/
|
|
18
19
|
export async function listCommand(repoArg, pathSpec) {
|
|
19
20
|
try {
|
|
20
|
-
const
|
|
21
|
+
const location = await parseRepoLocation(repoArg);
|
|
21
22
|
// If no path, list workspaces
|
|
22
23
|
if (!pathSpec) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
if (location.type === 'local') {
|
|
25
|
+
const storage = new LocalStorage();
|
|
26
|
+
const workspaces = await workspaceList(storage, location.path);
|
|
27
|
+
if (workspaces.length === 0) {
|
|
28
|
+
console.log('No workspaces');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
for (const ws of workspaces) {
|
|
32
|
+
const state = await workspaceGetState(storage, location.path, ws);
|
|
33
|
+
if (state) {
|
|
34
|
+
console.log(`${ws} (${state.packageName}@${state.packageVersion})`);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
console.log(`${ws} (not deployed)`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
27
40
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
41
|
+
else {
|
|
42
|
+
// Remote: list workspaces
|
|
43
|
+
const workspaces = await workspaceListRemote(location.baseUrl, location.repo, { token: location.token });
|
|
44
|
+
if (workspaces.length === 0) {
|
|
45
|
+
console.log('No workspaces');
|
|
46
|
+
return;
|
|
32
47
|
}
|
|
33
|
-
|
|
34
|
-
|
|
48
|
+
for (const ws of workspaces) {
|
|
49
|
+
if (ws.deployed && ws.packageName.type === 'some' && ws.packageVersion.type === 'some') {
|
|
50
|
+
console.log(`${ws.name} (${ws.packageName.value}@${ws.packageVersion.value})`);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
console.log(`${ws.name} (not deployed)`);
|
|
54
|
+
}
|
|
35
55
|
}
|
|
36
56
|
}
|
|
37
57
|
return;
|
|
38
58
|
}
|
|
39
59
|
// Parse path and list tree contents
|
|
40
60
|
const { ws, path } = parseDatasetPath(pathSpec);
|
|
41
|
-
|
|
61
|
+
let fields;
|
|
62
|
+
if (location.type === 'local') {
|
|
63
|
+
const storage = new LocalStorage();
|
|
64
|
+
fields = await workspaceListTree(storage, location.path, ws, path);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// Remote: list tree contents
|
|
68
|
+
if (path.length === 0) {
|
|
69
|
+
fields = await datasetListRemote(location.baseUrl, location.repo, ws, { token: location.token });
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
fields = await datasetListAtRemote(location.baseUrl, location.repo, ws, path, { token: location.token });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
42
75
|
if (fields.length === 0) {
|
|
43
76
|
console.log('(empty)');
|
|
44
77
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AAEH,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/list.ts"],"names":[],"mappings":"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"}
|