@rool-dev/cli 0.1.9 → 0.1.10-dev.930dc5c
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 +42 -10
- package/dist/app.d.ts +3 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +138 -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 +42 -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 +22 -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 +59 -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 +79 -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 +24 -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/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,62 @@ 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
|
-
console.error('');
|
|
31
|
-
console.error('Examples:');
|
|
32
|
-
console.error(' rool media upload photo.jpg');
|
|
33
|
-
console.error(' rool media upload report.pdf -m "Q4 sales report"');
|
|
34
|
-
console.error(' rool media upload logo.png -s "My Project"');
|
|
35
|
-
}
|
|
36
|
-
async function getClient(apiUrl) {
|
|
37
|
-
const authProvider = new NodeAuthProvider();
|
|
38
|
-
const client = new RoolClient({ baseUrl: apiUrl, authProvider });
|
|
39
|
-
if (!await client.isAuthenticated()) {
|
|
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
|
+
.action(async (filePath, opts) => {
|
|
27
|
+
if (!fs.existsSync(filePath)) {
|
|
28
|
+
console.error(`File not found: ${filePath}`);
|
|
29
|
+
process.exit(1);
|
|
91
30
|
}
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
31
|
+
const stats = fs.statSync(filePath);
|
|
32
|
+
if (!stats.isFile()) {
|
|
33
|
+
console.error(`Not a file: ${filePath}`);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
const filename = path.basename(filePath);
|
|
37
|
+
const contentType = getContentType(filePath);
|
|
38
|
+
const size = stats.size;
|
|
39
|
+
const client = await getClient(opts.url);
|
|
40
|
+
// Find or create space by name
|
|
41
|
+
const spaces = await client.listSpaces();
|
|
42
|
+
const spaceInfo = spaces.find(s => s.name === opts.space);
|
|
43
|
+
const space = spaceInfo
|
|
44
|
+
? await client.openSpace(spaceInfo.id)
|
|
45
|
+
: await client.createSpace(opts.space);
|
|
46
|
+
try {
|
|
47
|
+
const fileBuffer = fs.readFileSync(filePath);
|
|
48
|
+
const blob = new Blob([fileBuffer], { type: contentType });
|
|
49
|
+
console.log(`Uploading ${filename} (${formatBytes(size)})...`);
|
|
50
|
+
const url = await space.uploadMedia(blob);
|
|
51
|
+
const objectData = {
|
|
52
|
+
type: 'file',
|
|
53
|
+
url,
|
|
54
|
+
filename,
|
|
55
|
+
contentType,
|
|
56
|
+
size,
|
|
57
|
+
uploadedAt: new Date().toISOString(),
|
|
58
|
+
};
|
|
59
|
+
if (opts.message) {
|
|
60
|
+
objectData.comment = opts.message;
|
|
61
|
+
}
|
|
62
|
+
const { object } = await space.createObject({ data: objectData });
|
|
63
|
+
console.log(`Uploaded: ${filename} (${formatBytes(size)})`);
|
|
64
|
+
console.log(`Created object: ${object.id}`);
|
|
65
|
+
console.log(`URL: ${url}`);
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
space.close();
|
|
69
|
+
client.destroy();
|
|
70
|
+
}
|
|
71
|
+
});
|
|
111
72
|
}
|
|
112
73
|
//# 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,CA0EpD"}
|
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,90 @@ 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
|
+
.action(async (opts) => {
|
|
33
|
+
await listSpaces(opts.url);
|
|
34
|
+
});
|
|
35
|
+
space
|
|
36
|
+
.command('create')
|
|
37
|
+
.description('Create a new space')
|
|
38
|
+
.argument('<name>', 'space name')
|
|
39
|
+
.option('-u, --url <url>', 'API URL', DEFAULT_API_URL)
|
|
40
|
+
.action(async (name, opts) => {
|
|
41
|
+
const client = await getClient(opts.url);
|
|
42
|
+
try {
|
|
43
|
+
const newSpace = await client.createSpace(name);
|
|
44
|
+
console.log(`Created space: ${newSpace.id} ${newSpace.name}`);
|
|
45
|
+
newSpace.close();
|
|
47
46
|
}
|
|
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.');
|
|
47
|
+
finally {
|
|
76
48
|
client.destroy();
|
|
77
|
-
return;
|
|
78
49
|
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
switch (subcommand) {
|
|
94
|
-
case 'list':
|
|
95
|
-
case undefined:
|
|
96
|
-
await listSpaces(apiUrl);
|
|
97
|
-
break;
|
|
98
|
-
case 'create': {
|
|
99
|
-
const name = subargs.join(' ');
|
|
100
|
-
if (!name) {
|
|
101
|
-
console.error('Usage: rool space create <name>');
|
|
50
|
+
});
|
|
51
|
+
space
|
|
52
|
+
.command('delete')
|
|
53
|
+
.description('Delete a space')
|
|
54
|
+
.argument('<name>', 'space name')
|
|
55
|
+
.option('-y, --yes', 'skip confirmation prompt')
|
|
56
|
+
.option('-u, --url <url>', 'API URL', DEFAULT_API_URL)
|
|
57
|
+
.action(async (name, opts) => {
|
|
58
|
+
const client = await getClient(opts.url);
|
|
59
|
+
try {
|
|
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}"`);
|
|
102
64
|
process.exit(1);
|
|
103
65
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
case 'delete': {
|
|
108
|
-
const name = subargs.join(' ');
|
|
109
|
-
if (!name) {
|
|
110
|
-
console.error('Usage: rool space delete <name> [-y]');
|
|
66
|
+
if (spaceInfo.role !== 'owner') {
|
|
67
|
+
console.error(`Cannot delete space: you are not the owner (role: ${spaceInfo.role})`);
|
|
111
68
|
process.exit(1);
|
|
112
69
|
}
|
|
113
|
-
|
|
114
|
-
|
|
70
|
+
if (!opts.yes) {
|
|
71
|
+
const confirmed = await confirm(`Delete space "${name}" (${spaceInfo.id})? This cannot be undone.`);
|
|
72
|
+
if (!confirmed) {
|
|
73
|
+
console.log('Cancelled.');
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
await client.deleteSpace(spaceInfo.id);
|
|
78
|
+
console.log(`Deleted space: ${name}`);
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
client.destroy();
|
|
115
82
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
async function listSpaces(apiUrl) {
|
|
86
|
+
const client = await getClient(apiUrl);
|
|
87
|
+
try {
|
|
88
|
+
const list = await client.listSpaces();
|
|
89
|
+
if (list.length === 0) {
|
|
90
|
+
console.log('No spaces found.');
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
for (const s of list) {
|
|
94
|
+
console.log(`${s.id} ${s.name} (${s.role})`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
client.destroy();
|
|
119
100
|
}
|
|
120
101
|
}
|
|
121
102
|
//# 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,CAuBnD"}
|
package/dist/user.js
CHANGED
|
@@ -1,27 +1,26 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
client.destroy();
|
|
1
|
+
import { getClient } from './client.js';
|
|
2
|
+
import { DEFAULT_API_URL } from './constants.js';
|
|
3
|
+
export function registerUser(program) {
|
|
4
|
+
program
|
|
5
|
+
.command('user')
|
|
6
|
+
.description('Show current user info')
|
|
7
|
+
.option('-u, --url <url>', 'API URL', DEFAULT_API_URL)
|
|
8
|
+
.action(async (opts) => {
|
|
9
|
+
const client = await getClient(opts.url, { autoLogin: false });
|
|
10
|
+
try {
|
|
11
|
+
if (!await client.isAuthenticated()) {
|
|
12
|
+
console.log('Not logged in.');
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
const currentUser = await client.getCurrentUser();
|
|
16
|
+
console.log(`Email: ${currentUser.email}`);
|
|
17
|
+
console.log(`Name: ${currentUser.name ?? '(not set)'}`);
|
|
18
|
+
console.log(`Plan: ${currentUser.plan}`);
|
|
19
|
+
console.log(`Credits: ${currentUser.creditsBalance}`);
|
|
20
|
+
}
|
|
21
|
+
finally {
|
|
22
|
+
client.destroy();
|
|
23
|
+
}
|
|
24
|
+
});
|
|
26
25
|
}
|
|
27
26
|
//# sourceMappingURL=user.js.map
|
package/dist/user.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.js","sourceRoot":"","sources":["../src/user.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../src/user.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,iBAAiB,EAAE,SAAS,EAAE,eAAe,CAAC;SACrD,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;gBAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;YAElD,OAAO,CAAC,GAAG,CAAC,YAAY,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,YAAY,WAAW,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,YAAY,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,YAAY,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC;QACxD,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rool-dev/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.10-dev.930dc5c",
|
|
4
4
|
"description": "Command-line interface for working with Rool Spaces",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -34,20 +34,23 @@
|
|
|
34
34
|
"license": "MIT",
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"archiver": "^7.0.1",
|
|
37
|
+
"commander": "^14.0.3",
|
|
37
38
|
"marked": "^15.0.12",
|
|
38
39
|
"marked-terminal": "^7.3.0",
|
|
39
|
-
"@rool-dev/sdk": "0.1.
|
|
40
|
+
"@rool-dev/sdk": "0.1.11"
|
|
40
41
|
},
|
|
41
42
|
"devDependencies": {
|
|
42
43
|
"@types/archiver": "^7.0.0",
|
|
43
44
|
"@types/marked-terminal": "^6.1.1",
|
|
44
45
|
"@types/node": "^25.0.2",
|
|
46
|
+
"tsx": "^4.21.0",
|
|
45
47
|
"typescript": "^5.9.3"
|
|
46
48
|
},
|
|
47
49
|
"scripts": {
|
|
48
50
|
"build": "tsc",
|
|
49
51
|
"dev": "tsc --watch",
|
|
50
52
|
"typecheck": "tsc --noEmit",
|
|
53
|
+
"generate-readme": "tsc && tsx scripts/generate-readme.ts",
|
|
51
54
|
"clean": "rm -rf dist"
|
|
52
55
|
}
|
|
53
56
|
}
|
package/dist/args.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export interface CommonArgs {
|
|
2
|
-
space: string;
|
|
3
|
-
conversation: string;
|
|
4
|
-
url: string;
|
|
5
|
-
message: string | undefined;
|
|
6
|
-
}
|
|
7
|
-
export interface ParsedArgs extends CommonArgs {
|
|
8
|
-
rest: string[];
|
|
9
|
-
}
|
|
10
|
-
export declare function parseArgs(args: string[]): ParsedArgs;
|
|
11
|
-
export declare function printCommonOptions(): void;
|
|
12
|
-
//# sourceMappingURL=args.d.ts.map
|
package/dist/args.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,UAAW,SAAQ,UAAU;IAC5C,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAaD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA6BpD;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC"}
|