@nexical/cli 0.1.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.
Files changed (178) hide show
  1. package/.github/workflows/deploy.yml +34 -0
  2. package/LICENSE +201 -0
  3. package/README.md +183 -0
  4. package/dist/chunk-FDJVHO4O.js +41 -0
  5. package/dist/chunk-FDJVHO4O.js.map +1 -0
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.js +15 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/src/commands/admin/create-user.d.ts +15 -0
  10. package/dist/src/commands/admin/create-user.js +49 -0
  11. package/dist/src/commands/admin/create-user.js.map +1 -0
  12. package/dist/src/commands/branch/create.d.ts +19 -0
  13. package/dist/src/commands/branch/create.js +59 -0
  14. package/dist/src/commands/branch/create.js.map +1 -0
  15. package/dist/src/commands/branch/delete.d.ts +15 -0
  16. package/dist/src/commands/branch/delete.js +50 -0
  17. package/dist/src/commands/branch/delete.js.map +1 -0
  18. package/dist/src/commands/branch/get.d.ts +15 -0
  19. package/dist/src/commands/branch/get.js +53 -0
  20. package/dist/src/commands/branch/get.js.map +1 -0
  21. package/dist/src/commands/branch/list.d.ts +15 -0
  22. package/dist/src/commands/branch/list.js +51 -0
  23. package/dist/src/commands/branch/list.js.map +1 -0
  24. package/dist/src/commands/job/get.d.ts +15 -0
  25. package/dist/src/commands/job/get.js +62 -0
  26. package/dist/src/commands/job/get.js.map +1 -0
  27. package/dist/src/commands/job/list.d.ts +15 -0
  28. package/dist/src/commands/job/list.js +57 -0
  29. package/dist/src/commands/job/list.js.map +1 -0
  30. package/dist/src/commands/job/logs.d.ts +15 -0
  31. package/dist/src/commands/job/logs.js +67 -0
  32. package/dist/src/commands/job/logs.js.map +1 -0
  33. package/dist/src/commands/job/trigger.d.ts +19 -0
  34. package/dist/src/commands/job/trigger.js +74 -0
  35. package/dist/src/commands/job/trigger.js.map +1 -0
  36. package/dist/src/commands/login.d.ts +8 -0
  37. package/dist/src/commands/login.js +31 -0
  38. package/dist/src/commands/login.js.map +1 -0
  39. package/dist/src/commands/project/create.d.ts +24 -0
  40. package/dist/src/commands/project/create.js +63 -0
  41. package/dist/src/commands/project/create.js.map +1 -0
  42. package/dist/src/commands/project/delete.d.ts +20 -0
  43. package/dist/src/commands/project/delete.js +58 -0
  44. package/dist/src/commands/project/delete.js.map +1 -0
  45. package/dist/src/commands/project/get.d.ts +15 -0
  46. package/dist/src/commands/project/get.js +49 -0
  47. package/dist/src/commands/project/get.js.map +1 -0
  48. package/dist/src/commands/project/list.d.ts +15 -0
  49. package/dist/src/commands/project/list.js +45 -0
  50. package/dist/src/commands/project/list.js.map +1 -0
  51. package/dist/src/commands/project/update.d.ts +19 -0
  52. package/dist/src/commands/project/update.js +66 -0
  53. package/dist/src/commands/project/update.js.map +1 -0
  54. package/dist/src/commands/team/create.d.ts +19 -0
  55. package/dist/src/commands/team/create.js +45 -0
  56. package/dist/src/commands/team/create.js.map +1 -0
  57. package/dist/src/commands/team/delete.d.ts +20 -0
  58. package/dist/src/commands/team/delete.js +52 -0
  59. package/dist/src/commands/team/delete.js.map +1 -0
  60. package/dist/src/commands/team/get.d.ts +15 -0
  61. package/dist/src/commands/team/get.js +42 -0
  62. package/dist/src/commands/team/get.js.map +1 -0
  63. package/dist/src/commands/team/list.d.ts +8 -0
  64. package/dist/src/commands/team/list.js +30 -0
  65. package/dist/src/commands/team/list.js.map +1 -0
  66. package/dist/src/commands/team/member/invite.d.ts +20 -0
  67. package/dist/src/commands/team/member/invite.js +54 -0
  68. package/dist/src/commands/team/member/invite.js.map +1 -0
  69. package/dist/src/commands/team/member/remove.d.ts +15 -0
  70. package/dist/src/commands/team/member/remove.js +43 -0
  71. package/dist/src/commands/team/member/remove.js.map +1 -0
  72. package/dist/src/commands/team/update.d.ts +19 -0
  73. package/dist/src/commands/team/update.js +55 -0
  74. package/dist/src/commands/team/update.js.map +1 -0
  75. package/dist/src/commands/token/generate.d.ts +19 -0
  76. package/dist/src/commands/token/generate.js +48 -0
  77. package/dist/src/commands/token/generate.js.map +1 -0
  78. package/dist/src/commands/token/list.d.ts +8 -0
  79. package/dist/src/commands/token/list.js +31 -0
  80. package/dist/src/commands/token/list.js.map +1 -0
  81. package/dist/src/commands/token/revoke.d.ts +15 -0
  82. package/dist/src/commands/token/revoke.js +38 -0
  83. package/dist/src/commands/token/revoke.js.map +1 -0
  84. package/dist/src/commands/whoami.d.ts +8 -0
  85. package/dist/src/commands/whoami.js +26 -0
  86. package/dist/src/commands/whoami.js.map +1 -0
  87. package/dist/src/utils/nexical-client.d.ts +10 -0
  88. package/dist/src/utils/nexical-client.js +12 -0
  89. package/dist/src/utils/nexical-client.js.map +1 -0
  90. package/index.ts +14 -0
  91. package/package.json +32 -0
  92. package/src/commands/admin/create-user.ts +46 -0
  93. package/src/commands/branch/create.ts +57 -0
  94. package/src/commands/branch/delete.ts +47 -0
  95. package/src/commands/branch/get.ts +50 -0
  96. package/src/commands/branch/list.ts +50 -0
  97. package/src/commands/job/get.ts +59 -0
  98. package/src/commands/job/list.ts +56 -0
  99. package/src/commands/job/logs.ts +67 -0
  100. package/src/commands/job/trigger.ts +73 -0
  101. package/src/commands/login.ts +31 -0
  102. package/src/commands/project/create.ts +61 -0
  103. package/src/commands/project/delete.ts +56 -0
  104. package/src/commands/project/get.ts +46 -0
  105. package/src/commands/project/list.ts +44 -0
  106. package/src/commands/project/update.ts +63 -0
  107. package/src/commands/team/create.ts +43 -0
  108. package/src/commands/team/delete.ts +50 -0
  109. package/src/commands/team/get.ts +39 -0
  110. package/src/commands/team/list.ts +26 -0
  111. package/src/commands/team/member/invite.ts +56 -0
  112. package/src/commands/team/member/remove.ts +40 -0
  113. package/src/commands/team/update.ts +53 -0
  114. package/src/commands/token/generate.ts +45 -0
  115. package/src/commands/token/list.ts +27 -0
  116. package/src/commands/token/revoke.ts +35 -0
  117. package/src/commands/whoami.ts +21 -0
  118. package/src/utils/nexical-client.ts +40 -0
  119. package/test/e2e/.gitkeep +0 -0
  120. package/test/integration/commands/admin/create-user.test.ts +51 -0
  121. package/test/integration/commands/branch/create.test.ts +51 -0
  122. package/test/integration/commands/branch/delete.test.ts +43 -0
  123. package/test/integration/commands/branch/get.test.ts +49 -0
  124. package/test/integration/commands/branch/list.test.ts +47 -0
  125. package/test/integration/commands/job/get.test.ts +54 -0
  126. package/test/integration/commands/job/list.test.ts +47 -0
  127. package/test/integration/commands/job/logs.test.ts +47 -0
  128. package/test/integration/commands/job/trigger.test.ts +57 -0
  129. package/test/integration/commands/login.test.ts +62 -0
  130. package/test/integration/commands/project/create.test.ts +53 -0
  131. package/test/integration/commands/project/delete.test.ts +43 -0
  132. package/test/integration/commands/project/get.test.ts +51 -0
  133. package/test/integration/commands/project/list.test.ts +47 -0
  134. package/test/integration/commands/project/update.test.ts +53 -0
  135. package/test/integration/commands/team/create.test.ts +53 -0
  136. package/test/integration/commands/team/delete.test.ts +43 -0
  137. package/test/integration/commands/team/get.test.ts +50 -0
  138. package/test/integration/commands/team/list.test.ts +47 -0
  139. package/test/integration/commands/team/member/invite.test.ts +46 -0
  140. package/test/integration/commands/team/member/remove.test.ts +43 -0
  141. package/test/integration/commands/team/update.test.ts +50 -0
  142. package/test/integration/commands/token/generate.test.ts +51 -0
  143. package/test/integration/commands/token/list.test.ts +47 -0
  144. package/test/integration/commands/token/revoke.test.ts +43 -0
  145. package/test/integration/commands/whoami.test.ts +49 -0
  146. package/test/unit/commands/admin/create-user.test.ts +51 -0
  147. package/test/unit/commands/branch/create.test.ts +57 -0
  148. package/test/unit/commands/branch/delete.test.ts +49 -0
  149. package/test/unit/commands/branch/get.test.ts +67 -0
  150. package/test/unit/commands/branch/list.test.ts +62 -0
  151. package/test/unit/commands/job/get.test.ts +76 -0
  152. package/test/unit/commands/job/list.test.ts +62 -0
  153. package/test/unit/commands/job/logs.test.ts +60 -0
  154. package/test/unit/commands/job/trigger.test.ts +75 -0
  155. package/test/unit/commands/login.test.ts +64 -0
  156. package/test/unit/commands/project/create.test.ts +64 -0
  157. package/test/unit/commands/project/delete.test.ts +72 -0
  158. package/test/unit/commands/project/get.test.ts +73 -0
  159. package/test/unit/commands/project/list.test.ts +62 -0
  160. package/test/unit/commands/project/update.test.ts +58 -0
  161. package/test/unit/commands/team/create.test.ts +68 -0
  162. package/test/unit/commands/team/delete.test.ts +71 -0
  163. package/test/unit/commands/team/get.test.ts +70 -0
  164. package/test/unit/commands/team/list.test.ts +56 -0
  165. package/test/unit/commands/team/member/invite.test.ts +52 -0
  166. package/test/unit/commands/team/member/remove.test.ts +49 -0
  167. package/test/unit/commands/team/update.test.ts +63 -0
  168. package/test/unit/commands/token/generate.test.ts +65 -0
  169. package/test/unit/commands/token/list.test.ts +58 -0
  170. package/test/unit/commands/token/revoke.test.ts +49 -0
  171. package/test/unit/commands/whoami.test.ts +49 -0
  172. package/test/unit/utils/nexical-client.test.ts +98 -0
  173. package/test/utils/integration-helpers.ts +22 -0
  174. package/tsconfig.json +26 -0
  175. package/tsup.config.ts +18 -0
  176. package/vitest.config.ts +15 -0
  177. package/vitest.e2e.config.ts +10 -0
  178. package/vitest.integration.config.ts +22 -0
@@ -0,0 +1,20 @@
1
+ import { BaseCommand } from '@nexical/cli-core';
2
+
3
+ declare class TeamsInviteCommand extends BaseCommand {
4
+ static description: string;
5
+ static args: {
6
+ args: {
7
+ name: string;
8
+ required: boolean;
9
+ description: string;
10
+ }[];
11
+ options: {
12
+ name: string;
13
+ description: string;
14
+ default: string;
15
+ }[];
16
+ };
17
+ run(options: any): Promise<void>;
18
+ }
19
+
20
+ export { TeamsInviteCommand as default };
@@ -0,0 +1,54 @@
1
+ import { createRequire } from "module"; const require = createRequire(import.meta.url);
2
+ import {
3
+ getClient
4
+ } from "../../../../chunk-FDJVHO4O.js";
5
+
6
+ // src/commands/team/member/invite.ts
7
+ import { BaseCommand } from "@nexical/cli-core";
8
+ var TeamsInviteCommand = class extends BaseCommand {
9
+ static description = "Invite a user to a team";
10
+ static args = {
11
+ args: [
12
+ {
13
+ name: "teamId",
14
+ required: true,
15
+ description: "ID of the team"
16
+ },
17
+ {
18
+ name: "email",
19
+ required: true,
20
+ description: "Email of the user to invite"
21
+ }
22
+ ],
23
+ options: [
24
+ {
25
+ name: "--role <role>",
26
+ description: "Role for the new member (admin, member)",
27
+ default: "member"
28
+ }
29
+ ]
30
+ };
31
+ async run(options) {
32
+ const client = getClient();
33
+ const { teamId, email, role } = options;
34
+ try {
35
+ const tid = parseInt(teamId, 10);
36
+ if (isNaN(tid)) {
37
+ this.error("Team ID must be a number.");
38
+ return;
39
+ }
40
+ await client.teams.inviteMember(tid, {
41
+ email,
42
+ role
43
+ // Cast to expected enum if needed
44
+ });
45
+ this.success(`Invited ${email} to team ${tid} as ${role}.`);
46
+ } catch (error) {
47
+ this.error(`Failed to invite member: ${error.message}`);
48
+ }
49
+ }
50
+ };
51
+ export {
52
+ TeamsInviteCommand as default
53
+ };
54
+ //# sourceMappingURL=invite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/commands/team/member/invite.ts"],"sourcesContent":["\nimport { BaseCommand } from '@nexical/cli-core';\nimport { getClient } from '../../../utils/nexical-client.js';\n\nexport default class TeamsInviteCommand extends BaseCommand {\n static description = 'Invite a user to a team';\n\n static args = {\n args: [\n {\n name: 'teamId',\n required: true,\n description: 'ID of the team',\n },\n {\n name: 'email',\n required: true,\n description: 'Email of the user to invite',\n },\n ],\n options: [\n {\n name: '--role <role>',\n description: 'Role for the new member (admin, member)',\n default: 'member',\n },\n ],\n };\n\n async run(options: any) {\n const client = getClient();\n const { teamId, email, role } = options;\n\n try {\n // teamId from args is string, but SDK expects number usually?\n // Docs say: Team { id: number; ... }\n // SDK methods: inviteMember(id, data)\n // BaseCommand options are typically strings from CLI args.\n // I should parse teamId to number.\n const tid = parseInt(teamId, 10);\n if (isNaN(tid)) {\n this.error('Team ID must be a number.');\n return;\n }\n\n await client.teams.inviteMember(tid, {\n email,\n role: role as any, // Cast to expected enum if needed\n });\n\n this.success(`Invited ${email} to team ${tid} as ${role}.`);\n } catch (error: any) {\n this.error(`Failed to invite member: ${error.message}`);\n }\n }\n}\n"],"mappings":";;;;;;AACA,SAAS,mBAAmB;AAG5B,IAAqB,qBAArB,cAAgD,YAAY;AAAA,EACxD,OAAO,cAAc;AAAA,EAErB,OAAO,OAAO;AAAA,IACV,MAAM;AAAA,MACF;AAAA,QACI,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,QACI,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,MACL;AAAA,QACI,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,MACb;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,IAAI,SAAc;AACpB,UAAM,SAAS,UAAU;AACzB,UAAM,EAAE,QAAQ,OAAO,KAAK,IAAI;AAEhC,QAAI;AAMA,YAAM,MAAM,SAAS,QAAQ,EAAE;AAC/B,UAAI,MAAM,GAAG,GAAG;AACZ,aAAK,MAAM,2BAA2B;AACtC;AAAA,MACJ;AAEA,YAAM,OAAO,MAAM,aAAa,KAAK;AAAA,QACjC;AAAA,QACA;AAAA;AAAA,MACJ,CAAC;AAED,WAAK,QAAQ,WAAW,KAAK,YAAY,GAAG,OAAO,IAAI,GAAG;AAAA,IAC9D,SAAS,OAAY;AACjB,WAAK,MAAM,4BAA4B,MAAM,OAAO,EAAE;AAAA,IAC1D;AAAA,EACJ;AACJ;","names":[]}
@@ -0,0 +1,15 @@
1
+ import { BaseCommand } from '@nexical/cli-core';
2
+
3
+ declare class TeamsMembersRemoveCommand extends BaseCommand {
4
+ static description: string;
5
+ static args: {
6
+ args: {
7
+ name: string;
8
+ required: boolean;
9
+ description: string;
10
+ }[];
11
+ };
12
+ run(options: any): Promise<void>;
13
+ }
14
+
15
+ export { TeamsMembersRemoveCommand as default };
@@ -0,0 +1,43 @@
1
+ import { createRequire } from "module"; const require = createRequire(import.meta.url);
2
+ import {
3
+ getClient
4
+ } from "../../../../chunk-FDJVHO4O.js";
5
+
6
+ // src/commands/team/member/remove.ts
7
+ import { BaseCommand } from "@nexical/cli-core";
8
+ var TeamsMembersRemoveCommand = class extends BaseCommand {
9
+ static description = "Remove a member from a team";
10
+ static args = {
11
+ args: [
12
+ {
13
+ name: "teamId",
14
+ required: true,
15
+ description: "Team ID"
16
+ },
17
+ {
18
+ name: "userId",
19
+ required: true,
20
+ description: "User ID (UUID)"
21
+ }
22
+ ]
23
+ };
24
+ async run(options) {
25
+ const client = getClient();
26
+ const { teamId, userId } = options;
27
+ const tid = parseInt(teamId, 10);
28
+ if (isNaN(tid)) {
29
+ this.error("Team ID must be a number.");
30
+ return;
31
+ }
32
+ try {
33
+ await client.teams.removeMember(tid, userId);
34
+ this.success(`User ${userId} removed from team ${tid}.`);
35
+ } catch (error) {
36
+ this.error(`Failed to remove member: ${error.message}`);
37
+ }
38
+ }
39
+ };
40
+ export {
41
+ TeamsMembersRemoveCommand as default
42
+ };
43
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/commands/team/member/remove.ts"],"sourcesContent":["\nimport { BaseCommand } from '@nexical/cli-core';\nimport { getClient } from '../../../utils/nexical-client.js';\n\nexport default class TeamsMembersRemoveCommand extends BaseCommand {\n static description = 'Remove a member from a team';\n\n static args = {\n args: [\n {\n name: 'teamId',\n required: true,\n description: 'Team ID',\n },\n {\n name: 'userId',\n required: true,\n description: 'User ID (UUID)',\n },\n ],\n };\n\n async run(options: any) {\n const client = getClient();\n const { teamId, userId } = options;\n const tid = parseInt(teamId, 10);\n\n if (isNaN(tid)) {\n this.error('Team ID must be a number.');\n return;\n }\n\n try {\n await client.teams.removeMember(tid, userId);\n this.success(`User ${userId} removed from team ${tid}.`);\n } catch (error: any) {\n this.error(`Failed to remove member: ${error.message}`);\n }\n }\n}\n"],"mappings":";;;;;;AACA,SAAS,mBAAmB;AAG5B,IAAqB,4BAArB,cAAuD,YAAY;AAAA,EAC/D,OAAO,cAAc;AAAA,EAErB,OAAO,OAAO;AAAA,IACV,MAAM;AAAA,MACF;AAAA,QACI,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,QACI,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,IAAI,SAAc;AACpB,UAAM,SAAS,UAAU;AACzB,UAAM,EAAE,QAAQ,OAAO,IAAI;AAC3B,UAAM,MAAM,SAAS,QAAQ,EAAE;AAE/B,QAAI,MAAM,GAAG,GAAG;AACZ,WAAK,MAAM,2BAA2B;AACtC;AAAA,IACJ;AAEA,QAAI;AACA,YAAM,OAAO,MAAM,aAAa,KAAK,MAAM;AAC3C,WAAK,QAAQ,QAAQ,MAAM,sBAAsB,GAAG,GAAG;AAAA,IAC3D,SAAS,OAAY;AACjB,WAAK,MAAM,4BAA4B,MAAM,OAAO,EAAE;AAAA,IAC1D;AAAA,EACJ;AACJ;","names":[]}
@@ -0,0 +1,19 @@
1
+ import { BaseCommand } from '@nexical/cli-core';
2
+
3
+ declare class TeamsUpdateCommand extends BaseCommand {
4
+ static description: string;
5
+ static args: {
6
+ args: {
7
+ name: string;
8
+ required: boolean;
9
+ description: string;
10
+ }[];
11
+ options: {
12
+ name: string;
13
+ description: string;
14
+ }[];
15
+ };
16
+ run(options: any): Promise<void>;
17
+ }
18
+
19
+ export { TeamsUpdateCommand as default };
@@ -0,0 +1,55 @@
1
+ import { createRequire } from "module"; const require = createRequire(import.meta.url);
2
+ import {
3
+ getClient
4
+ } from "../../../chunk-FDJVHO4O.js";
5
+
6
+ // src/commands/team/update.ts
7
+ import { BaseCommand } from "@nexical/cli-core";
8
+ var TeamsUpdateCommand = class extends BaseCommand {
9
+ static description = "Update team details";
10
+ static args = {
11
+ args: [
12
+ {
13
+ name: "teamId",
14
+ required: true,
15
+ description: "Team ID"
16
+ }
17
+ ],
18
+ options: [
19
+ {
20
+ name: "--name <name>",
21
+ description: "New name"
22
+ },
23
+ {
24
+ name: "--slug <slug>",
25
+ description: "New slug"
26
+ }
27
+ ]
28
+ };
29
+ async run(options) {
30
+ const client = getClient();
31
+ const { teamId, name, slug } = options;
32
+ const tid = parseInt(teamId, 10);
33
+ if (isNaN(tid)) {
34
+ this.error("Team ID must be a number.");
35
+ return;
36
+ }
37
+ if (!name && !slug) {
38
+ this.warn("No updates provided. Use --name or --slug.");
39
+ return;
40
+ }
41
+ try {
42
+ const team = await client.teams.update(tid, {
43
+ name
44
+ });
45
+ this.success(`Team ${team.id} updated!`);
46
+ this.info(`Name: ${team.name}`);
47
+ } catch (error) {
48
+ this.error(`Failed to update team: ${error.message}`);
49
+ }
50
+ }
51
+ };
52
+ export {
53
+ TeamsUpdateCommand as default
54
+ };
55
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/commands/team/update.ts"],"sourcesContent":["\nimport { BaseCommand } from '@nexical/cli-core';\nimport { getClient } from '../../utils/nexical-client.js';\n\nexport default class TeamsUpdateCommand extends BaseCommand {\n static description = 'Update team details';\n\n static args = {\n args: [\n {\n name: 'teamId',\n required: true,\n description: 'Team ID',\n },\n ],\n options: [\n {\n name: '--name <name>',\n description: 'New name',\n },\n {\n name: '--slug <slug>',\n description: 'New slug',\n },\n ],\n };\n\n async run(options: any) {\n const client = getClient();\n const { teamId, name, slug } = options;\n const tid = parseInt(teamId, 10);\n\n if (isNaN(tid)) {\n this.error('Team ID must be a number.');\n return;\n }\n\n if (!name && !slug) {\n this.warn('No updates provided. Use --name or --slug.');\n return;\n }\n\n try {\n const team = await client.teams.update(tid, {\n name,\n });\n this.success(`Team ${team.id} updated!`);\n this.info(`Name: ${team.name}`);\n } catch (error: any) {\n this.error(`Failed to update team: ${error.message}`);\n }\n }\n}\n"],"mappings":";;;;;;AACA,SAAS,mBAAmB;AAG5B,IAAqB,qBAArB,cAAgD,YAAY;AAAA,EACxD,OAAO,cAAc;AAAA,EAErB,OAAO,OAAO;AAAA,IACV,MAAM;AAAA,MACF;AAAA,QACI,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,MACL;AAAA,QACI,MAAM;AAAA,QACN,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,QACI,MAAM;AAAA,QACN,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,IAAI,SAAc;AACpB,UAAM,SAAS,UAAU;AACzB,UAAM,EAAE,QAAQ,MAAM,KAAK,IAAI;AAC/B,UAAM,MAAM,SAAS,QAAQ,EAAE;AAE/B,QAAI,MAAM,GAAG,GAAG;AACZ,WAAK,MAAM,2BAA2B;AACtC;AAAA,IACJ;AAEA,QAAI,CAAC,QAAQ,CAAC,MAAM;AAChB,WAAK,KAAK,4CAA4C;AACtD;AAAA,IACJ;AAEA,QAAI;AACA,YAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK;AAAA,QACxC;AAAA,MACJ,CAAC;AACD,WAAK,QAAQ,QAAQ,KAAK,EAAE,WAAW;AACvC,WAAK,KAAK,SAAS,KAAK,IAAI,EAAE;AAAA,IAClC,SAAS,OAAY;AACjB,WAAK,MAAM,0BAA0B,MAAM,OAAO,EAAE;AAAA,IACxD;AAAA,EACJ;AACJ;","names":[]}
@@ -0,0 +1,19 @@
1
+ import { BaseCommand } from '@nexical/cli-core';
2
+
3
+ declare class AuthTokensGenerateCommand extends BaseCommand {
4
+ static description: string;
5
+ static args: {
6
+ args: {
7
+ name: string;
8
+ required: boolean;
9
+ description: string;
10
+ }[];
11
+ options: {
12
+ name: string;
13
+ description: string;
14
+ }[];
15
+ };
16
+ run(options: any): Promise<void>;
17
+ }
18
+
19
+ export { AuthTokensGenerateCommand as default };
@@ -0,0 +1,48 @@
1
+ import { createRequire } from "module"; const require = createRequire(import.meta.url);
2
+ import {
3
+ getClient
4
+ } from "../../../chunk-FDJVHO4O.js";
5
+
6
+ // src/commands/token/generate.ts
7
+ import { BaseCommand } from "@nexical/cli-core";
8
+ var AuthTokensGenerateCommand = class extends BaseCommand {
9
+ static description = "Generate a new API token";
10
+ static args = {
11
+ args: [
12
+ {
13
+ name: "name",
14
+ required: true,
15
+ description: "Name of the token"
16
+ }
17
+ ],
18
+ options: [
19
+ {
20
+ name: "--scopes <scopes>",
21
+ description: "Comma-separated list of scopes"
22
+ },
23
+ {
24
+ name: "--expires <isoDate>",
25
+ description: "Expiration date (ISO 8601)"
26
+ }
27
+ ]
28
+ };
29
+ async run(options) {
30
+ const client = getClient();
31
+ const { name, scopes, expires } = options;
32
+ try {
33
+ const token = await client.auth.generateToken({
34
+ name,
35
+ scopes: scopes ? scopes.split(",") : void 0
36
+ });
37
+ this.success(`Token "${name}" generated!`);
38
+ this.warn(`Token: ${token.token}`);
39
+ this.warn("Make sure to copy it now. You won't be able to see it again!");
40
+ } catch (error) {
41
+ this.error(`Failed to generate token: ${error.message}`);
42
+ }
43
+ }
44
+ };
45
+ export {
46
+ AuthTokensGenerateCommand as default
47
+ };
48
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/commands/token/generate.ts"],"sourcesContent":["\nimport { BaseCommand } from '@nexical/cli-core';\nimport { getClient } from '../../utils/nexical-client.js';\n\nexport default class AuthTokensGenerateCommand extends BaseCommand {\n static description = 'Generate a new API token';\n\n static args = {\n args: [\n {\n name: 'name',\n required: true,\n description: 'Name of the token',\n },\n ],\n options: [\n {\n name: '--scopes <scopes>',\n description: 'Comma-separated list of scopes',\n },\n {\n name: '--expires <isoDate>',\n description: 'Expiration date (ISO 8601)',\n },\n ],\n };\n\n async run(options: any) {\n const client = getClient();\n const { name, scopes, expires } = options;\n\n try {\n const token = await client.auth.generateToken({\n name,\n scopes: scopes ? scopes.split(',') : undefined,\n });\n\n this.success(`Token \"${name}\" generated!`);\n this.warn(`Token: ${token.token}`);\n this.warn('Make sure to copy it now. You won\\'t be able to see it again!');\n } catch (error: any) {\n this.error(`Failed to generate token: ${error.message}`);\n }\n }\n}\n"],"mappings":";;;;;;AACA,SAAS,mBAAmB;AAG5B,IAAqB,4BAArB,cAAuD,YAAY;AAAA,EAC/D,OAAO,cAAc;AAAA,EAErB,OAAO,OAAO;AAAA,IACV,MAAM;AAAA,MACF;AAAA,QACI,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,MACL;AAAA,QACI,MAAM;AAAA,QACN,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,QACI,MAAM;AAAA,QACN,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,IAAI,SAAc;AACpB,UAAM,SAAS,UAAU;AACzB,UAAM,EAAE,MAAM,QAAQ,QAAQ,IAAI;AAElC,QAAI;AACA,YAAM,QAAQ,MAAM,OAAO,KAAK,cAAc;AAAA,QAC1C;AAAA,QACA,QAAQ,SAAS,OAAO,MAAM,GAAG,IAAI;AAAA,MACzC,CAAC;AAED,WAAK,QAAQ,UAAU,IAAI,cAAc;AACzC,WAAK,KAAK,UAAU,MAAM,KAAK,EAAE;AACjC,WAAK,KAAK,8DAA+D;AAAA,IAC7E,SAAS,OAAY;AACjB,WAAK,MAAM,6BAA6B,MAAM,OAAO,EAAE;AAAA,IAC3D;AAAA,EACJ;AACJ;","names":[]}
@@ -0,0 +1,8 @@
1
+ import { BaseCommand } from '@nexical/cli-core';
2
+
3
+ declare class AuthTokensListCommand extends BaseCommand {
4
+ static description: string;
5
+ run(): Promise<void>;
6
+ }
7
+
8
+ export { AuthTokensListCommand as default };
@@ -0,0 +1,31 @@
1
+ import { createRequire } from "module"; const require = createRequire(import.meta.url);
2
+ import {
3
+ getClient
4
+ } from "../../../chunk-FDJVHO4O.js";
5
+
6
+ // src/commands/token/list.ts
7
+ import { BaseCommand } from "@nexical/cli-core";
8
+ var AuthTokensListCommand = class extends BaseCommand {
9
+ static description = "List your API tokens";
10
+ async run() {
11
+ const client = getClient();
12
+ try {
13
+ const response = await client.auth.listTokens();
14
+ const tokens = response.tokens;
15
+ if (tokens.length === 0) {
16
+ this.info("No API tokens found.");
17
+ return;
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) {
24
+ this.error(`Failed to list tokens: ${error.message}`);
25
+ }
26
+ }
27
+ };
28
+ export {
29
+ AuthTokensListCommand as default
30
+ };
31
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/commands/token/list.ts"],"sourcesContent":["\nimport { BaseCommand } from '@nexical/cli-core';\nimport { getClient } from '../../utils/nexical-client.js';\n\nexport default class AuthTokensListCommand extends BaseCommand {\n static description = 'List your API tokens';\n\n async run() {\n const client = getClient();\n try {\n const response = await client.auth.listTokens();\n const tokens = response.tokens;\n\n if (tokens.length === 0) {\n this.info('No API tokens found.');\n return;\n }\n\n this.info('Your API Tokens:');\n for (const token of tokens) {\n this.info(`- ${token.name} (${token.tokenPrefix}...) [Expires: ${token.expiresAt || 'Never'}]`);\n }\n } catch (error: any) {\n this.error(`Failed to list tokens: ${error.message}`);\n }\n }\n}\n"],"mappings":";;;;;;AACA,SAAS,mBAAmB;AAG5B,IAAqB,wBAArB,cAAmD,YAAY;AAAA,EAC3D,OAAO,cAAc;AAAA,EAErB,MAAM,MAAM;AACR,UAAM,SAAS,UAAU;AACzB,QAAI;AACA,YAAM,WAAW,MAAM,OAAO,KAAK,WAAW;AAC9C,YAAM,SAAS,SAAS;AAExB,UAAI,OAAO,WAAW,GAAG;AACrB,aAAK,KAAK,sBAAsB;AAChC;AAAA,MACJ;AAEA,WAAK,KAAK,kBAAkB;AAC5B,iBAAW,SAAS,QAAQ;AACxB,aAAK,KAAK,KAAK,MAAM,IAAI,KAAK,MAAM,WAAW,kBAAkB,MAAM,aAAa,OAAO,GAAG;AAAA,MAClG;AAAA,IACJ,SAAS,OAAY;AACjB,WAAK,MAAM,0BAA0B,MAAM,OAAO,EAAE;AAAA,IACxD;AAAA,EACJ;AACJ;","names":[]}
@@ -0,0 +1,15 @@
1
+ import { BaseCommand } from '@nexical/cli-core';
2
+
3
+ declare class AuthTokensRevokeCommand extends BaseCommand {
4
+ static description: string;
5
+ static args: {
6
+ args: {
7
+ name: string;
8
+ required: boolean;
9
+ description: string;
10
+ }[];
11
+ };
12
+ run(options: any): Promise<void>;
13
+ }
14
+
15
+ export { AuthTokensRevokeCommand as default };
@@ -0,0 +1,38 @@
1
+ import { createRequire } from "module"; const require = createRequire(import.meta.url);
2
+ import {
3
+ getClient
4
+ } from "../../../chunk-FDJVHO4O.js";
5
+
6
+ // src/commands/token/revoke.ts
7
+ import { BaseCommand } from "@nexical/cli-core";
8
+ var AuthTokensRevokeCommand = class extends BaseCommand {
9
+ static description = "Revoke an API token";
10
+ static args = {
11
+ args: [
12
+ {
13
+ name: "id",
14
+ required: true,
15
+ description: "ID of the token to revoke"
16
+ }
17
+ ]
18
+ };
19
+ async run(options) {
20
+ const client = getClient();
21
+ const { id } = options;
22
+ const tid = parseInt(id, 10);
23
+ if (isNaN(tid)) {
24
+ this.error("Token ID must be a number.");
25
+ return;
26
+ }
27
+ try {
28
+ await client.auth.revokeToken(tid);
29
+ this.success(`Token ${tid} revoked.`);
30
+ } catch (error) {
31
+ this.error(`Failed to revoke token: ${error.message}`);
32
+ }
33
+ }
34
+ };
35
+ export {
36
+ AuthTokensRevokeCommand as default
37
+ };
38
+ //# sourceMappingURL=revoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/commands/token/revoke.ts"],"sourcesContent":["\nimport { BaseCommand } from '@nexical/cli-core';\nimport { getClient } from '../../utils/nexical-client.js';\n\nexport default class AuthTokensRevokeCommand extends BaseCommand {\n static description = 'Revoke an API token';\n\n static args = {\n args: [\n {\n name: 'id',\n required: true,\n description: 'ID of the token to revoke',\n },\n ],\n };\n\n async run(options: any) {\n const client = getClient();\n const { id } = options;\n const tid = parseInt(id, 10);\n\n if (isNaN(tid)) {\n this.error('Token ID must be a number.');\n return;\n }\n\n try {\n await client.auth.revokeToken(tid);\n this.success(`Token ${tid} revoked.`);\n } catch (error: any) {\n this.error(`Failed to revoke token: ${error.message}`);\n }\n }\n}\n"],"mappings":";;;;;;AACA,SAAS,mBAAmB;AAG5B,IAAqB,0BAArB,cAAqD,YAAY;AAAA,EAC7D,OAAO,cAAc;AAAA,EAErB,OAAO,OAAO;AAAA,IACV,MAAM;AAAA,MACF;AAAA,QACI,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,IAAI,SAAc;AACpB,UAAM,SAAS,UAAU;AACzB,UAAM,EAAE,GAAG,IAAI;AACf,UAAM,MAAM,SAAS,IAAI,EAAE;AAE3B,QAAI,MAAM,GAAG,GAAG;AACZ,WAAK,MAAM,4BAA4B;AACvC;AAAA,IACJ;AAEA,QAAI;AACA,YAAM,OAAO,KAAK,YAAY,GAAG;AACjC,WAAK,QAAQ,SAAS,GAAG,WAAW;AAAA,IACxC,SAAS,OAAY;AACjB,WAAK,MAAM,2BAA2B,MAAM,OAAO,EAAE;AAAA,IACzD;AAAA,EACJ;AACJ;","names":[]}
@@ -0,0 +1,8 @@
1
+ import { BaseCommand } from '@nexical/cli-core';
2
+
3
+ declare class WhoamiCommand extends BaseCommand {
4
+ static description: string;
5
+ run(): Promise<void>;
6
+ }
7
+
8
+ export { WhoamiCommand as default };
@@ -0,0 +1,26 @@
1
+ import { createRequire } from "module"; const require = createRequire(import.meta.url);
2
+ import {
3
+ getClient
4
+ } from "../../chunk-FDJVHO4O.js";
5
+
6
+ // src/commands/whoami.ts
7
+ import { BaseCommand } from "@nexical/cli-core";
8
+ var WhoamiCommand = class extends BaseCommand {
9
+ static description = "Show current logged in user";
10
+ async run() {
11
+ const client = getClient();
12
+ try {
13
+ const user = await client.users.me();
14
+ this.info(`Logged in as:`);
15
+ this.info(` Name: ${user.fullName}`);
16
+ this.info(` Email: ${user.email}`);
17
+ this.info(` ID: ${user.id}`);
18
+ } catch (error) {
19
+ this.error("Not logged in or token expired. Run `astrical login`.");
20
+ }
21
+ }
22
+ };
23
+ export {
24
+ WhoamiCommand as default
25
+ };
26
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/commands/whoami.ts"],"sourcesContent":["\nimport { BaseCommand } from '@nexical/cli-core';\nimport { getClient } from '../utils/nexical-client.js';\n\nexport default class WhoamiCommand extends BaseCommand {\n static description = 'Show current logged in user';\n\n async run() {\n const client = getClient();\n\n try {\n const user = await client.users.me();\n this.info(`Logged in as:`);\n this.info(` Name: ${user.fullName}`);\n this.info(` Email: ${user.email}`);\n this.info(` ID: ${user.id}`);\n } catch (error: any) {\n this.error('Not logged in or token expired. Run `astrical login`.');\n }\n }\n}\n"],"mappings":";;;;;;AACA,SAAS,mBAAmB;AAG5B,IAAqB,gBAArB,cAA2C,YAAY;AAAA,EACnD,OAAO,cAAc;AAAA,EAErB,MAAM,MAAM;AACR,UAAM,SAAS,UAAU;AAEzB,QAAI;AACA,YAAM,OAAO,MAAM,OAAO,MAAM,GAAG;AACnC,WAAK,KAAK,eAAe;AACzB,WAAK,KAAK,YAAY,KAAK,QAAQ,EAAE;AACrC,WAAK,KAAK,YAAY,KAAK,KAAK,EAAE;AAClC,WAAK,KAAK,YAAY,KAAK,EAAE,EAAE;AAAA,IACnC,SAAS,OAAY;AACjB,WAAK,MAAM,uDAAuD;AAAA,IACtE;AAAA,EACJ;AACJ;","names":[]}
@@ -0,0 +1,10 @@
1
+ import { NexicalClient } from '@nexical/sdk';
2
+
3
+ interface Config {
4
+ token?: string;
5
+ }
6
+ declare function getConfig(): Config;
7
+ declare function saveToken(token: string): void;
8
+ declare function getClient(): NexicalClient;
9
+
10
+ export { getClient, getConfig, saveToken };
@@ -0,0 +1,12 @@
1
+ import { createRequire } from "module"; const require = createRequire(import.meta.url);
2
+ import {
3
+ getClient,
4
+ getConfig,
5
+ saveToken
6
+ } from "../../chunk-FDJVHO4O.js";
7
+ export {
8
+ getClient,
9
+ getConfig,
10
+ saveToken
11
+ };
12
+ //# sourceMappingURL=nexical-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/index.ts ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import { CLI, logger } from "@nexical/cli-core";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+
6
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
7
+
8
+ logger.debug("CLI ENTRY POINT HIT", process.argv);
9
+
10
+ const app = new CLI({
11
+ commandName: "nexical",
12
+ searchDirectories: [path.resolve(__dirname, "./src/commands")],
13
+ });
14
+ app.start();
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@nexical/cli",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "bin": {
6
+ "astrical": "./dist/index.js"
7
+ },
8
+ "scripts": {
9
+ "build": "tsup",
10
+ "dev": "tsup --watch",
11
+ "start": "node dist/index.js",
12
+ "test": "npm run test:unit && npm run test:integration",
13
+ "test:unit": "vitest run --config vitest.config.ts --coverage",
14
+ "test:integration": "vitest run --config vitest.integration.config.ts",
15
+ "test:e2e": "npm run build && vitest run --config vitest.e2e.config.ts",
16
+ "test:watch": "vitest"
17
+ },
18
+ "dependencies": {
19
+ "@nexical/cli-core": "^0.1.4",
20
+ "@nexical/sdk": "^0.4.2"
21
+ },
22
+ "devDependencies": {
23
+ "@types/fs-extra": "^11.0.4",
24
+ "@types/node": "^20.10.0",
25
+ "@vitest/coverage-v8": "^4.0.15",
26
+ "execa": "^9.6.1",
27
+ "fs-extra": "^11.3.2",
28
+ "tsup": "^8.0.1",
29
+ "typescript": "^5.3.3",
30
+ "vitest": "^4.0.15"
31
+ }
32
+ }
@@ -0,0 +1,46 @@
1
+
2
+ import { BaseCommand } from '@nexical/cli-core';
3
+ import { getClient } from '../../utils/nexical-client.js';
4
+
5
+ export default class AdminUsersCreateSystemCommand extends BaseCommand {
6
+ static description = 'Create a new system user';
7
+
8
+ static args = {
9
+ args: [
10
+ {
11
+ name: 'name',
12
+ required: true,
13
+ description: 'System user name',
14
+ },
15
+ {
16
+ name: 'email',
17
+ required: true,
18
+ description: 'System user email',
19
+ },
20
+ {
21
+ name: 'password',
22
+ required: true,
23
+ description: 'System user password',
24
+ },
25
+ ],
26
+ };
27
+
28
+ async run(options: any) {
29
+ const client = getClient();
30
+ const { name, email, password } = options;
31
+
32
+ try {
33
+ const response = await client.auth.createSystemUser({
34
+ fullName: name,
35
+ email,
36
+ password,
37
+ });
38
+ const user = response.user;
39
+
40
+ this.success(`System user "${user.fullName}" created!`);
41
+ this.info(`ID: ${user.id}`);
42
+ } catch (error: any) {
43
+ this.error(`Failed to create system user: ${error.message}`);
44
+ }
45
+ }
46
+ }
@@ -0,0 +1,57 @@
1
+
2
+ import { BaseCommand } from '@nexical/cli-core';
3
+ import { getClient } from '../../utils/nexical-client.js';
4
+
5
+ export default class BranchesCreateCommand extends BaseCommand {
6
+ static description = 'Create a new branch';
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
+ name: 'name',
22
+ required: true,
23
+ description: 'Name of the branch',
24
+ },
25
+ ],
26
+ options: [
27
+ {
28
+ name: '--preview <url>',
29
+ description: 'Preview URL',
30
+ },
31
+ ],
32
+ };
33
+
34
+ async run(options: any) {
35
+ const client = getClient();
36
+ const { teamId, projectId, name, preview } = options;
37
+ const tid = parseInt(teamId, 10);
38
+ const pid = parseInt(projectId, 10);
39
+
40
+ if (isNaN(tid) || isNaN(pid)) {
41
+ this.error('IDs must be numbers.');
42
+ return;
43
+ }
44
+
45
+ try {
46
+ const branch = await client.branches.create(tid, pid, {
47
+ name,
48
+ previewUrl: preview,
49
+ });
50
+
51
+ this.success(`Branch "${branch.name}" created!`);
52
+ this.info(`ID: ${branch.id}`);
53
+ } catch (error: any) {
54
+ this.error(`Failed to create branch: ${error.message}`);
55
+ }
56
+ }
57
+ }