@rool-dev/cli 0.1.9-dev.ffef516 → 0.1.10-dev.4204061
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 +50 -16
- package/dist/app.d.ts +3 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +160 -0
- package/dist/app.js.map +1 -0
- package/dist/chat.d.ts +2 -1
- package/dist/chat.d.ts.map +1 -1
- package/dist/chat.js +52 -35
- package/dist/chat.js.map +1 -1
- package/dist/client.d.ts +5 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +16 -0
- package/dist/client.js.map +1 -0
- package/dist/constants.d.ts +5 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +8 -0
- package/dist/constants.js.map +1 -0
- package/dist/format.d.ts +1 -0
- package/dist/format.d.ts.map +1 -1
- package/dist/format.js +7 -0
- package/dist/format.js.map +1 -1
- package/dist/index.js +4 -52
- package/dist/index.js.map +1 -1
- package/dist/logout.d.ts +2 -1
- package/dist/logout.d.ts.map +1 -1
- package/dist/logout.js +26 -22
- package/dist/logout.js.map +1 -1
- package/dist/media.d.ts +2 -1
- package/dist/media.d.ts.map +1 -1
- package/dist/media.js +69 -98
- package/dist/media.js.map +1 -1
- package/dist/program.d.ts +3 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +23 -0
- package/dist/program.js.map +1 -0
- package/dist/space.d.ts +2 -1
- package/dist/space.d.ts.map +1 -1
- package/dist/space.js +94 -98
- package/dist/space.js.map +1 -1
- package/dist/user.d.ts +2 -1
- package/dist/user.d.ts.map +1 -1
- package/dist/user.js +28 -25
- package/dist/user.js.map +1 -1
- package/package.json +5 -2
- package/dist/args.d.ts +0 -12
- package/dist/args.d.ts.map +0 -1
- package/dist/args.js +0 -49
- package/dist/args.js.map +0 -1
- package/dist/publish.d.ts +0 -2
- package/dist/publish.d.ts.map +0 -1
- package/dist/publish.js +0 -195
- package/dist/publish.js.map +0 -1
package/dist/logout.js
CHANGED
|
@@ -1,24 +1,28 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
1
|
+
import { getClient } from './client.js';
|
|
2
|
+
import { DEFAULT_API_URL } from './constants.js';
|
|
3
|
+
export function registerLogout(program) {
|
|
4
|
+
program
|
|
5
|
+
.command('logout')
|
|
6
|
+
.description('Log out')
|
|
7
|
+
.option('-u, --url <url>', 'API URL', DEFAULT_API_URL)
|
|
8
|
+
.addHelpText('after', `
|
|
9
|
+
Examples:
|
|
10
|
+
# Log out
|
|
11
|
+
$ rool logout`)
|
|
12
|
+
.action(async (opts) => {
|
|
13
|
+
const client = await getClient(opts.url, { autoLogin: false });
|
|
14
|
+
try {
|
|
15
|
+
if (!await client.isAuthenticated()) {
|
|
16
|
+
console.log('Not logged in.');
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
client.logout();
|
|
20
|
+
console.log('Logged out.');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
client.destroy();
|
|
25
|
+
}
|
|
26
|
+
});
|
|
23
27
|
}
|
|
24
28
|
//# sourceMappingURL=logout.js.map
|
package/dist/logout.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../src/logout.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../src/logout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,SAAS,CAAC;SACtB,MAAM,CAAC,iBAAiB,EAAE,SAAS,EAAE,eAAe,CAAC;SACrD,WAAW,CAAC,OAAO,EAAE;;;gBAGV,CAAC;SACZ,MAAM,CAAC,KAAK,EAAE,IAAqB,EAAE,EAAE;QACtC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,MAAM,CAAC,eAAe,EAAE,EAAE,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/media.d.ts
CHANGED
package/dist/media.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6EpD"}
|
package/dist/media.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { execSync } from 'node:child_process';
|
|
2
2
|
import * as fs from 'node:fs';
|
|
3
3
|
import * as path from 'node:path';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
4
|
+
import { getClient } from './client.js';
|
|
5
|
+
import { formatBytes } from './format.js';
|
|
6
|
+
import { DEFAULT_API_URL, DEFAULT_SPACE_NAME } from './constants.js';
|
|
7
7
|
function getContentType(filePath) {
|
|
8
8
|
try {
|
|
9
9
|
return execSync(`file --mime-type -b "${filePath}"`, { encoding: 'utf-8' }).trim();
|
|
@@ -12,101 +12,72 @@ function getContentType(filePath) {
|
|
|
12
12
|
return 'application/octet-stream';
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
|
-
function
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
async
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
console.log('Opening browser to authenticate...');
|
|
41
|
-
await client.login('Rool CLI');
|
|
42
|
-
}
|
|
43
|
-
return client;
|
|
44
|
-
}
|
|
45
|
-
async function getSpace(client, spaceName) {
|
|
46
|
-
const spaces = await client.listSpaces();
|
|
47
|
-
const spaceInfo = spaces.find(s => s.name === spaceName);
|
|
48
|
-
if (spaceInfo) {
|
|
49
|
-
return client.openSpace(spaceInfo.id);
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
return client.createSpace(spaceName);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
async function uploadMedia(args) {
|
|
56
|
-
const { space: spaceName, url: apiUrl, message, rest } = parseArgs(args);
|
|
57
|
-
const filePath = rest[0];
|
|
58
|
-
if (!filePath) {
|
|
59
|
-
printUsage();
|
|
60
|
-
process.exit(1);
|
|
61
|
-
}
|
|
62
|
-
if (!fs.existsSync(filePath)) {
|
|
63
|
-
console.error(`File not found: ${filePath}`);
|
|
64
|
-
process.exit(1);
|
|
65
|
-
}
|
|
66
|
-
const stats = fs.statSync(filePath);
|
|
67
|
-
if (!stats.isFile()) {
|
|
68
|
-
console.error(`Not a file: ${filePath}`);
|
|
69
|
-
process.exit(1);
|
|
70
|
-
}
|
|
71
|
-
const filename = path.basename(filePath);
|
|
72
|
-
const contentType = getContentType(filePath);
|
|
73
|
-
const size = stats.size;
|
|
74
|
-
const client = await getClient(apiUrl);
|
|
75
|
-
const space = await getSpace(client, spaceName);
|
|
76
|
-
try {
|
|
77
|
-
const fileBuffer = fs.readFileSync(filePath);
|
|
78
|
-
const blob = new Blob([fileBuffer], { type: contentType });
|
|
79
|
-
console.log(`Uploading ${filename} (${formatSize(size)})...`);
|
|
80
|
-
const url = await space.uploadMedia(blob);
|
|
81
|
-
const objectData = {
|
|
82
|
-
type: 'file',
|
|
83
|
-
url,
|
|
84
|
-
filename,
|
|
85
|
-
contentType,
|
|
86
|
-
size,
|
|
87
|
-
uploadedAt: new Date().toISOString(),
|
|
88
|
-
};
|
|
89
|
-
if (message) {
|
|
90
|
-
objectData.comment = message;
|
|
15
|
+
export function registerMedia(program) {
|
|
16
|
+
const media = program
|
|
17
|
+
.command('media')
|
|
18
|
+
.description('Manage media files');
|
|
19
|
+
media
|
|
20
|
+
.command('upload')
|
|
21
|
+
.description('Upload a file to a space and create an object with the media URL')
|
|
22
|
+
.argument('<file>', 'file to upload')
|
|
23
|
+
.option('-m, --message <text>', 'optional comment/description')
|
|
24
|
+
.option('-s, --space <name>', 'space name', DEFAULT_SPACE_NAME)
|
|
25
|
+
.option('-u, --url <url>', 'API URL', DEFAULT_API_URL)
|
|
26
|
+
.addHelpText('after', `
|
|
27
|
+
Examples:
|
|
28
|
+
# Upload a file
|
|
29
|
+
$ rool media upload photo.jpg
|
|
30
|
+
|
|
31
|
+
# Upload with a comment
|
|
32
|
+
$ rool media upload report.pdf -m "Q4 sales report"
|
|
33
|
+
|
|
34
|
+
# Upload to a specific space
|
|
35
|
+
$ rool media upload logo.png -s "My Project"`)
|
|
36
|
+
.action(async (filePath, opts) => {
|
|
37
|
+
if (!fs.existsSync(filePath)) {
|
|
38
|
+
console.error(`File not found: ${filePath}`);
|
|
39
|
+
process.exit(1);
|
|
91
40
|
}
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
41
|
+
const stats = fs.statSync(filePath);
|
|
42
|
+
if (!stats.isFile()) {
|
|
43
|
+
console.error(`Not a file: ${filePath}`);
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
const filename = path.basename(filePath);
|
|
47
|
+
const contentType = getContentType(filePath);
|
|
48
|
+
const size = stats.size;
|
|
49
|
+
const client = await getClient(opts.url);
|
|
50
|
+
// Find or create space by name
|
|
51
|
+
const spaces = await client.listSpaces();
|
|
52
|
+
const spaceInfo = spaces.find(s => s.name === opts.space);
|
|
53
|
+
const space = spaceInfo
|
|
54
|
+
? await client.openSpace(spaceInfo.id)
|
|
55
|
+
: await client.createSpace(opts.space);
|
|
56
|
+
try {
|
|
57
|
+
const fileBuffer = fs.readFileSync(filePath);
|
|
58
|
+
const blob = new Blob([fileBuffer], { type: contentType });
|
|
59
|
+
console.log(`Uploading ${filename} (${formatBytes(size)})...`);
|
|
60
|
+
const url = await space.uploadMedia(blob);
|
|
61
|
+
const objectData = {
|
|
62
|
+
type: 'file',
|
|
63
|
+
url,
|
|
64
|
+
filename,
|
|
65
|
+
contentType,
|
|
66
|
+
size,
|
|
67
|
+
uploadedAt: new Date().toISOString(),
|
|
68
|
+
};
|
|
69
|
+
if (opts.message) {
|
|
70
|
+
objectData.comment = opts.message;
|
|
71
|
+
}
|
|
72
|
+
const { object } = await space.createObject({ data: objectData });
|
|
73
|
+
console.log(`Uploaded: ${filename} (${formatBytes(size)})`);
|
|
74
|
+
console.log(`Created object: ${object.id}`);
|
|
75
|
+
console.log(`URL: ${url}`);
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
space.close();
|
|
79
|
+
client.destroy();
|
|
80
|
+
}
|
|
81
|
+
});
|
|
111
82
|
}
|
|
112
83
|
//# sourceMappingURL=media.js.map
|
package/dist/media.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.js","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,aAAa,IAAI,OAAO,CAgBvC"}
|
package/dist/program.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { VERSION } from './constants.js';
|
|
3
|
+
import { registerChat } from './chat.js';
|
|
4
|
+
import { registerMedia } from './media.js';
|
|
5
|
+
import { registerSpace } from './space.js';
|
|
6
|
+
import { registerApp } from './app.js';
|
|
7
|
+
import { registerUser } from './user.js';
|
|
8
|
+
import { registerLogout } from './logout.js';
|
|
9
|
+
export function createProgram() {
|
|
10
|
+
const program = new Command();
|
|
11
|
+
program
|
|
12
|
+
.name('rool')
|
|
13
|
+
.version(VERSION)
|
|
14
|
+
.description('Command-line interface for the Rool platform');
|
|
15
|
+
registerChat(program);
|
|
16
|
+
registerMedia(program);
|
|
17
|
+
registerSpace(program);
|
|
18
|
+
registerApp(program);
|
|
19
|
+
registerUser(program);
|
|
20
|
+
registerLogout(program);
|
|
21
|
+
return program;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=program.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,MAAM,CAAC;SACZ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,8CAA8C,CAAC,CAAC;IAE/D,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,WAAW,CAAC,OAAO,CAAC,CAAC;IACrB,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,cAAc,CAAC,OAAO,CAAC,CAAC;IAExB,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/space.d.ts
CHANGED
package/dist/space.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"space.d.ts","sourceRoot":"","sources":["../src/space.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"space.d.ts","sourceRoot":"","sources":["../src/space.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBzC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyFpD"}
|
package/dist/space.js
CHANGED
|
@@ -1,20 +1,7 @@
|
|
|
1
1
|
import * as readline from 'node:readline';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
function printUsage() {
|
|
6
|
-
console.error('Usage: rool space <command> [options]');
|
|
7
|
-
console.error('');
|
|
8
|
-
console.error('Commands:');
|
|
9
|
-
console.error(' list List all spaces');
|
|
10
|
-
console.error(' create <name> Create a new space');
|
|
11
|
-
console.error(' delete <name> [-y] Delete a space');
|
|
12
|
-
console.error('');
|
|
13
|
-
console.error('Options:');
|
|
14
|
-
console.error(' -u, --url <url> API URL (default: https://api.rool.dev)');
|
|
15
|
-
console.error(' -y, --yes Skip confirmation prompt');
|
|
16
|
-
}
|
|
17
|
-
async function confirm(message) {
|
|
2
|
+
import { getClient } from './client.js';
|
|
3
|
+
import { DEFAULT_API_URL } from './constants.js';
|
|
4
|
+
function confirm(message) {
|
|
18
5
|
const rl = readline.createInterface({
|
|
19
6
|
input: process.stdin,
|
|
20
7
|
output: process.stdout,
|
|
@@ -26,96 +13,105 @@ async function confirm(message) {
|
|
|
26
13
|
});
|
|
27
14
|
});
|
|
28
15
|
}
|
|
29
|
-
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
async
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
16
|
+
export function registerSpace(program) {
|
|
17
|
+
const space = program
|
|
18
|
+
.command('space')
|
|
19
|
+
.description('Manage spaces (list, create, delete)');
|
|
20
|
+
// "rool spaces" alias for "rool space list"
|
|
21
|
+
program
|
|
22
|
+
.command('spaces', { hidden: true })
|
|
23
|
+
.description('List all spaces (alias for "space list")')
|
|
24
|
+
.option('-u, --url <url>', 'API URL', DEFAULT_API_URL)
|
|
25
|
+
.action(async (opts) => {
|
|
26
|
+
await listSpaces(opts.url);
|
|
27
|
+
});
|
|
28
|
+
space
|
|
29
|
+
.command('list')
|
|
30
|
+
.description('List all spaces')
|
|
31
|
+
.option('-u, --url <url>', 'API URL', DEFAULT_API_URL)
|
|
32
|
+
.addHelpText('after', `
|
|
33
|
+
Examples:
|
|
34
|
+
# List your spaces
|
|
35
|
+
$ rool space list`)
|
|
36
|
+
.action(async (opts) => {
|
|
37
|
+
await listSpaces(opts.url);
|
|
38
|
+
});
|
|
39
|
+
space
|
|
40
|
+
.command('create')
|
|
41
|
+
.description('Create a new space')
|
|
42
|
+
.argument('<name>', 'space name')
|
|
43
|
+
.option('-u, --url <url>', 'API URL', DEFAULT_API_URL)
|
|
44
|
+
.addHelpText('after', `
|
|
45
|
+
Examples:
|
|
46
|
+
# Create a new space
|
|
47
|
+
$ rool space create "My New Project"`)
|
|
48
|
+
.action(async (name, opts) => {
|
|
49
|
+
const client = await getClient(opts.url);
|
|
50
|
+
try {
|
|
51
|
+
const newSpace = await client.createSpace(name);
|
|
52
|
+
console.log(`Created space: ${newSpace.id} ${newSpace.name}`);
|
|
53
|
+
newSpace.close();
|
|
47
54
|
}
|
|
48
|
-
|
|
49
|
-
client.destroy();
|
|
50
|
-
}
|
|
51
|
-
async function createSpace(apiUrl, name) {
|
|
52
|
-
const client = await getClient(apiUrl);
|
|
53
|
-
const newSpace = await client.createSpace(name);
|
|
54
|
-
console.log(`Created space: ${newSpace.id} ${newSpace.name}`);
|
|
55
|
-
newSpace.close();
|
|
56
|
-
client.destroy();
|
|
57
|
-
}
|
|
58
|
-
async function deleteSpace(apiUrl, name, skipConfirm) {
|
|
59
|
-
const client = await getClient(apiUrl);
|
|
60
|
-
const list = await client.listSpaces();
|
|
61
|
-
const spaceInfo = list.find(s => s.name === name);
|
|
62
|
-
if (!spaceInfo) {
|
|
63
|
-
console.error(`Space not found: "${name}"`);
|
|
64
|
-
client.destroy();
|
|
65
|
-
process.exit(1);
|
|
66
|
-
}
|
|
67
|
-
if (spaceInfo.role !== 'owner') {
|
|
68
|
-
console.error(`Cannot delete space: you are not the owner (role: ${spaceInfo.role})`);
|
|
69
|
-
client.destroy();
|
|
70
|
-
process.exit(1);
|
|
71
|
-
}
|
|
72
|
-
if (!skipConfirm) {
|
|
73
|
-
const confirmed = await confirm(`Delete space "${name}" (${spaceInfo.id})? This cannot be undone.`);
|
|
74
|
-
if (!confirmed) {
|
|
75
|
-
console.log('Cancelled.');
|
|
55
|
+
finally {
|
|
76
56
|
client.destroy();
|
|
77
|
-
return;
|
|
78
57
|
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
await listSpaces(
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
if (!name) {
|
|
101
|
-
console.error('Usage: rool space create <name>');
|
|
58
|
+
});
|
|
59
|
+
space
|
|
60
|
+
.command('delete')
|
|
61
|
+
.description('Delete a space')
|
|
62
|
+
.argument('<name>', 'space name')
|
|
63
|
+
.option('-y, --yes', 'skip confirmation prompt')
|
|
64
|
+
.option('-u, --url <url>', 'API URL', DEFAULT_API_URL)
|
|
65
|
+
.addHelpText('after', `
|
|
66
|
+
Examples:
|
|
67
|
+
# Delete a space (with confirmation)
|
|
68
|
+
$ rool space delete "Old Project"
|
|
69
|
+
|
|
70
|
+
# Delete without confirmation
|
|
71
|
+
$ rool space delete "Old Project" -y`)
|
|
72
|
+
.action(async (name, opts) => {
|
|
73
|
+
const client = await getClient(opts.url);
|
|
74
|
+
try {
|
|
75
|
+
const list = await client.listSpaces();
|
|
76
|
+
const spaceInfo = list.find(s => s.name === name);
|
|
77
|
+
if (!spaceInfo) {
|
|
78
|
+
console.error(`Space not found: "${name}"`);
|
|
102
79
|
process.exit(1);
|
|
103
80
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
case 'delete': {
|
|
108
|
-
const name = subargs.join(' ');
|
|
109
|
-
if (!name) {
|
|
110
|
-
console.error('Usage: rool space delete <name> [-y]');
|
|
81
|
+
if (spaceInfo.role !== 'owner') {
|
|
82
|
+
console.error(`Cannot delete space: you are not the owner (role: ${spaceInfo.role})`);
|
|
111
83
|
process.exit(1);
|
|
112
84
|
}
|
|
113
|
-
|
|
114
|
-
|
|
85
|
+
if (!opts.yes) {
|
|
86
|
+
const confirmed = await confirm(`Delete space "${name}" (${spaceInfo.id})? This cannot be undone.`);
|
|
87
|
+
if (!confirmed) {
|
|
88
|
+
console.log('Cancelled.');
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
await client.deleteSpace(spaceInfo.id);
|
|
93
|
+
console.log(`Deleted space: ${name}`);
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
client.destroy();
|
|
115
97
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
async function listSpaces(apiUrl) {
|
|
101
|
+
const client = await getClient(apiUrl);
|
|
102
|
+
try {
|
|
103
|
+
const list = await client.listSpaces();
|
|
104
|
+
if (list.length === 0) {
|
|
105
|
+
console.log('No spaces found.');
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
for (const s of list) {
|
|
109
|
+
console.log(`${s.id} ${s.name} (${s.role})`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
client.destroy();
|
|
119
115
|
}
|
|
120
116
|
}
|
|
121
117
|
//# sourceMappingURL=space.js.map
|
package/dist/space.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"space.js","sourceRoot":"","sources":["../src/space.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"space.js","sourceRoot":"","sources":["../src/space.ts"],"names":[],"mappings":"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"}
|
package/dist/user.d.ts
CHANGED
package/dist/user.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../src/user.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../src/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2BnD"}
|