@nexical/cli 0.1.7 → 0.10.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/.github/workflows/deploy.yml +3 -3
- package/README.md +317 -104
- package/dist/chunk-JYASTIIW.js +42 -0
- package/dist/chunk-JYASTIIW.js.map +1 -0
- package/dist/chunk-LZ3YQWAR.js +2204 -0
- package/dist/chunk-LZ3YQWAR.js.map +1 -0
- package/dist/chunk-OKXOCNXP.js +105 -0
- package/dist/chunk-OKXOCNXP.js.map +1 -0
- package/dist/chunk-OYFWMYPG.js +52 -0
- package/dist/chunk-OYFWMYPG.js.map +1 -0
- package/dist/chunk-WKERTCM6.js +74 -0
- package/dist/chunk-WKERTCM6.js.map +1 -0
- package/dist/index.js +32 -5
- package/dist/index.js.map +1 -1
- package/dist/src/commands/init.d.ts +11 -0
- package/dist/src/commands/init.js +88 -0
- package/dist/src/commands/init.js.map +1 -0
- package/dist/src/commands/module/add.d.ts +14 -0
- package/dist/src/commands/module/add.js +136 -0
- package/dist/src/commands/module/add.js.map +1 -0
- package/dist/src/commands/module/list.d.ts +10 -0
- package/dist/src/commands/module/list.js +73 -0
- package/dist/src/commands/module/list.js.map +1 -0
- package/dist/src/commands/module/remove.d.ts +12 -0
- package/dist/src/commands/module/remove.js +71 -0
- package/dist/src/commands/module/remove.js.map +1 -0
- package/dist/src/commands/module/update.d.ts +11 -0
- package/dist/src/commands/module/update.js +52 -0
- package/dist/src/commands/module/update.js.map +1 -0
- package/dist/src/commands/run.d.ts +11 -0
- package/dist/src/commands/run.js +93 -0
- package/dist/src/commands/run.js.map +1 -0
- package/dist/src/utils/discovery.d.ts +13 -0
- package/dist/src/utils/discovery.js +9 -0
- package/dist/src/utils/git.d.ts +16 -0
- package/dist/src/utils/git.js +29 -0
- package/dist/src/utils/git.js.map +1 -0
- package/dist/src/utils/url-resolver.d.ts +15 -0
- package/dist/src/utils/url-resolver.js +9 -0
- package/dist/src/utils/url-resolver.js.map +1 -0
- package/index.ts +29 -5
- package/package.json +33 -31
- package/src/commands/init.ts +85 -0
- package/src/commands/module/add.ts +169 -0
- package/src/commands/module/list.ts +69 -0
- package/src/commands/module/remove.ts +74 -0
- package/src/commands/module/update.ts +50 -0
- package/src/commands/run.ts +98 -0
- package/src/utils/discovery.ts +134 -0
- package/src/utils/git.ts +65 -0
- package/src/utils/url-resolver.ts +57 -0
- package/test/e2e/lifecycle.e2e.test.ts +152 -0
- package/test/integration/commands/init.integration.test.ts +82 -0
- package/test/integration/commands/module.integration.test.ts +144 -0
- package/test/integration/commands/run.integration.test.ts +90 -0
- package/test/integration/utils/command-loading.integration.test.ts +80 -0
- package/test/unit/commands/init.test.ts +153 -0
- package/test/unit/commands/module/add.test.ts +262 -0
- package/test/unit/commands/module/list.test.ts +115 -0
- package/test/unit/commands/module/remove.test.ts +89 -0
- package/test/unit/commands/module/update.test.ts +91 -0
- package/test/unit/commands/run.test.ts +252 -0
- package/test/unit/utils/command-discovery.test.ts +176 -0
- package/test/unit/utils/git.test.ts +152 -0
- package/test/unit/utils/integration-helpers.test.ts +72 -0
- package/test/unit/utils/url-resolver.test.ts +39 -0
- package/test/utils/integration-helpers.ts +66 -0
- package/vitest.e2e.config.ts +0 -1
- package/dist/chunk-JDRAVUKK.js +0 -48
- package/dist/chunk-JDRAVUKK.js.map +0 -1
- package/dist/src/commands/admin/create-user.d.ts +0 -15
- package/dist/src/commands/admin/create-user.js +0 -49
- package/dist/src/commands/admin/create-user.js.map +0 -1
- package/dist/src/commands/branch/create.d.ts +0 -19
- package/dist/src/commands/branch/create.js +0 -59
- package/dist/src/commands/branch/create.js.map +0 -1
- package/dist/src/commands/branch/delete.d.ts +0 -15
- package/dist/src/commands/branch/delete.js +0 -50
- package/dist/src/commands/branch/delete.js.map +0 -1
- package/dist/src/commands/branch/get.d.ts +0 -15
- package/dist/src/commands/branch/get.js +0 -53
- package/dist/src/commands/branch/get.js.map +0 -1
- package/dist/src/commands/branch/list.d.ts +0 -15
- package/dist/src/commands/branch/list.js +0 -51
- package/dist/src/commands/branch/list.js.map +0 -1
- package/dist/src/commands/job/get.d.ts +0 -15
- package/dist/src/commands/job/get.js +0 -62
- package/dist/src/commands/job/get.js.map +0 -1
- package/dist/src/commands/job/list.d.ts +0 -15
- package/dist/src/commands/job/list.js +0 -57
- package/dist/src/commands/job/list.js.map +0 -1
- package/dist/src/commands/job/logs.d.ts +0 -15
- package/dist/src/commands/job/logs.js +0 -67
- package/dist/src/commands/job/logs.js.map +0 -1
- package/dist/src/commands/job/trigger.d.ts +0 -19
- package/dist/src/commands/job/trigger.js +0 -74
- package/dist/src/commands/job/trigger.js.map +0 -1
- package/dist/src/commands/login.d.ts +0 -8
- package/dist/src/commands/login.js +0 -31
- package/dist/src/commands/login.js.map +0 -1
- package/dist/src/commands/project/create.d.ts +0 -24
- package/dist/src/commands/project/create.js +0 -63
- package/dist/src/commands/project/create.js.map +0 -1
- package/dist/src/commands/project/delete.d.ts +0 -20
- package/dist/src/commands/project/delete.js +0 -58
- package/dist/src/commands/project/delete.js.map +0 -1
- package/dist/src/commands/project/get.d.ts +0 -15
- package/dist/src/commands/project/get.js +0 -49
- package/dist/src/commands/project/get.js.map +0 -1
- package/dist/src/commands/project/list.d.ts +0 -15
- package/dist/src/commands/project/list.js +0 -45
- package/dist/src/commands/project/list.js.map +0 -1
- package/dist/src/commands/project/update.d.ts +0 -19
- package/dist/src/commands/project/update.js +0 -66
- package/dist/src/commands/project/update.js.map +0 -1
- package/dist/src/commands/team/create.d.ts +0 -19
- package/dist/src/commands/team/create.js +0 -45
- package/dist/src/commands/team/create.js.map +0 -1
- package/dist/src/commands/team/delete.d.ts +0 -20
- package/dist/src/commands/team/delete.js +0 -52
- package/dist/src/commands/team/delete.js.map +0 -1
- package/dist/src/commands/team/get.d.ts +0 -15
- package/dist/src/commands/team/get.js +0 -42
- package/dist/src/commands/team/get.js.map +0 -1
- package/dist/src/commands/team/list.d.ts +0 -8
- package/dist/src/commands/team/list.js +0 -30
- package/dist/src/commands/team/list.js.map +0 -1
- package/dist/src/commands/team/member/invite.d.ts +0 -20
- package/dist/src/commands/team/member/invite.js +0 -54
- package/dist/src/commands/team/member/invite.js.map +0 -1
- package/dist/src/commands/team/member/remove.d.ts +0 -15
- package/dist/src/commands/team/member/remove.js +0 -43
- package/dist/src/commands/team/member/remove.js.map +0 -1
- package/dist/src/commands/team/update.d.ts +0 -19
- package/dist/src/commands/team/update.js +0 -55
- package/dist/src/commands/team/update.js.map +0 -1
- package/dist/src/commands/token/generate.d.ts +0 -19
- package/dist/src/commands/token/generate.js +0 -48
- package/dist/src/commands/token/generate.js.map +0 -1
- package/dist/src/commands/token/list.d.ts +0 -8
- package/dist/src/commands/token/list.js +0 -31
- package/dist/src/commands/token/list.js.map +0 -1
- package/dist/src/commands/token/revoke.d.ts +0 -15
- package/dist/src/commands/token/revoke.js +0 -38
- package/dist/src/commands/token/revoke.js.map +0 -1
- package/dist/src/commands/whoami.d.ts +0 -8
- package/dist/src/commands/whoami.js +0 -26
- package/dist/src/commands/whoami.js.map +0 -1
- package/dist/src/utils/nexical-client.d.ts +0 -10
- package/dist/src/utils/nexical-client.js +0 -12
- package/src/commands/admin/create-user.ts +0 -46
- package/src/commands/branch/create.ts +0 -57
- package/src/commands/branch/delete.ts +0 -47
- package/src/commands/branch/get.ts +0 -50
- package/src/commands/branch/list.ts +0 -50
- package/src/commands/job/get.ts +0 -59
- package/src/commands/job/list.ts +0 -56
- package/src/commands/job/logs.ts +0 -67
- package/src/commands/job/trigger.ts +0 -73
- package/src/commands/login.ts +0 -31
- package/src/commands/project/create.ts +0 -61
- package/src/commands/project/delete.ts +0 -56
- package/src/commands/project/get.ts +0 -46
- package/src/commands/project/list.ts +0 -44
- package/src/commands/project/update.ts +0 -63
- package/src/commands/team/create.ts +0 -43
- package/src/commands/team/delete.ts +0 -50
- package/src/commands/team/get.ts +0 -39
- package/src/commands/team/list.ts +0 -26
- package/src/commands/team/member/invite.ts +0 -56
- package/src/commands/team/member/remove.ts +0 -40
- package/src/commands/team/update.ts +0 -53
- package/src/commands/token/generate.ts +0 -45
- package/src/commands/token/list.ts +0 -27
- package/src/commands/token/revoke.ts +0 -35
- package/src/commands/whoami.ts +0 -21
- package/src/utils/nexical-client.ts +0 -47
- package/test/e2e/auth.e2e.test.ts +0 -46
- package/test/e2e/job-workflow.e2e.test.ts +0 -33
- package/test/e2e/project-lifecycle.e2e.test.ts +0 -48
- package/test/e2e/setup.ts +0 -237
- package/test/e2e/utils.ts +0 -33
- package/test/integration/commands/admin/create-user.test.ts +0 -51
- package/test/integration/commands/branch/create.test.ts +0 -51
- package/test/integration/commands/branch/delete.test.ts +0 -43
- package/test/integration/commands/branch/get.test.ts +0 -49
- package/test/integration/commands/branch/list.test.ts +0 -47
- package/test/integration/commands/job/get.test.ts +0 -54
- package/test/integration/commands/job/list.test.ts +0 -47
- package/test/integration/commands/job/logs.test.ts +0 -47
- package/test/integration/commands/job/trigger.test.ts +0 -57
- package/test/integration/commands/login.test.ts +0 -62
- package/test/integration/commands/project/create.test.ts +0 -53
- package/test/integration/commands/project/delete.test.ts +0 -43
- package/test/integration/commands/project/get.test.ts +0 -51
- package/test/integration/commands/project/list.test.ts +0 -47
- package/test/integration/commands/project/update.test.ts +0 -53
- package/test/integration/commands/team/create.test.ts +0 -53
- package/test/integration/commands/team/delete.test.ts +0 -43
- package/test/integration/commands/team/get.test.ts +0 -50
- package/test/integration/commands/team/list.test.ts +0 -47
- package/test/integration/commands/team/member/invite.test.ts +0 -46
- package/test/integration/commands/team/member/remove.test.ts +0 -43
- package/test/integration/commands/team/update.test.ts +0 -50
- package/test/integration/commands/token/generate.test.ts +0 -51
- package/test/integration/commands/token/list.test.ts +0 -47
- package/test/integration/commands/token/revoke.test.ts +0 -43
- package/test/integration/commands/whoami.test.ts +0 -49
- package/test/unit/commands/admin/create-user.test.ts +0 -51
- package/test/unit/commands/branch/create.test.ts +0 -57
- package/test/unit/commands/branch/delete.test.ts +0 -49
- package/test/unit/commands/branch/get.test.ts +0 -67
- package/test/unit/commands/branch/list.test.ts +0 -62
- package/test/unit/commands/job/get.test.ts +0 -76
- package/test/unit/commands/job/list.test.ts +0 -62
- package/test/unit/commands/job/logs.test.ts +0 -60
- package/test/unit/commands/job/trigger.test.ts +0 -75
- package/test/unit/commands/login.test.ts +0 -64
- package/test/unit/commands/project/create.test.ts +0 -64
- package/test/unit/commands/project/delete.test.ts +0 -72
- package/test/unit/commands/project/get.test.ts +0 -73
- package/test/unit/commands/project/list.test.ts +0 -62
- package/test/unit/commands/project/update.test.ts +0 -58
- package/test/unit/commands/team/create.test.ts +0 -68
- package/test/unit/commands/team/delete.test.ts +0 -71
- package/test/unit/commands/team/get.test.ts +0 -70
- package/test/unit/commands/team/list.test.ts +0 -56
- package/test/unit/commands/team/member/invite.test.ts +0 -52
- package/test/unit/commands/team/member/remove.test.ts +0 -49
- package/test/unit/commands/team/update.test.ts +0 -63
- package/test/unit/commands/token/generate.test.ts +0 -65
- package/test/unit/commands/token/list.test.ts +0 -58
- package/test/unit/commands/token/revoke.test.ts +0 -49
- package/test/unit/commands/whoami.test.ts +0 -49
- package/test/unit/utils/nexical-client.test.ts +0 -113
- /package/dist/src/utils/{nexical-client.js.map → discovery.js.map} +0 -0
package/src/commands/login.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { BaseCommand } from '@nexical/cli-core';
|
|
3
|
-
import { getClient, saveToken } from '../utils/nexical-client.js';
|
|
4
|
-
|
|
5
|
-
export default class LoginCommand extends BaseCommand {
|
|
6
|
-
static description = 'Authenticate with Nexical via Device Flow';
|
|
7
|
-
|
|
8
|
-
async run() {
|
|
9
|
-
const client = getClient();
|
|
10
|
-
|
|
11
|
-
this.info('Starting device authentication...');
|
|
12
|
-
|
|
13
|
-
try {
|
|
14
|
-
const token = await client.auth.authenticateDevice('nexical-cli', (userCode, verificationUri) => {
|
|
15
|
-
this.notice(`Please visit: ${verificationUri}`);
|
|
16
|
-
this.notice(`And enter code: ${userCode}`);
|
|
17
|
-
|
|
18
|
-
// Optionally, we could try to open the browser here
|
|
19
|
-
// import open from 'open'; open(verificationUri);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
saveToken(token);
|
|
23
|
-
client.setToken(token);
|
|
24
|
-
|
|
25
|
-
const user = await client.users.me();
|
|
26
|
-
this.success(`Successfully logged in as ${user.fullName} (${user.email})`);
|
|
27
|
-
} catch (error: any) {
|
|
28
|
-
this.error(`Login failed: ${error.message}`);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { BaseCommand } from '@nexical/cli-core';
|
|
3
|
-
import { getClient } from '../../utils/nexical-client.js';
|
|
4
|
-
|
|
5
|
-
export default class ProjectsCreateCommand extends BaseCommand {
|
|
6
|
-
static description = 'Create a new project';
|
|
7
|
-
|
|
8
|
-
static args = {
|
|
9
|
-
args: [
|
|
10
|
-
{
|
|
11
|
-
name: 'teamId',
|
|
12
|
-
required: true,
|
|
13
|
-
description: 'ID of the team',
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
name: 'name',
|
|
17
|
-
required: true,
|
|
18
|
-
description: 'Name of the project',
|
|
19
|
-
},
|
|
20
|
-
],
|
|
21
|
-
options: [
|
|
22
|
-
{
|
|
23
|
-
name: '--repo <url>',
|
|
24
|
-
description: 'Repository URL',
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
name: '--prod <url>',
|
|
28
|
-
description: 'Production URL',
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
name: '--mode <mode>',
|
|
32
|
-
description: 'Mode (managed, self_hosted)',
|
|
33
|
-
default: 'managed',
|
|
34
|
-
},
|
|
35
|
-
],
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
async run(options: any) {
|
|
39
|
-
const client = getClient();
|
|
40
|
-
const { teamId, name, repo, prod, mode } = options;
|
|
41
|
-
const tid = parseInt(teamId, 10);
|
|
42
|
-
|
|
43
|
-
if (isNaN(tid)) {
|
|
44
|
-
this.error('Team ID must be a number.');
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
try {
|
|
49
|
-
const project = await client.projects.create(tid, {
|
|
50
|
-
name,
|
|
51
|
-
repoUrl: repo,
|
|
52
|
-
productionUrl: prod
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
this.success(`Project "${project.name}" set up successfully!`);
|
|
56
|
-
this.info(`ID: ${project.id}`);
|
|
57
|
-
} catch (error: any) {
|
|
58
|
-
this.error(`Failed to create project: ${error.message}`);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { BaseCommand } from '@nexical/cli-core';
|
|
3
|
-
import { getClient } from '../../utils/nexical-client.js';
|
|
4
|
-
|
|
5
|
-
export default class ProjectsDeleteCommand extends BaseCommand {
|
|
6
|
-
static description = 'Delete a project';
|
|
7
|
-
|
|
8
|
-
static args = {
|
|
9
|
-
args: [
|
|
10
|
-
{
|
|
11
|
-
name: 'teamId',
|
|
12
|
-
required: true,
|
|
13
|
-
description: 'Team ID',
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
name: 'projectId',
|
|
17
|
-
required: true,
|
|
18
|
-
description: 'Project ID',
|
|
19
|
-
},
|
|
20
|
-
],
|
|
21
|
-
options: [
|
|
22
|
-
{
|
|
23
|
-
name: '--confirm',
|
|
24
|
-
description: 'Skip confirmation',
|
|
25
|
-
default: false,
|
|
26
|
-
},
|
|
27
|
-
],
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
async run(options: any) {
|
|
31
|
-
const client = getClient();
|
|
32
|
-
const { teamId, projectId, confirm } = options;
|
|
33
|
-
const tid = parseInt(teamId, 10);
|
|
34
|
-
const pid = parseInt(projectId, 10);
|
|
35
|
-
|
|
36
|
-
if (isNaN(tid) || isNaN(pid)) {
|
|
37
|
-
this.error('IDs must be numbers.');
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
if (!confirm) {
|
|
42
|
-
const answer = await this.prompt(`Are you sure you want to delete project ${pid}? (yes/no)`);
|
|
43
|
-
if (answer.toLowerCase() !== 'yes') {
|
|
44
|
-
this.info('Aborted.');
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
try {
|
|
50
|
-
await client.projects.delete(tid, pid);
|
|
51
|
-
this.success(`Project ${pid} deleted.`);
|
|
52
|
-
} catch (error: any) {
|
|
53
|
-
this.error(`Failed to delete project: ${error.message}`);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { BaseCommand } from '@nexical/cli-core';
|
|
3
|
-
import { getClient } from '../../utils/nexical-client.js';
|
|
4
|
-
|
|
5
|
-
export default class ProjectsGetCommand extends BaseCommand {
|
|
6
|
-
static description = 'Get project details';
|
|
7
|
-
|
|
8
|
-
static args = {
|
|
9
|
-
args: [
|
|
10
|
-
{
|
|
11
|
-
name: 'teamId',
|
|
12
|
-
required: true,
|
|
13
|
-
description: 'Team ID',
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
name: 'projectId',
|
|
17
|
-
required: true,
|
|
18
|
-
description: 'Project ID',
|
|
19
|
-
},
|
|
20
|
-
],
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
async run(options: any) {
|
|
24
|
-
const client = getClient();
|
|
25
|
-
const { teamId, projectId } = options;
|
|
26
|
-
const tid = parseInt(teamId, 10);
|
|
27
|
-
const pid = parseInt(projectId, 10);
|
|
28
|
-
|
|
29
|
-
if (isNaN(tid) || isNaN(pid)) {
|
|
30
|
-
this.error('IDs must be numbers.');
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
try {
|
|
35
|
-
const project = await client.projects.get(tid, pid);
|
|
36
|
-
this.info(`Project Details:`);
|
|
37
|
-
this.info(` ID: ${project.id}`);
|
|
38
|
-
this.info(` Name: ${project.name}`);
|
|
39
|
-
this.info(` Repo: ${project.repoUrl || 'N/A'}`);
|
|
40
|
-
this.info(` Prod: ${project.productionUrl || 'N/A'}`);
|
|
41
|
-
this.info(` Mode: ${project.mode}`);
|
|
42
|
-
} catch (error: any) {
|
|
43
|
-
this.error(`Failed to get project: ${error.message}`);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { BaseCommand } from '@nexical/cli-core';
|
|
3
|
-
import { getClient } from '../../utils/nexical-client.js';
|
|
4
|
-
|
|
5
|
-
export default class ProjectsListCommand extends BaseCommand {
|
|
6
|
-
static description = 'List projects in a team';
|
|
7
|
-
|
|
8
|
-
static args = {
|
|
9
|
-
args: [
|
|
10
|
-
{
|
|
11
|
-
name: 'teamId',
|
|
12
|
-
required: true,
|
|
13
|
-
description: 'ID of the team',
|
|
14
|
-
},
|
|
15
|
-
],
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
async run(options: any) {
|
|
19
|
-
const client = getClient();
|
|
20
|
-
const { teamId } = options;
|
|
21
|
-
const tid = parseInt(teamId, 10);
|
|
22
|
-
|
|
23
|
-
if (isNaN(tid)) {
|
|
24
|
-
this.error('Team ID must be a number.');
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
try {
|
|
29
|
-
const projects = await client.projects.list(tid);
|
|
30
|
-
|
|
31
|
-
if (projects.length === 0) {
|
|
32
|
-
this.info(`No projects found in team ${tid}.`);
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
this.info(`Projects in Team ${tid}:`);
|
|
37
|
-
for (const project of projects) {
|
|
38
|
-
this.info(`- ${project.name} (ID: ${project.id}) [${project.repoUrl || 'No Repo'}]`);
|
|
39
|
-
}
|
|
40
|
-
} catch (error: any) {
|
|
41
|
-
this.error(`Failed to list projects: ${error.message}`);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { BaseCommand } from '@nexical/cli-core';
|
|
3
|
-
import { getClient } from '../../utils/nexical-client.js';
|
|
4
|
-
|
|
5
|
-
export default class ProjectsUpdateCommand extends BaseCommand {
|
|
6
|
-
static description = 'Update project details';
|
|
7
|
-
|
|
8
|
-
static args = {
|
|
9
|
-
args: [
|
|
10
|
-
{
|
|
11
|
-
name: 'teamId',
|
|
12
|
-
required: true,
|
|
13
|
-
description: 'Team ID',
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
name: 'projectId',
|
|
17
|
-
required: true,
|
|
18
|
-
description: 'Project ID',
|
|
19
|
-
},
|
|
20
|
-
],
|
|
21
|
-
options: [
|
|
22
|
-
{
|
|
23
|
-
name: '--name <name>',
|
|
24
|
-
description: 'New name',
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
name: '--repo <url>',
|
|
28
|
-
description: 'New repo URL',
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
name: '--prod <url>',
|
|
32
|
-
description: 'New production URL',
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
name: '--mode <mode>',
|
|
36
|
-
description: 'New mode',
|
|
37
|
-
},
|
|
38
|
-
],
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
async run(options: any) {
|
|
42
|
-
const client = getClient();
|
|
43
|
-
const { teamId, projectId, name, repo, prod, mode } = options;
|
|
44
|
-
const tid = parseInt(teamId, 10);
|
|
45
|
-
const pid = parseInt(projectId, 10);
|
|
46
|
-
|
|
47
|
-
if (isNaN(tid) || isNaN(pid)) {
|
|
48
|
-
this.error('IDs must be numbers.');
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
try {
|
|
53
|
-
const project = await client.projects.update(tid, pid, {
|
|
54
|
-
name,
|
|
55
|
-
repoUrl: repo,
|
|
56
|
-
productionUrl: prod,
|
|
57
|
-
});
|
|
58
|
-
this.success(`Project ${project.id} updated!`);
|
|
59
|
-
} catch (error: any) {
|
|
60
|
-
this.error(`Failed to update project: ${error.message}`);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { BaseCommand } from '@nexical/cli-core';
|
|
3
|
-
import { getClient } from '../../utils/nexical-client.js';
|
|
4
|
-
|
|
5
|
-
export default class TeamsCreateCommand extends BaseCommand {
|
|
6
|
-
static description = 'Create a new team';
|
|
7
|
-
|
|
8
|
-
static args = {
|
|
9
|
-
args: [
|
|
10
|
-
{
|
|
11
|
-
name: 'name',
|
|
12
|
-
required: true,
|
|
13
|
-
description: 'Name of the team',
|
|
14
|
-
},
|
|
15
|
-
],
|
|
16
|
-
options: [
|
|
17
|
-
{
|
|
18
|
-
name: '--slug <slug>',
|
|
19
|
-
description: 'Custom URL slug for the team',
|
|
20
|
-
},
|
|
21
|
-
],
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
async run(options: any) {
|
|
25
|
-
const client = getClient();
|
|
26
|
-
const { name, slug } = options;
|
|
27
|
-
// Generate slug from name if not provided (simple version)
|
|
28
|
-
const finalSlug = slug || name.toLowerCase().replace(/[^a-z0-9]+/g, '-');
|
|
29
|
-
|
|
30
|
-
try {
|
|
31
|
-
const team = await client.teams.create({
|
|
32
|
-
name,
|
|
33
|
-
slug: finalSlug,
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
this.success(`Team "${team.name}" created successfully!`);
|
|
37
|
-
this.info(`ID: ${team.id}`);
|
|
38
|
-
this.info(`Slug: ${team.slug}`);
|
|
39
|
-
} catch (error: any) {
|
|
40
|
-
this.error(`Failed to create team: ${error.message}`);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { BaseCommand } from '@nexical/cli-core';
|
|
3
|
-
import { getClient } from '../../utils/nexical-client.js';
|
|
4
|
-
|
|
5
|
-
export default class TeamsDeleteCommand extends BaseCommand {
|
|
6
|
-
static description = 'Delete a team';
|
|
7
|
-
|
|
8
|
-
static args = {
|
|
9
|
-
args: [
|
|
10
|
-
{
|
|
11
|
-
name: 'teamId',
|
|
12
|
-
required: true,
|
|
13
|
-
description: 'Team ID',
|
|
14
|
-
},
|
|
15
|
-
],
|
|
16
|
-
options: [
|
|
17
|
-
{
|
|
18
|
-
name: '--confirm',
|
|
19
|
-
description: 'Skip confirmation',
|
|
20
|
-
default: false,
|
|
21
|
-
},
|
|
22
|
-
],
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
async run(options: any) {
|
|
26
|
-
const client = getClient();
|
|
27
|
-
const { teamId, confirm } = options;
|
|
28
|
-
const tid = parseInt(teamId, 10);
|
|
29
|
-
|
|
30
|
-
if (isNaN(tid)) {
|
|
31
|
-
this.error('Team ID must be a number.');
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
if (!confirm) {
|
|
36
|
-
const answer = await this.prompt(`Are you sure you want to delete team ${tid}? (yes/no)`);
|
|
37
|
-
if (answer.toLowerCase() !== 'yes') {
|
|
38
|
-
this.info('Aborted.');
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
try {
|
|
44
|
-
await client.teams.delete(tid);
|
|
45
|
-
this.success(`Team ${tid} deleted.`);
|
|
46
|
-
} catch (error: any) {
|
|
47
|
-
this.error(`Failed to delete team: ${error.message}`);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
package/src/commands/team/get.ts
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { BaseCommand } from '@nexical/cli-core';
|
|
3
|
-
import { getClient } from '../../utils/nexical-client.js';
|
|
4
|
-
|
|
5
|
-
export default class TeamsGetCommand extends BaseCommand {
|
|
6
|
-
static description = 'Get team details';
|
|
7
|
-
|
|
8
|
-
static args = {
|
|
9
|
-
args: [
|
|
10
|
-
{
|
|
11
|
-
name: 'teamId',
|
|
12
|
-
required: true,
|
|
13
|
-
description: 'Team ID',
|
|
14
|
-
},
|
|
15
|
-
],
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
async run(options: any) {
|
|
19
|
-
const client = getClient();
|
|
20
|
-
const { teamId } = options;
|
|
21
|
-
const tid = parseInt(teamId, 10);
|
|
22
|
-
|
|
23
|
-
if (isNaN(tid)) {
|
|
24
|
-
this.error('Team ID must be a number.');
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
try {
|
|
29
|
-
const team = await client.teams.get(tid);
|
|
30
|
-
this.info(`Team Details:`);
|
|
31
|
-
this.info(` ID: ${team.id}`);
|
|
32
|
-
this.info(` Name: ${team.name}`);
|
|
33
|
-
this.info(` Slug: ${team.slug}`);
|
|
34
|
-
this.info(` Role: ${team.role || 'member'}`);
|
|
35
|
-
} catch (error: any) {
|
|
36
|
-
this.error(`Failed to get team: ${error.message}`);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { BaseCommand } from '@nexical/cli-core';
|
|
3
|
-
import { getClient } from '../../utils/nexical-client.js';
|
|
4
|
-
|
|
5
|
-
export default class TeamsListCommand extends BaseCommand {
|
|
6
|
-
static description = 'List all teams you belong to';
|
|
7
|
-
|
|
8
|
-
async run() {
|
|
9
|
-
const client = getClient();
|
|
10
|
-
try {
|
|
11
|
-
const teams = await client.teams.list();
|
|
12
|
-
|
|
13
|
-
if (teams.length === 0) {
|
|
14
|
-
this.info('You are not a member of any teams.');
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
this.info('Your Teams:');
|
|
19
|
-
for (const team of teams) {
|
|
20
|
-
this.info(`- ${team.name} (${team.slug}) [${team.role || 'member'}]`);
|
|
21
|
-
}
|
|
22
|
-
} catch (error: any) {
|
|
23
|
-
this.error(`Failed to list teams: ${error.message}`);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { BaseCommand } from '@nexical/cli-core';
|
|
3
|
-
import { getClient } from '../../../utils/nexical-client.js';
|
|
4
|
-
|
|
5
|
-
export default class TeamsInviteCommand extends BaseCommand {
|
|
6
|
-
static description = 'Invite a user to a team';
|
|
7
|
-
|
|
8
|
-
static args = {
|
|
9
|
-
args: [
|
|
10
|
-
{
|
|
11
|
-
name: 'teamId',
|
|
12
|
-
required: true,
|
|
13
|
-
description: 'ID of the team',
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
name: 'email',
|
|
17
|
-
required: true,
|
|
18
|
-
description: 'Email of the user to invite',
|
|
19
|
-
},
|
|
20
|
-
],
|
|
21
|
-
options: [
|
|
22
|
-
{
|
|
23
|
-
name: '--role <role>',
|
|
24
|
-
description: 'Role for the new member (admin, member)',
|
|
25
|
-
default: 'member',
|
|
26
|
-
},
|
|
27
|
-
],
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
async run(options: any) {
|
|
31
|
-
const client = getClient();
|
|
32
|
-
const { teamId, email, role } = options;
|
|
33
|
-
|
|
34
|
-
try {
|
|
35
|
-
// teamId from args is string, but SDK expects number usually?
|
|
36
|
-
// Docs say: Team { id: number; ... }
|
|
37
|
-
// SDK methods: inviteMember(id, data)
|
|
38
|
-
// BaseCommand options are typically strings from CLI args.
|
|
39
|
-
// I should parse teamId to number.
|
|
40
|
-
const tid = parseInt(teamId, 10);
|
|
41
|
-
if (isNaN(tid)) {
|
|
42
|
-
this.error('Team ID must be a number.');
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
await client.teams.inviteMember(tid, {
|
|
47
|
-
email,
|
|
48
|
-
role: role as any, // Cast to expected enum if needed
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
this.success(`Invited ${email} to team ${tid} as ${role}.`);
|
|
52
|
-
} catch (error: any) {
|
|
53
|
-
this.error(`Failed to invite member: ${error.message}`);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { BaseCommand } from '@nexical/cli-core';
|
|
3
|
-
import { getClient } from '../../../utils/nexical-client.js';
|
|
4
|
-
|
|
5
|
-
export default class TeamsMembersRemoveCommand extends BaseCommand {
|
|
6
|
-
static description = 'Remove a member from a team';
|
|
7
|
-
|
|
8
|
-
static args = {
|
|
9
|
-
args: [
|
|
10
|
-
{
|
|
11
|
-
name: 'teamId',
|
|
12
|
-
required: true,
|
|
13
|
-
description: 'Team ID',
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
name: 'userId',
|
|
17
|
-
required: true,
|
|
18
|
-
description: 'User ID (UUID)',
|
|
19
|
-
},
|
|
20
|
-
],
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
async run(options: any) {
|
|
24
|
-
const client = getClient();
|
|
25
|
-
const { teamId, userId } = options;
|
|
26
|
-
const tid = parseInt(teamId, 10);
|
|
27
|
-
|
|
28
|
-
if (isNaN(tid)) {
|
|
29
|
-
this.error('Team ID must be a number.');
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
try {
|
|
34
|
-
await client.teams.removeMember(tid, userId);
|
|
35
|
-
this.success(`User ${userId} removed from team ${tid}.`);
|
|
36
|
-
} catch (error: any) {
|
|
37
|
-
this.error(`Failed to remove member: ${error.message}`);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { BaseCommand } from '@nexical/cli-core';
|
|
3
|
-
import { getClient } from '../../utils/nexical-client.js';
|
|
4
|
-
|
|
5
|
-
export default class TeamsUpdateCommand extends BaseCommand {
|
|
6
|
-
static description = 'Update team details';
|
|
7
|
-
|
|
8
|
-
static args = {
|
|
9
|
-
args: [
|
|
10
|
-
{
|
|
11
|
-
name: 'teamId',
|
|
12
|
-
required: true,
|
|
13
|
-
description: 'Team ID',
|
|
14
|
-
},
|
|
15
|
-
],
|
|
16
|
-
options: [
|
|
17
|
-
{
|
|
18
|
-
name: '--name <name>',
|
|
19
|
-
description: 'New name',
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
name: '--slug <slug>',
|
|
23
|
-
description: 'New slug',
|
|
24
|
-
},
|
|
25
|
-
],
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
async run(options: any) {
|
|
29
|
-
const client = getClient();
|
|
30
|
-
const { teamId, name, slug } = options;
|
|
31
|
-
const tid = parseInt(teamId, 10);
|
|
32
|
-
|
|
33
|
-
if (isNaN(tid)) {
|
|
34
|
-
this.error('Team ID must be a number.');
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (!name && !slug) {
|
|
39
|
-
this.warn('No updates provided. Use --name or --slug.');
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
try {
|
|
44
|
-
const team = await client.teams.update(tid, {
|
|
45
|
-
name,
|
|
46
|
-
});
|
|
47
|
-
this.success(`Team ${team.id} updated!`);
|
|
48
|
-
this.info(`Name: ${team.name}`);
|
|
49
|
-
} catch (error: any) {
|
|
50
|
-
this.error(`Failed to update team: ${error.message}`);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { BaseCommand } from '@nexical/cli-core';
|
|
3
|
-
import { getClient } from '../../utils/nexical-client.js';
|
|
4
|
-
|
|
5
|
-
export default class AuthTokensGenerateCommand extends BaseCommand {
|
|
6
|
-
static description = 'Generate a new API token';
|
|
7
|
-
|
|
8
|
-
static args = {
|
|
9
|
-
args: [
|
|
10
|
-
{
|
|
11
|
-
name: 'name',
|
|
12
|
-
required: true,
|
|
13
|
-
description: 'Name of the token',
|
|
14
|
-
},
|
|
15
|
-
],
|
|
16
|
-
options: [
|
|
17
|
-
{
|
|
18
|
-
name: '--scopes <scopes>',
|
|
19
|
-
description: 'Comma-separated list of scopes',
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
name: '--expires <isoDate>',
|
|
23
|
-
description: 'Expiration date (ISO 8601)',
|
|
24
|
-
},
|
|
25
|
-
],
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
async run(options: any) {
|
|
29
|
-
const client = getClient();
|
|
30
|
-
const { name, scopes, expires } = options;
|
|
31
|
-
|
|
32
|
-
try {
|
|
33
|
-
const token = await client.auth.generateToken({
|
|
34
|
-
name,
|
|
35
|
-
scopes: scopes ? scopes.split(',') : undefined,
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
this.success(`Token "${name}" generated!`);
|
|
39
|
-
this.warn(`Token: ${token.token}`);
|
|
40
|
-
this.warn('Make sure to copy it now. You won\'t be able to see it again!');
|
|
41
|
-
} catch (error: any) {
|
|
42
|
-
this.error(`Failed to generate token: ${error.message}`);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { BaseCommand } from '@nexical/cli-core';
|
|
3
|
-
import { getClient } from '../../utils/nexical-client.js';
|
|
4
|
-
|
|
5
|
-
export default class AuthTokensListCommand extends BaseCommand {
|
|
6
|
-
static description = 'List your API tokens';
|
|
7
|
-
|
|
8
|
-
async run() {
|
|
9
|
-
const client = getClient();
|
|
10
|
-
try {
|
|
11
|
-
const response = await client.auth.listTokens();
|
|
12
|
-
const tokens = response.tokens;
|
|
13
|
-
|
|
14
|
-
if (tokens.length === 0) {
|
|
15
|
-
this.info('No API tokens found.');
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
this.info('Your API Tokens:');
|
|
20
|
-
for (const token of tokens) {
|
|
21
|
-
this.info(`- ${token.name} (${token.tokenPrefix}...) [Expires: ${token.expiresAt || 'Never'}]`);
|
|
22
|
-
}
|
|
23
|
-
} catch (error: any) {
|
|
24
|
-
this.error(`Failed to list tokens: ${error.message}`);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}
|