@nexical/cli 0.1.7 → 0.11.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 (241) hide show
  1. package/.github/workflows/deploy.yml +3 -3
  2. package/GEMINI.md +193 -0
  3. package/README.md +317 -104
  4. package/dist/chunk-JYASTIIW.js +42 -0
  5. package/dist/chunk-JYASTIIW.js.map +1 -0
  6. package/dist/chunk-LZ3YQWAR.js +2204 -0
  7. package/dist/chunk-LZ3YQWAR.js.map +1 -0
  8. package/dist/chunk-OKXOCNXP.js +105 -0
  9. package/dist/chunk-OKXOCNXP.js.map +1 -0
  10. package/dist/chunk-OYFWMYPG.js +52 -0
  11. package/dist/chunk-OYFWMYPG.js.map +1 -0
  12. package/dist/chunk-WKERTCM6.js +74 -0
  13. package/dist/chunk-WKERTCM6.js.map +1 -0
  14. package/dist/index.js +32 -5
  15. package/dist/index.js.map +1 -1
  16. package/dist/src/commands/init.d.ts +11 -0
  17. package/dist/src/commands/init.js +89 -0
  18. package/dist/src/commands/init.js.map +1 -0
  19. package/dist/src/commands/module/add.d.ts +14 -0
  20. package/dist/src/commands/module/add.js +136 -0
  21. package/dist/src/commands/module/add.js.map +1 -0
  22. package/dist/src/commands/module/list.d.ts +10 -0
  23. package/dist/src/commands/module/list.js +73 -0
  24. package/dist/src/commands/module/list.js.map +1 -0
  25. package/dist/src/commands/module/remove.d.ts +12 -0
  26. package/dist/src/commands/module/remove.js +71 -0
  27. package/dist/src/commands/module/remove.js.map +1 -0
  28. package/dist/src/commands/module/update.d.ts +11 -0
  29. package/dist/src/commands/module/update.js +52 -0
  30. package/dist/src/commands/module/update.js.map +1 -0
  31. package/dist/src/commands/run.d.ts +11 -0
  32. package/dist/src/commands/run.js +93 -0
  33. package/dist/src/commands/run.js.map +1 -0
  34. package/dist/src/commands/{login.d.ts → setup.d.ts} +2 -2
  35. package/dist/src/commands/setup.js +62 -0
  36. package/dist/src/commands/setup.js.map +1 -0
  37. package/dist/src/utils/discovery.d.ts +13 -0
  38. package/dist/src/utils/discovery.js +9 -0
  39. package/dist/src/utils/git.d.ts +16 -0
  40. package/dist/src/utils/git.js +29 -0
  41. package/dist/src/utils/git.js.map +1 -0
  42. package/dist/src/utils/url-resolver.d.ts +15 -0
  43. package/dist/src/utils/url-resolver.js +9 -0
  44. package/dist/src/utils/url-resolver.js.map +1 -0
  45. package/index.ts +29 -5
  46. package/package.json +32 -30
  47. package/src/commands/init.ts +86 -0
  48. package/src/commands/module/add.ts +169 -0
  49. package/src/commands/module/list.ts +69 -0
  50. package/src/commands/module/remove.ts +74 -0
  51. package/src/commands/module/update.ts +50 -0
  52. package/src/commands/run.ts +98 -0
  53. package/src/commands/setup.ts +74 -0
  54. package/src/utils/discovery.ts +134 -0
  55. package/src/utils/git.ts +65 -0
  56. package/src/utils/url-resolver.ts +57 -0
  57. package/test/e2e/lifecycle.e2e.test.ts +153 -0
  58. package/test/integration/commands/init.integration.test.ts +85 -0
  59. package/test/integration/commands/module.integration.test.ts +144 -0
  60. package/test/integration/commands/run.integration.test.ts +90 -0
  61. package/test/integration/utils/command-loading.integration.test.ts +80 -0
  62. package/test/unit/commands/init.test.ts +153 -0
  63. package/test/unit/commands/module/add.test.ts +262 -0
  64. package/test/unit/commands/module/list.test.ts +115 -0
  65. package/test/unit/commands/module/remove.test.ts +89 -0
  66. package/test/unit/commands/module/update.test.ts +91 -0
  67. package/test/unit/commands/run.test.ts +252 -0
  68. package/test/unit/commands/setup.test.ts +169 -0
  69. package/test/unit/utils/command-discovery.test.ts +176 -0
  70. package/test/unit/utils/git.test.ts +152 -0
  71. package/test/unit/utils/integration-helpers.test.ts +72 -0
  72. package/test/unit/utils/url-resolver.test.ts +39 -0
  73. package/test/utils/integration-helpers.ts +66 -0
  74. package/vitest.e2e.config.ts +0 -1
  75. package/dist/chunk-JDRAVUKK.js +0 -48
  76. package/dist/chunk-JDRAVUKK.js.map +0 -1
  77. package/dist/src/commands/admin/create-user.d.ts +0 -15
  78. package/dist/src/commands/admin/create-user.js +0 -49
  79. package/dist/src/commands/admin/create-user.js.map +0 -1
  80. package/dist/src/commands/branch/create.d.ts +0 -19
  81. package/dist/src/commands/branch/create.js +0 -59
  82. package/dist/src/commands/branch/create.js.map +0 -1
  83. package/dist/src/commands/branch/delete.d.ts +0 -15
  84. package/dist/src/commands/branch/delete.js +0 -50
  85. package/dist/src/commands/branch/delete.js.map +0 -1
  86. package/dist/src/commands/branch/get.d.ts +0 -15
  87. package/dist/src/commands/branch/get.js +0 -53
  88. package/dist/src/commands/branch/get.js.map +0 -1
  89. package/dist/src/commands/branch/list.d.ts +0 -15
  90. package/dist/src/commands/branch/list.js +0 -51
  91. package/dist/src/commands/branch/list.js.map +0 -1
  92. package/dist/src/commands/job/get.d.ts +0 -15
  93. package/dist/src/commands/job/get.js +0 -62
  94. package/dist/src/commands/job/get.js.map +0 -1
  95. package/dist/src/commands/job/list.d.ts +0 -15
  96. package/dist/src/commands/job/list.js +0 -57
  97. package/dist/src/commands/job/list.js.map +0 -1
  98. package/dist/src/commands/job/logs.d.ts +0 -15
  99. package/dist/src/commands/job/logs.js +0 -67
  100. package/dist/src/commands/job/logs.js.map +0 -1
  101. package/dist/src/commands/job/trigger.d.ts +0 -19
  102. package/dist/src/commands/job/trigger.js +0 -74
  103. package/dist/src/commands/job/trigger.js.map +0 -1
  104. package/dist/src/commands/login.js +0 -31
  105. package/dist/src/commands/login.js.map +0 -1
  106. package/dist/src/commands/project/create.d.ts +0 -24
  107. package/dist/src/commands/project/create.js +0 -63
  108. package/dist/src/commands/project/create.js.map +0 -1
  109. package/dist/src/commands/project/delete.d.ts +0 -20
  110. package/dist/src/commands/project/delete.js +0 -58
  111. package/dist/src/commands/project/delete.js.map +0 -1
  112. package/dist/src/commands/project/get.d.ts +0 -15
  113. package/dist/src/commands/project/get.js +0 -49
  114. package/dist/src/commands/project/get.js.map +0 -1
  115. package/dist/src/commands/project/list.d.ts +0 -15
  116. package/dist/src/commands/project/list.js +0 -45
  117. package/dist/src/commands/project/list.js.map +0 -1
  118. package/dist/src/commands/project/update.d.ts +0 -19
  119. package/dist/src/commands/project/update.js +0 -66
  120. package/dist/src/commands/project/update.js.map +0 -1
  121. package/dist/src/commands/team/create.d.ts +0 -19
  122. package/dist/src/commands/team/create.js +0 -45
  123. package/dist/src/commands/team/create.js.map +0 -1
  124. package/dist/src/commands/team/delete.d.ts +0 -20
  125. package/dist/src/commands/team/delete.js +0 -52
  126. package/dist/src/commands/team/delete.js.map +0 -1
  127. package/dist/src/commands/team/get.d.ts +0 -15
  128. package/dist/src/commands/team/get.js +0 -42
  129. package/dist/src/commands/team/get.js.map +0 -1
  130. package/dist/src/commands/team/list.d.ts +0 -8
  131. package/dist/src/commands/team/list.js +0 -30
  132. package/dist/src/commands/team/list.js.map +0 -1
  133. package/dist/src/commands/team/member/invite.d.ts +0 -20
  134. package/dist/src/commands/team/member/invite.js +0 -54
  135. package/dist/src/commands/team/member/invite.js.map +0 -1
  136. package/dist/src/commands/team/member/remove.d.ts +0 -15
  137. package/dist/src/commands/team/member/remove.js +0 -43
  138. package/dist/src/commands/team/member/remove.js.map +0 -1
  139. package/dist/src/commands/team/update.d.ts +0 -19
  140. package/dist/src/commands/team/update.js +0 -55
  141. package/dist/src/commands/team/update.js.map +0 -1
  142. package/dist/src/commands/token/generate.d.ts +0 -19
  143. package/dist/src/commands/token/generate.js +0 -48
  144. package/dist/src/commands/token/generate.js.map +0 -1
  145. package/dist/src/commands/token/list.d.ts +0 -8
  146. package/dist/src/commands/token/list.js +0 -31
  147. package/dist/src/commands/token/list.js.map +0 -1
  148. package/dist/src/commands/token/revoke.d.ts +0 -15
  149. package/dist/src/commands/token/revoke.js +0 -38
  150. package/dist/src/commands/token/revoke.js.map +0 -1
  151. package/dist/src/commands/whoami.d.ts +0 -8
  152. package/dist/src/commands/whoami.js +0 -26
  153. package/dist/src/commands/whoami.js.map +0 -1
  154. package/dist/src/utils/nexical-client.d.ts +0 -10
  155. package/dist/src/utils/nexical-client.js +0 -12
  156. package/src/commands/admin/create-user.ts +0 -46
  157. package/src/commands/branch/create.ts +0 -57
  158. package/src/commands/branch/delete.ts +0 -47
  159. package/src/commands/branch/get.ts +0 -50
  160. package/src/commands/branch/list.ts +0 -50
  161. package/src/commands/job/get.ts +0 -59
  162. package/src/commands/job/list.ts +0 -56
  163. package/src/commands/job/logs.ts +0 -67
  164. package/src/commands/job/trigger.ts +0 -73
  165. package/src/commands/login.ts +0 -31
  166. package/src/commands/project/create.ts +0 -61
  167. package/src/commands/project/delete.ts +0 -56
  168. package/src/commands/project/get.ts +0 -46
  169. package/src/commands/project/list.ts +0 -44
  170. package/src/commands/project/update.ts +0 -63
  171. package/src/commands/team/create.ts +0 -43
  172. package/src/commands/team/delete.ts +0 -50
  173. package/src/commands/team/get.ts +0 -39
  174. package/src/commands/team/list.ts +0 -26
  175. package/src/commands/team/member/invite.ts +0 -56
  176. package/src/commands/team/member/remove.ts +0 -40
  177. package/src/commands/team/update.ts +0 -53
  178. package/src/commands/token/generate.ts +0 -45
  179. package/src/commands/token/list.ts +0 -27
  180. package/src/commands/token/revoke.ts +0 -35
  181. package/src/commands/whoami.ts +0 -21
  182. package/src/utils/nexical-client.ts +0 -47
  183. package/test/e2e/auth.e2e.test.ts +0 -46
  184. package/test/e2e/job-workflow.e2e.test.ts +0 -33
  185. package/test/e2e/project-lifecycle.e2e.test.ts +0 -48
  186. package/test/e2e/setup.ts +0 -237
  187. package/test/e2e/utils.ts +0 -33
  188. package/test/integration/commands/admin/create-user.test.ts +0 -51
  189. package/test/integration/commands/branch/create.test.ts +0 -51
  190. package/test/integration/commands/branch/delete.test.ts +0 -43
  191. package/test/integration/commands/branch/get.test.ts +0 -49
  192. package/test/integration/commands/branch/list.test.ts +0 -47
  193. package/test/integration/commands/job/get.test.ts +0 -54
  194. package/test/integration/commands/job/list.test.ts +0 -47
  195. package/test/integration/commands/job/logs.test.ts +0 -47
  196. package/test/integration/commands/job/trigger.test.ts +0 -57
  197. package/test/integration/commands/login.test.ts +0 -62
  198. package/test/integration/commands/project/create.test.ts +0 -53
  199. package/test/integration/commands/project/delete.test.ts +0 -43
  200. package/test/integration/commands/project/get.test.ts +0 -51
  201. package/test/integration/commands/project/list.test.ts +0 -47
  202. package/test/integration/commands/project/update.test.ts +0 -53
  203. package/test/integration/commands/team/create.test.ts +0 -53
  204. package/test/integration/commands/team/delete.test.ts +0 -43
  205. package/test/integration/commands/team/get.test.ts +0 -50
  206. package/test/integration/commands/team/list.test.ts +0 -47
  207. package/test/integration/commands/team/member/invite.test.ts +0 -46
  208. package/test/integration/commands/team/member/remove.test.ts +0 -43
  209. package/test/integration/commands/team/update.test.ts +0 -50
  210. package/test/integration/commands/token/generate.test.ts +0 -51
  211. package/test/integration/commands/token/list.test.ts +0 -47
  212. package/test/integration/commands/token/revoke.test.ts +0 -43
  213. package/test/integration/commands/whoami.test.ts +0 -49
  214. package/test/unit/commands/admin/create-user.test.ts +0 -51
  215. package/test/unit/commands/branch/create.test.ts +0 -57
  216. package/test/unit/commands/branch/delete.test.ts +0 -49
  217. package/test/unit/commands/branch/get.test.ts +0 -67
  218. package/test/unit/commands/branch/list.test.ts +0 -62
  219. package/test/unit/commands/job/get.test.ts +0 -76
  220. package/test/unit/commands/job/list.test.ts +0 -62
  221. package/test/unit/commands/job/logs.test.ts +0 -60
  222. package/test/unit/commands/job/trigger.test.ts +0 -75
  223. package/test/unit/commands/login.test.ts +0 -64
  224. package/test/unit/commands/project/create.test.ts +0 -64
  225. package/test/unit/commands/project/delete.test.ts +0 -72
  226. package/test/unit/commands/project/get.test.ts +0 -73
  227. package/test/unit/commands/project/list.test.ts +0 -62
  228. package/test/unit/commands/project/update.test.ts +0 -58
  229. package/test/unit/commands/team/create.test.ts +0 -68
  230. package/test/unit/commands/team/delete.test.ts +0 -71
  231. package/test/unit/commands/team/get.test.ts +0 -70
  232. package/test/unit/commands/team/list.test.ts +0 -56
  233. package/test/unit/commands/team/member/invite.test.ts +0 -52
  234. package/test/unit/commands/team/member/remove.test.ts +0 -49
  235. package/test/unit/commands/team/update.test.ts +0 -63
  236. package/test/unit/commands/token/generate.test.ts +0 -65
  237. package/test/unit/commands/token/list.test.ts +0 -58
  238. package/test/unit/commands/token/revoke.test.ts +0 -49
  239. package/test/unit/commands/whoami.test.ts +0 -49
  240. package/test/unit/utils/nexical-client.test.ts +0 -113
  241. /package/dist/src/utils/{nexical-client.js.map → discovery.js.map} +0 -0
@@ -1,59 +0,0 @@
1
-
2
- import { BaseCommand } from '@nexical/cli-core';
3
- import { getClient } from '../../utils/nexical-client.js';
4
-
5
- export default class JobsGetCommand extends BaseCommand {
6
- static description = 'Get job 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
- name: 'branchId',
22
- required: true,
23
- description: 'Branch ID',
24
- },
25
- {
26
- name: 'jobId',
27
- required: true,
28
- description: 'Job ID',
29
- },
30
- ],
31
- };
32
-
33
- async run(options: any) {
34
- const client = getClient();
35
- const { teamId, projectId, branchId, jobId } = options;
36
- const tid = parseInt(teamId, 10);
37
- const pid = parseInt(projectId, 10);
38
- const bid = parseInt(branchId, 10);
39
- const jid = parseInt(jobId, 10);
40
-
41
- if (isNaN(tid) || isNaN(pid) || isNaN(bid) || isNaN(jid)) {
42
- this.error('IDs must be numbers.');
43
- return;
44
- }
45
-
46
- try {
47
- const job = await client.jobs.get(tid, pid, bid, jid);
48
- this.info(`Job Details:`);
49
- this.info(` ID: ${job.id}`);
50
- this.info(` Type: ${job.type}`);
51
- this.info(` Status: ${job.status}`);
52
- this.info(` Started: ${job.startedAt || 'Waiting'}`);
53
- this.info(` Ended: ${job.completedAt || 'Running'}`);
54
- this.info(` Queue: ${job.queue}`);
55
- } catch (error: any) {
56
- this.error(`Failed to get job: ${error.message}`);
57
- }
58
- }
59
- }
@@ -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 JobsListCommand extends BaseCommand {
6
- static description = 'List jobs for a 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: 'branchId',
22
- required: true,
23
- description: 'Branch ID',
24
- },
25
- ],
26
- };
27
-
28
- async run(options: any) {
29
- const client = getClient();
30
- const { teamId, projectId, branchId } = options;
31
- const tid = parseInt(teamId, 10);
32
- const pid = parseInt(projectId, 10);
33
- const bid = parseInt(branchId, 10);
34
-
35
- if (isNaN(tid) || isNaN(pid) || isNaN(bid)) {
36
- this.error('IDs must be numbers.');
37
- return;
38
- }
39
-
40
- try {
41
- const jobs = await client.jobs.list(tid, pid, bid);
42
-
43
- if (jobs.length === 0) {
44
- this.info('No jobs found.');
45
- return;
46
- }
47
-
48
- this.info(`Jobs for Branch ${bid}:`);
49
- for (const job of jobs) {
50
- this.info(`${job.id} - ${job.type} [${job.status}] (Started: ${job.startedAt || 'Waiting'})`);
51
- }
52
- } catch (error: any) {
53
- this.error(`Failed to list jobs: ${error.message}`);
54
- }
55
- }
56
- }
@@ -1,67 +0,0 @@
1
-
2
- import { BaseCommand } from '@nexical/cli-core';
3
- import { getClient } from '../../utils/nexical-client.js';
4
-
5
- export default class JobsLogsCommand extends BaseCommand {
6
- static description = 'Get logs for a job';
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: 'branchId',
22
- required: true,
23
- description: 'Branch ID',
24
- },
25
- {
26
- name: 'jobId',
27
- required: true,
28
- description: 'Job ID',
29
- },
30
- ],
31
- };
32
-
33
- async run(options: any) {
34
- const client = getClient();
35
- const { teamId, projectId, branchId, jobId } = options;
36
- const tid = parseInt(teamId, 10);
37
- const pid = parseInt(projectId, 10);
38
- const bid = parseInt(branchId, 10);
39
- const jid = parseInt(jobId, 10);
40
-
41
- if (isNaN(tid) || isNaN(pid) || isNaN(bid) || isNaN(jid)) {
42
- this.error('IDs must be numbers.');
43
- return;
44
- }
45
-
46
- try {
47
- const logs = await client.jobs.getLogs(tid, pid, bid, jid);
48
-
49
- this.info(`Logs for Job ${jid}:`);
50
- // Assuming logs is an array of JobLog objects
51
- for (const log of (logs as any)) { // Casting because SDK return type might be generic array
52
- const timestamp = new Date(log.timestamp).toLocaleTimeString();
53
- const color = log.level === 'error' ? 'red' : log.level === 'warn' ? 'yellow' : 'white';
54
-
55
- if (log.level === 'error') {
56
- this.error(`[${timestamp}] ${log.message}`);
57
- } else if (log.level === 'warn') {
58
- this.warn(`[${timestamp}] ${log.message}`);
59
- } else {
60
- this.info(`[${timestamp}] ${log.message}`);
61
- }
62
- }
63
- } catch (error: any) {
64
- this.error(`Failed to get logs: ${error.message}`);
65
- }
66
- }
67
- }
@@ -1,73 +0,0 @@
1
-
2
- import { BaseCommand } from '@nexical/cli-core';
3
- import { getClient } from '../../utils/nexical-client.js';
4
-
5
- export default class JobsTriggerCommand extends BaseCommand {
6
- static description = 'Trigger a new job';
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: 'branchId',
22
- required: true,
23
- description: 'Branch ID',
24
- },
25
- {
26
- name: 'type',
27
- required: true,
28
- description: 'Job type (e.g., deploy, build)',
29
- },
30
- ],
31
- options: [
32
- {
33
- name: '--input <json>',
34
- description: 'Input JSON string',
35
- },
36
- ],
37
- };
38
-
39
- async run(options: any) {
40
- const client = getClient();
41
- const { teamId, projectId, branchId, type, input } = options;
42
- const tid = parseInt(teamId, 10);
43
- const pid = parseInt(projectId, 10);
44
- const bid = parseInt(branchId, 10);
45
-
46
- if (isNaN(tid) || isNaN(pid) || isNaN(bid)) {
47
- this.error('IDs must be numbers.');
48
- return;
49
- }
50
-
51
- let inputs = {};
52
- if (input) {
53
- try {
54
- inputs = JSON.parse(input);
55
- } catch (e) {
56
- this.error('Invalid JSON inputs.');
57
- return;
58
- }
59
- }
60
-
61
- try {
62
- const job = await client.jobs.create(tid, pid, bid, {
63
- type,
64
- inputs,
65
- });
66
-
67
- this.success(`Job ${job.id} triggered successfully!`);
68
- this.info(`Status: ${job.status}`);
69
- } catch (error: any) {
70
- this.error(`Failed to trigger job: ${error.message}`);
71
- }
72
- }
73
- }
@@ -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
- }
@@ -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
- }