@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
@@ -0,0 +1,152 @@
1
+ import { runCommand } from '@nexical/cli-core';
2
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
3
+ import * as git from '../../../src/utils/git.js';
4
+
5
+ const mocks = vi.hoisted(() => ({
6
+ exec: vi.fn(),
7
+ }));
8
+
9
+ vi.mock('@nexical/cli-core', async (importOriginal) => {
10
+ const mod = await importOriginal<typeof import('@nexical/cli-core')>();
11
+ return {
12
+ ...mod,
13
+ runCommand: vi.fn(),
14
+ logger: { code: vi.fn(), debug: vi.fn() }
15
+ }
16
+ });
17
+
18
+ vi.mock('node:child_process', () => ({
19
+ exec: mocks.exec,
20
+ }));
21
+
22
+ vi.mock('node:util', async () => {
23
+ const actual = await vi.importActual<any>('node:util');
24
+ return {
25
+ ...actual,
26
+ promisify: (fn: Function) => {
27
+ return (...args: any[]) => new Promise((resolve, reject) => {
28
+ fn(...args, (err: Error | null, ...values: any[]) => {
29
+ if (err) return reject(err);
30
+ // Handle exec-like signature (stdout, stderr) -> { stdout, stderr }
31
+ // Simple heuristic: if values.length > 1, assume explicit mapping needed?
32
+ // Or just hardcode for our known usage (exec).
33
+ if (values.length >= 2) {
34
+ resolve({ stdout: values[0], stderr: values[1] });
35
+ } else {
36
+ resolve(values[0]);
37
+ }
38
+ });
39
+ });
40
+ }
41
+ };
42
+ });
43
+
44
+ describe('git utils', () => {
45
+ beforeEach(() => {
46
+ vi.clearAllMocks();
47
+ });
48
+
49
+ it('should clone repository', async () => {
50
+ await git.clone('http://repo.git', 'dest', { recursive: true });
51
+ expect(runCommand).toHaveBeenCalledWith(
52
+ 'git clone --recursive http://repo.git .',
53
+ 'dest'
54
+ );
55
+ });
56
+
57
+ it('should clone repository with depth', async () => {
58
+ await git.clone('http://repo.git', 'dest', { depth: 1 });
59
+ expect(runCommand).toHaveBeenCalledWith(
60
+ 'git clone --depth 1 http://repo.git .',
61
+ 'dest'
62
+ );
63
+ });
64
+
65
+ it('should update submodules', async () => {
66
+ await git.updateSubmodules('dest');
67
+ expect(runCommand).toHaveBeenCalledWith(
68
+ 'git submodule foreach --recursive "git checkout main && git pull origin main"',
69
+ 'dest'
70
+ );
71
+ });
72
+
73
+ it('should checkout orphan branch', async () => {
74
+ await git.checkoutOrphan('branch', 'dest');
75
+ expect(runCommand).toHaveBeenCalledWith('git checkout --orphan branch', 'dest');
76
+ });
77
+
78
+ it('should get remote url', async () => {
79
+ // Mock exec to call the callback with success
80
+ mocks.exec.mockImplementation((((cmd: string, options: any, callback: any) => {
81
+ if (typeof options === 'function') {
82
+ callback = options;
83
+ options = {};
84
+ }
85
+ // callback(error, stdout, stderr)
86
+ callback(null, 'https://github.com/origin.git\n', '');
87
+ return {} as any; // exec returns a ChildProcess
88
+ }) as any));
89
+
90
+ const url = await git.getRemoteUrl('cwd');
91
+ expect(url).toBe('https://github.com/origin.git');
92
+ expect(mocks.exec).toHaveBeenCalledWith('git remote get-url origin', { cwd: 'cwd' }, expect.any(Function));
93
+ });
94
+
95
+ it('should return empty string on getRemoteUrl failure', async () => {
96
+ // Mock exec to call the callback with error
97
+ mocks.exec.mockImplementation((((cmd: string, options: any, callback: any) => {
98
+ if (typeof options === 'function') callback = options;
99
+ callback(new Error('fail'), '', '');
100
+ return {} as any;
101
+ }) as any));
102
+
103
+ const url = await git.getRemoteUrl('cwd');
104
+ expect(url).toBe('');
105
+ });
106
+ });
107
+
108
+ it('should add all files', async () => {
109
+ await git.addAll('cwd');
110
+ expect(runCommand).toHaveBeenCalledWith('git add -A', 'cwd');
111
+ });
112
+
113
+ it('should commit', async () => {
114
+ await git.commit('msg', 'cwd');
115
+ expect(runCommand).toHaveBeenCalledWith('git commit -m "msg"', 'cwd');
116
+ });
117
+
118
+ it('should delete branch', async () => {
119
+ await git.deleteBranch('branch', 'cwd');
120
+ expect(runCommand).toHaveBeenCalledWith('git branch -D branch', 'cwd');
121
+ });
122
+
123
+ it('should rename branch', async () => {
124
+ await git.renameBranch('branch', 'cwd');
125
+ expect(runCommand).toHaveBeenCalledWith('git branch -m branch', 'cwd');
126
+ });
127
+
128
+ it('should remove remote', async () => {
129
+ await git.removeRemote('origin', 'cwd');
130
+ expect(runCommand).toHaveBeenCalledWith('git remote remove origin', 'cwd');
131
+ });
132
+
133
+ it('should check if branch exists', async () => {
134
+ // Mock success
135
+ mocks.exec.mockImplementation((((cmd: string, options: any, callback: any) => {
136
+ if (typeof options === 'function') callback = options;
137
+ callback(null, '', '');
138
+ return {} as any;
139
+ }) as any));
140
+
141
+ expect(await git.branchExists('branch', 'cwd')).toBe(true);
142
+ expect(mocks.exec).toHaveBeenCalledWith('git show-ref --verify --quiet refs/heads/branch', { cwd: 'cwd' }, expect.any(Function));
143
+
144
+ // Mock failure
145
+ mocks.exec.mockImplementation((((cmd: string, options: any, callback: any) => {
146
+ if (typeof options === 'function') callback = options;
147
+ callback(new Error('fail'), '', '');
148
+ return {} as any;
149
+ }) as any));
150
+
151
+ expect(await git.branchExists('branch', 'cwd')).toBe(false);
152
+ });
@@ -0,0 +1,72 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import * as helpers from '../../utils/integration-helpers.js';
3
+ import fs from 'fs-extra';
4
+ import { execa } from 'execa';
5
+ import path from 'path';
6
+
7
+ vi.mock('fs-extra');
8
+ vi.mock('execa');
9
+
10
+ describe('Integration Helpers Unit', () => {
11
+ beforeEach(() => {
12
+ vi.clearAllMocks();
13
+ });
14
+
15
+ it('runCLI should execute node with correct arguments', async () => {
16
+ vi.mocked(execa).mockResolvedValue({ exitCode: 0 } as any);
17
+ const args = ['init', 'my-project'];
18
+ const cwd = '/test/cwd';
19
+ const env = { FOO: 'bar' };
20
+
21
+ await helpers.runCLI(args, cwd, { env });
22
+
23
+ expect(execa).toHaveBeenCalledWith(
24
+ 'node',
25
+ expect.arrayContaining([expect.stringContaining('dist/index.js'), ...args]),
26
+ expect.objectContaining({
27
+ cwd,
28
+ env: expect.objectContaining({ FOO: 'bar' }),
29
+ reject: false
30
+ })
31
+ );
32
+ });
33
+
34
+ it('createTempDir should create directory and return path', async () => {
35
+ vi.mocked(fs.ensureDir).mockResolvedValue(undefined);
36
+
37
+ const dir = await helpers.createTempDir('test-prefix-');
38
+
39
+ expect(dir).toContain('test-prefix-');
40
+ expect(fs.ensureDir).toHaveBeenCalledWith(dir);
41
+ });
42
+
43
+ it('cleanupTestRoot should remove test root directory', async () => {
44
+ vi.mocked(fs.remove).mockResolvedValue(undefined);
45
+
46
+ await helpers.cleanupTestRoot();
47
+
48
+ expect(fs.remove).toHaveBeenCalledWith(expect.stringContaining('.test-tmp'));
49
+ });
50
+
51
+ it('createMockRepo should initialize git repo and commit files', async () => {
52
+ vi.mocked(fs.ensureDir).mockResolvedValue(undefined);
53
+ vi.mocked(fs.outputFile).mockResolvedValue(undefined);
54
+ vi.mocked(execa).mockResolvedValue({} as any);
55
+
56
+ const dir = '/test/repo';
57
+ const files = {
58
+ 'package.json': '{}',
59
+ 'README.md': '# Test'
60
+ };
61
+
62
+ await helpers.createMockRepo(dir, files);
63
+
64
+ expect(fs.ensureDir).toHaveBeenCalledWith(dir);
65
+ expect(execa).toHaveBeenCalledWith('git', ['init'], expect.objectContaining({ cwd: dir }));
66
+ expect(execa).toHaveBeenCalledWith('git', ['config', 'user.email', 'test@test.com'], expect.objectContaining({ cwd: dir }));
67
+ expect(fs.outputFile).toHaveBeenCalledWith(path.join(dir, 'package.json'), '{}');
68
+ expect(fs.outputFile).toHaveBeenCalledWith(path.join(dir, 'README.md'), '# Test');
69
+ expect(execa).toHaveBeenCalledWith('git', ['add', '.'], expect.objectContaining({ cwd: dir }));
70
+ expect(execa).toHaveBeenCalledWith('git', ['commit', '-m', 'Initial commit'], expect.objectContaining({ cwd: dir }));
71
+ });
72
+ });
@@ -0,0 +1,39 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { resolveGitUrl } from '../../../src/utils/url-resolver';
3
+
4
+ describe('resolveGitUrl', () => {
5
+ it('should expand gh@ shorthand correctly', () => {
6
+ expect(resolveGitUrl('gh@nexical-cms/starter')).toBe('https://github.com/nexical-cms/starter.git');
7
+ });
8
+
9
+ it('should expand gh@ shorthand with subpath correctly', () => {
10
+ expect(resolveGitUrl('gh@nexical-cms/starter//path/to/module')).toBe('https://github.com/nexical-cms/starter.git//path/to/module');
11
+ });
12
+
13
+ it('should add .git extension to standard URLs if missing', () => {
14
+ expect(resolveGitUrl('https://github.com/nexical-cms/starter')).toBe('https://github.com/nexical-cms/starter.git');
15
+ });
16
+
17
+ it('should preserve .git extension if already present', () => {
18
+ expect(resolveGitUrl('https://github.com/nexical-cms/starter.git')).toBe('https://github.com/nexical-cms/starter.git');
19
+ });
20
+
21
+ it('should handle standard URLs with subpath correctly', () => {
22
+ expect(resolveGitUrl('https://github.com/nexical-cms/starter//path/to/dir')).toBe('https://github.com/nexical-cms/starter.git//path/to/dir');
23
+ });
24
+
25
+ it('should handle standard URLs with .git and subpath correctly', () => {
26
+ expect(resolveGitUrl('https://github.com/nexical-cms/starter.git//path/to/dir')).toBe('https://github.com/nexical-cms/starter.git//path/to/dir');
27
+ });
28
+
29
+ it('should throw error for empty url', () => {
30
+ expect(() => resolveGitUrl('')).toThrow('URL cannot be empty');
31
+ });
32
+
33
+ it('should not append .git to local paths', () => {
34
+ expect(resolveGitUrl('/tmp/local/repo')).toBe('/tmp/local/repo');
35
+ expect(resolveGitUrl('./local/repo')).toBe('./local/repo');
36
+ expect(resolveGitUrl('../local/repo')).toBe('../local/repo');
37
+ expect(resolveGitUrl('file:///tmp/repo')).toBe('file:///tmp/repo');
38
+ });
39
+ });
@@ -0,0 +1,66 @@
1
+ import path from 'node:path';
2
+ import fs from 'fs-extra';
3
+ import { execa } from 'execa';
4
+ import { fileURLToPath } from 'node:url';
5
+
6
+ // Constants
7
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
+ export const TEST_ROOT = path.resolve(__dirname, '../../.test-tmp');
9
+ export const CLI_BIN = path.resolve(__dirname, '../../dist/index.js');
10
+
11
+ /**
12
+ * Runs the CLI command against the compiled binary (E2E style)
13
+ */
14
+ export async function runCLI(args: string[], cwd: string, options: any = {}) {
15
+ return execa('node', [CLI_BIN, ...args], {
16
+ cwd,
17
+ ...options,
18
+ env: {
19
+ ...process.env,
20
+ ...options.env
21
+ },
22
+ reject: false // Allow checking exit code in tests
23
+ });
24
+ }
25
+
26
+ /**
27
+ * Creates a temporary directory for testing.
28
+ * @returns The absolute path to the temporary directory.
29
+ */
30
+ export async function createTempDir(prefix = 'test-'): Promise<string> {
31
+ const dir = path.join(TEST_ROOT, `${prefix}${Date.now()}-${Math.random().toString(36).slice(2)}`);
32
+ await fs.ensureDir(dir);
33
+ return dir;
34
+ }
35
+
36
+ /**
37
+ * Cleans up the temporary test root.
38
+ */
39
+ export async function cleanupTestRoot(): Promise<void> {
40
+ await fs.remove(TEST_ROOT);
41
+ }
42
+
43
+ /**
44
+ * Creates a mock git repository at the specified path.
45
+ * This is useful for testing commands that clone from a remote.
46
+ */
47
+ export async function createMockRepo(dir: string, initialFiles: Record<string, string> = {}): Promise<string> {
48
+ await fs.ensureDir(dir);
49
+
50
+ // Initialize bare repo? No, usually we want a regular repo then commit,
51
+ // but if we want to clone FROM it locally, it acts as a remote.
52
+ // Let's make it a regular repo.
53
+ await execa('git', ['init'], { cwd: dir });
54
+ await execa('git', ['config', 'user.email', 'test@test.com'], { cwd: dir });
55
+ await execa('git', ['config', 'user.name', 'Test User'], { cwd: dir });
56
+
57
+ // Write initial files
58
+ for (const [filename, content] of Object.entries(initialFiles)) {
59
+ await fs.outputFile(path.join(dir, filename), content);
60
+ }
61
+
62
+ await execa('git', ['add', '.'], { cwd: dir });
63
+ await execa('git', ['commit', '-m', 'Initial commit'], { cwd: dir });
64
+
65
+ return dir;
66
+ }
@@ -6,6 +6,5 @@ export default defineConfig({
6
6
  environment: 'node',
7
7
  include: ['test/e2e/**/*.test.ts'],
8
8
  testTimeout: 60000,
9
- fileParallelism: false,
10
9
  },
11
10
  });
@@ -1,48 +0,0 @@
1
- import { createRequire } from "module"; const require = createRequire(import.meta.url);
2
-
3
- // src/utils/nexical-client.ts
4
- import { NexicalClient } from "@nexical/sdk";
5
- import fs from "fs";
6
- import path from "path";
7
- import os from "os";
8
- var getConfigPaths = () => {
9
- const HOME = process.env.HOME || os.homedir();
10
- const CONFIG_DIR = path.join(HOME, ".nexical");
11
- const CONFIG_FILE = path.join(CONFIG_DIR, "config.json");
12
- return { CONFIG_DIR, CONFIG_FILE };
13
- };
14
- function getConfig() {
15
- const { CONFIG_FILE } = getConfigPaths();
16
- if (!fs.existsSync(CONFIG_FILE)) {
17
- return {};
18
- }
19
- try {
20
- const content = fs.readFileSync(CONFIG_FILE, "utf-8");
21
- return JSON.parse(content);
22
- } catch (error) {
23
- return {};
24
- }
25
- }
26
- function saveToken(token) {
27
- const { CONFIG_DIR, CONFIG_FILE } = getConfigPaths();
28
- if (!fs.existsSync(CONFIG_DIR)) {
29
- fs.mkdirSync(CONFIG_DIR, { recursive: true });
30
- }
31
- const config = getConfig();
32
- config.token = token;
33
- fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
34
- }
35
- function getClient() {
36
- const config = getConfig();
37
- return new NexicalClient({
38
- token: config.token,
39
- baseURL: process.env.NEXICAL_API_URL
40
- });
41
- }
42
-
43
- export {
44
- getConfig,
45
- saveToken,
46
- getClient
47
- };
48
- //# sourceMappingURL=chunk-JDRAVUKK.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/nexical-client.ts"],"sourcesContent":["\nimport { NexicalClient } from '@nexical/sdk';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\nconst getConfigPaths = () => {\n const HOME = process.env.HOME || os.homedir();\n const CONFIG_DIR = path.join(HOME, '.nexical');\n const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');\n return { CONFIG_DIR, CONFIG_FILE };\n};\n\ninterface Config {\n token?: string;\n}\n\nexport function getConfig(): Config {\n const { CONFIG_FILE } = getConfigPaths();\n if (!fs.existsSync(CONFIG_FILE)) {\n return {};\n }\n try {\n const content = fs.readFileSync(CONFIG_FILE, 'utf-8');\n return JSON.parse(content);\n } catch (error) {\n return {};\n }\n}\n\nexport function saveToken(token: string) {\n const { CONFIG_DIR, CONFIG_FILE } = getConfigPaths();\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\n }\n const config = getConfig();\n config.token = token;\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));\n}\n\nexport function getClient(): NexicalClient {\n const config = getConfig();\n return new NexicalClient({\n token: config.token,\n baseURL: process.env.NEXICAL_API_URL,\n });\n}\n"],"mappings":";;;AACA,SAAS,qBAAqB;AAC9B,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,QAAQ;AAEf,IAAM,iBAAiB,MAAM;AACzB,QAAM,OAAO,QAAQ,IAAI,QAAQ,GAAG,QAAQ;AAC5C,QAAM,aAAa,KAAK,KAAK,MAAM,UAAU;AAC7C,QAAM,cAAc,KAAK,KAAK,YAAY,aAAa;AACvD,SAAO,EAAE,YAAY,YAAY;AACrC;AAMO,SAAS,YAAoB;AAChC,QAAM,EAAE,YAAY,IAAI,eAAe;AACvC,MAAI,CAAC,GAAG,WAAW,WAAW,GAAG;AAC7B,WAAO,CAAC;AAAA,EACZ;AACA,MAAI;AACA,UAAM,UAAU,GAAG,aAAa,aAAa,OAAO;AACpD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC7B,SAAS,OAAO;AACZ,WAAO,CAAC;AAAA,EACZ;AACJ;AAEO,SAAS,UAAU,OAAe;AACrC,QAAM,EAAE,YAAY,YAAY,IAAI,eAAe;AACnD,MAAI,CAAC,GAAG,WAAW,UAAU,GAAG;AAC5B,OAAG,UAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAChD;AACA,QAAM,SAAS,UAAU;AACzB,SAAO,QAAQ;AACf,KAAG,cAAc,aAAa,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AACjE;AAEO,SAAS,YAA2B;AACvC,QAAM,SAAS,UAAU;AACzB,SAAO,IAAI,cAAc;AAAA,IACrB,OAAO,OAAO;AAAA,IACd,SAAS,QAAQ,IAAI;AAAA,EACzB,CAAC;AACL;","names":[]}
@@ -1,15 +0,0 @@
1
- import { BaseCommand } from '@nexical/cli-core';
2
-
3
- declare class AdminUsersCreateSystemCommand 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 { AdminUsersCreateSystemCommand as default };
@@ -1,49 +0,0 @@
1
- import { createRequire } from "module"; const require = createRequire(import.meta.url);
2
- import {
3
- getClient
4
- } from "../../../chunk-JDRAVUKK.js";
5
-
6
- // src/commands/admin/create-user.ts
7
- import { BaseCommand } from "@nexical/cli-core";
8
- var AdminUsersCreateSystemCommand = class extends BaseCommand {
9
- static description = "Create a new system user";
10
- static args = {
11
- args: [
12
- {
13
- name: "name",
14
- required: true,
15
- description: "System user name"
16
- },
17
- {
18
- name: "email",
19
- required: true,
20
- description: "System user email"
21
- },
22
- {
23
- name: "password",
24
- required: true,
25
- description: "System user password"
26
- }
27
- ]
28
- };
29
- async run(options) {
30
- const client = getClient();
31
- const { name, email, password } = options;
32
- try {
33
- const response = await client.auth.createSystemUser({
34
- fullName: name,
35
- email,
36
- password
37
- });
38
- const user = response.user;
39
- this.success(`System user "${user.fullName}" created!`);
40
- this.info(`ID: ${user.id}`);
41
- } catch (error) {
42
- this.error(`Failed to create system user: ${error.message}`);
43
- }
44
- }
45
- };
46
- export {
47
- AdminUsersCreateSystemCommand as default
48
- };
49
- //# sourceMappingURL=create-user.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/commands/admin/create-user.ts"],"sourcesContent":["\nimport { BaseCommand } from '@nexical/cli-core';\nimport { getClient } from '../../utils/nexical-client.js';\n\nexport default class AdminUsersCreateSystemCommand extends BaseCommand {\n static description = 'Create a new system user';\n\n static args = {\n args: [\n {\n name: 'name',\n required: true,\n description: 'System user name',\n },\n {\n name: 'email',\n required: true,\n description: 'System user email',\n },\n {\n name: 'password',\n required: true,\n description: 'System user password',\n },\n ],\n };\n\n async run(options: any) {\n const client = getClient();\n const { name, email, password } = options;\n\n try {\n const response = await client.auth.createSystemUser({\n fullName: name,\n email,\n password,\n });\n const user = response.user;\n\n this.success(`System user \"${user.fullName}\" created!`);\n this.info(`ID: ${user.id}`);\n } catch (error: any) {\n this.error(`Failed to create system user: ${error.message}`);\n }\n }\n}\n"],"mappings":";;;;;;AACA,SAAS,mBAAmB;AAG5B,IAAqB,gCAArB,cAA2D,YAAY;AAAA,EACnE,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,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,MAAM,OAAO,SAAS,IAAI;AAElC,QAAI;AACA,YAAM,WAAW,MAAM,OAAO,KAAK,iBAAiB;AAAA,QAChD,UAAU;AAAA,QACV;AAAA,QACA;AAAA,MACJ,CAAC;AACD,YAAM,OAAO,SAAS;AAEtB,WAAK,QAAQ,gBAAgB,KAAK,QAAQ,YAAY;AACtD,WAAK,KAAK,OAAO,KAAK,EAAE,EAAE;AAAA,IAC9B,SAAS,OAAY;AACjB,WAAK,MAAM,iCAAiC,MAAM,OAAO,EAAE;AAAA,IAC/D;AAAA,EACJ;AACJ;","names":[]}
@@ -1,19 +0,0 @@
1
- import { BaseCommand } from '@nexical/cli-core';
2
-
3
- declare class BranchesCreateCommand 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 { BranchesCreateCommand as default };
@@ -1,59 +0,0 @@
1
- import { createRequire } from "module"; const require = createRequire(import.meta.url);
2
- import {
3
- getClient
4
- } from "../../../chunk-JDRAVUKK.js";
5
-
6
- // src/commands/branch/create.ts
7
- import { BaseCommand } from "@nexical/cli-core";
8
- var BranchesCreateCommand = class extends BaseCommand {
9
- static description = "Create a new branch";
10
- static args = {
11
- args: [
12
- {
13
- name: "teamId",
14
- required: true,
15
- description: "Team ID"
16
- },
17
- {
18
- name: "projectId",
19
- required: true,
20
- description: "Project ID"
21
- },
22
- {
23
- name: "name",
24
- required: true,
25
- description: "Name of the branch"
26
- }
27
- ],
28
- options: [
29
- {
30
- name: "--preview <url>",
31
- description: "Preview URL"
32
- }
33
- ]
34
- };
35
- async run(options) {
36
- const client = getClient();
37
- const { teamId, projectId, name, preview } = options;
38
- const tid = parseInt(teamId, 10);
39
- const pid = parseInt(projectId, 10);
40
- if (isNaN(tid) || isNaN(pid)) {
41
- this.error("IDs must be numbers.");
42
- return;
43
- }
44
- try {
45
- const branch = await client.branches.create(tid, pid, {
46
- name,
47
- previewUrl: preview
48
- });
49
- this.success(`Branch "${branch.name}" created!`);
50
- this.info(`ID: ${branch.id}`);
51
- } catch (error) {
52
- this.error(`Failed to create branch: ${error.message}`);
53
- }
54
- }
55
- };
56
- export {
57
- BranchesCreateCommand as default
58
- };
59
- //# sourceMappingURL=create.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/commands/branch/create.ts"],"sourcesContent":["\nimport { BaseCommand } from '@nexical/cli-core';\nimport { getClient } from '../../utils/nexical-client.js';\n\nexport default class BranchesCreateCommand extends BaseCommand {\n static description = 'Create a new branch';\n\n static args = {\n args: [\n {\n name: 'teamId',\n required: true,\n description: 'Team ID',\n },\n {\n name: 'projectId',\n required: true,\n description: 'Project ID',\n },\n {\n name: 'name',\n required: true,\n description: 'Name of the branch',\n },\n ],\n options: [\n {\n name: '--preview <url>',\n description: 'Preview URL',\n },\n ],\n };\n\n async run(options: any) {\n const client = getClient();\n const { teamId, projectId, name, preview } = options;\n const tid = parseInt(teamId, 10);\n const pid = parseInt(projectId, 10);\n\n if (isNaN(tid) || isNaN(pid)) {\n this.error('IDs must be numbers.');\n return;\n }\n\n try {\n const branch = await client.branches.create(tid, pid, {\n name,\n previewUrl: preview,\n });\n\n this.success(`Branch \"${branch.name}\" created!`);\n this.info(`ID: ${branch.id}`);\n } catch (error: any) {\n this.error(`Failed to create branch: ${error.message}`);\n }\n }\n}\n"],"mappings":";;;;;;AACA,SAAS,mBAAmB;AAG5B,IAAqB,wBAArB,cAAmD,YAAY;AAAA,EAC3D,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,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,MACjB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,IAAI,SAAc;AACpB,UAAM,SAAS,UAAU;AACzB,UAAM,EAAE,QAAQ,WAAW,MAAM,QAAQ,IAAI;AAC7C,UAAM,MAAM,SAAS,QAAQ,EAAE;AAC/B,UAAM,MAAM,SAAS,WAAW,EAAE;AAElC,QAAI,MAAM,GAAG,KAAK,MAAM,GAAG,GAAG;AAC1B,WAAK,MAAM,sBAAsB;AACjC;AAAA,IACJ;AAEA,QAAI;AACA,YAAM,SAAS,MAAM,OAAO,SAAS,OAAO,KAAK,KAAK;AAAA,QAClD;AAAA,QACA,YAAY;AAAA,MAChB,CAAC;AAED,WAAK,QAAQ,WAAW,OAAO,IAAI,YAAY;AAC/C,WAAK,KAAK,OAAO,OAAO,EAAE,EAAE;AAAA,IAChC,SAAS,OAAY;AACjB,WAAK,MAAM,4BAA4B,MAAM,OAAO,EAAE;AAAA,IAC1D;AAAA,EACJ;AACJ;","names":[]}
@@ -1,15 +0,0 @@
1
- import { BaseCommand } from '@nexical/cli-core';
2
-
3
- declare class BranchesDeleteCommand 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 { BranchesDeleteCommand as default };
@@ -1,50 +0,0 @@
1
- import { createRequire } from "module"; const require = createRequire(import.meta.url);
2
- import {
3
- getClient
4
- } from "../../../chunk-JDRAVUKK.js";
5
-
6
- // src/commands/branch/delete.ts
7
- import { BaseCommand } from "@nexical/cli-core";
8
- var BranchesDeleteCommand = class extends BaseCommand {
9
- static description = "Delete a branch";
10
- static args = {
11
- args: [
12
- {
13
- name: "teamId",
14
- required: true,
15
- description: "Team ID"
16
- },
17
- {
18
- name: "projectId",
19
- required: true,
20
- description: "Project ID"
21
- },
22
- {
23
- name: "branchId",
24
- required: true,
25
- description: "Branch ID"
26
- }
27
- ]
28
- };
29
- async run(options) {
30
- const client = getClient();
31
- const { teamId, projectId, branchId } = options;
32
- const tid = parseInt(teamId, 10);
33
- const pid = parseInt(projectId, 10);
34
- const bid = parseInt(branchId, 10);
35
- if (isNaN(tid) || isNaN(pid) || isNaN(bid)) {
36
- this.error("IDs must be numbers.");
37
- return;
38
- }
39
- try {
40
- await client.branches.delete(tid, pid, bid);
41
- this.success(`Branch ${bid} deleted.`);
42
- } catch (error) {
43
- this.error(`Failed to delete branch: ${error.message}`);
44
- }
45
- }
46
- };
47
- export {
48
- BranchesDeleteCommand as default
49
- };
50
- //# sourceMappingURL=delete.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/commands/branch/delete.ts"],"sourcesContent":["\nimport { BaseCommand } from '@nexical/cli-core';\nimport { getClient } from '../../utils/nexical-client.js';\n\nexport default class BranchesDeleteCommand extends BaseCommand {\n static description = 'Delete a branch';\n\n static args = {\n args: [\n {\n name: 'teamId',\n required: true,\n description: 'Team ID',\n },\n {\n name: 'projectId',\n required: true,\n description: 'Project ID',\n },\n {\n name: 'branchId',\n required: true,\n description: 'Branch ID',\n },\n ],\n };\n\n async run(options: any) {\n const client = getClient();\n const { teamId, projectId, branchId } = options;\n const tid = parseInt(teamId, 10);\n const pid = parseInt(projectId, 10);\n const bid = parseInt(branchId, 10);\n\n if (isNaN(tid) || isNaN(pid) || isNaN(bid)) {\n this.error('IDs must be numbers.');\n return;\n }\n\n try {\n await client.branches.delete(tid, pid, bid);\n this.success(`Branch ${bid} deleted.`);\n } catch (error: any) {\n this.error(`Failed to delete branch: ${error.message}`);\n }\n }\n}\n"],"mappings":";;;;;;AACA,SAAS,mBAAmB;AAG5B,IAAqB,wBAArB,cAAmD,YAAY;AAAA,EAC3D,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,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,WAAW,SAAS,IAAI;AACxC,UAAM,MAAM,SAAS,QAAQ,EAAE;AAC/B,UAAM,MAAM,SAAS,WAAW,EAAE;AAClC,UAAM,MAAM,SAAS,UAAU,EAAE;AAEjC,QAAI,MAAM,GAAG,KAAK,MAAM,GAAG,KAAK,MAAM,GAAG,GAAG;AACxC,WAAK,MAAM,sBAAsB;AACjC;AAAA,IACJ;AAEA,QAAI;AACA,YAAM,OAAO,SAAS,OAAO,KAAK,KAAK,GAAG;AAC1C,WAAK,QAAQ,UAAU,GAAG,WAAW;AAAA,IACzC,SAAS,OAAY;AACjB,WAAK,MAAM,4BAA4B,MAAM,OAAO,EAAE;AAAA,IAC1D;AAAA,EACJ;AACJ;","names":[]}
@@ -1,15 +0,0 @@
1
- import { BaseCommand } from '@nexical/cli-core';
2
-
3
- declare class BranchesGetCommand 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 { BranchesGetCommand as default };