@sembix/cli 1.3.0 → 1.4.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 (196) hide show
  1. package/COMMANDS.md +1522 -0
  2. package/QUICKSTART.md +829 -0
  3. package/README.md +1949 -285
  4. package/USAGE-EXAMPLES.md +872 -0
  5. package/dist/commands/configure.d.ts.map +1 -1
  6. package/dist/commands/configure.js +172 -2
  7. package/dist/commands/configure.js.map +1 -1
  8. package/dist/commands/index.d.ts +10 -0
  9. package/dist/commands/index.d.ts.map +1 -0
  10. package/dist/commands/index.js +11 -0
  11. package/dist/commands/index.js.map +1 -0
  12. package/dist/commands/login.d.ts +19 -0
  13. package/dist/commands/login.d.ts.map +1 -0
  14. package/dist/commands/login.js +118 -0
  15. package/dist/commands/login.js.map +1 -0
  16. package/dist/commands/logout.d.ts +21 -0
  17. package/dist/commands/logout.d.ts.map +1 -0
  18. package/dist/commands/logout.js +66 -0
  19. package/dist/commands/logout.js.map +1 -0
  20. package/dist/commands/profile-project.d.ts +14 -0
  21. package/dist/commands/profile-project.d.ts.map +1 -0
  22. package/dist/commands/profile-project.js +123 -0
  23. package/dist/commands/profile-project.js.map +1 -0
  24. package/dist/commands/profile.d.ts +26 -0
  25. package/dist/commands/profile.d.ts.map +1 -0
  26. package/dist/commands/profile.js +177 -0
  27. package/dist/commands/profile.js.map +1 -0
  28. package/dist/commands/project.d.ts +16 -0
  29. package/dist/commands/project.d.ts.map +1 -0
  30. package/dist/commands/project.js +153 -0
  31. package/dist/commands/project.js.map +1 -0
  32. package/dist/commands/workflow.d.ts +91 -0
  33. package/dist/commands/workflow.d.ts.map +1 -0
  34. package/dist/commands/workflow.js +1201 -0
  35. package/dist/commands/workflow.js.map +1 -0
  36. package/dist/config-schema.d.ts +23 -0
  37. package/dist/config-schema.d.ts.map +1 -1
  38. package/dist/config-schema.js +21 -1
  39. package/dist/config-schema.js.map +1 -1
  40. package/dist/config.d.ts +4 -0
  41. package/dist/config.d.ts.map +1 -1
  42. package/dist/config.js +23 -2
  43. package/dist/config.js.map +1 -1
  44. package/dist/index.js +318 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/prompts/project-selection.d.ts +8 -0
  47. package/dist/prompts/project-selection.d.ts.map +1 -0
  48. package/dist/prompts/project-selection.js +132 -0
  49. package/dist/prompts/project-selection.js.map +1 -0
  50. package/dist/prompts/workflow-inputs.d.ts +10 -0
  51. package/dist/prompts/workflow-inputs.d.ts.map +1 -0
  52. package/dist/prompts/workflow-inputs.js +71 -0
  53. package/dist/prompts/workflow-inputs.js.map +1 -0
  54. package/dist/prompts/workflow-selection.d.ts +8 -0
  55. package/dist/prompts/workflow-selection.d.ts.map +1 -0
  56. package/dist/prompts/workflow-selection.js +147 -0
  57. package/dist/prompts/workflow-selection.js.map +1 -0
  58. package/dist/sembix-cli-1.4.0.tgz +0 -0
  59. package/dist/services/cognito-auth.d.ts +92 -0
  60. package/dist/services/cognito-auth.d.ts.map +1 -0
  61. package/dist/services/cognito-auth.js +319 -0
  62. package/dist/services/cognito-auth.js.map +1 -0
  63. package/dist/services/studio-api-client.d.ts +127 -0
  64. package/dist/services/studio-api-client.d.ts.map +1 -0
  65. package/dist/services/studio-api-client.js +291 -0
  66. package/dist/services/studio-api-client.js.map +1 -0
  67. package/dist/types/studio.d.ts +82 -0
  68. package/dist/types/studio.d.ts.map +1 -0
  69. package/dist/types/studio.js +7 -0
  70. package/dist/types/studio.js.map +1 -0
  71. package/dist/types.d.ts +283 -0
  72. package/dist/types.d.ts.map +1 -1
  73. package/dist/types.js +5 -0
  74. package/dist/types.js.map +1 -1
  75. package/dist/utils/browser-auth.d.ts +45 -0
  76. package/dist/utils/browser-auth.d.ts.map +1 -0
  77. package/dist/utils/browser-auth.js +168 -0
  78. package/dist/utils/browser-auth.js.map +1 -0
  79. package/dist/utils/cognito-auth.d.ts +3 -0
  80. package/dist/utils/cognito-auth.d.ts.map +1 -0
  81. package/dist/utils/cognito-auth.js +3 -0
  82. package/dist/utils/cognito-auth.js.map +1 -0
  83. package/dist/utils/config-file.d.ts +40 -0
  84. package/dist/utils/config-file.d.ts.map +1 -1
  85. package/dist/utils/config-file.js +158 -4
  86. package/dist/utils/config-file.js.map +1 -1
  87. package/dist/utils/environment.d.ts +22 -0
  88. package/dist/utils/environment.d.ts.map +1 -0
  89. package/dist/utils/environment.js +39 -0
  90. package/dist/utils/environment.js.map +1 -0
  91. package/dist/utils/error-handler.d.ts +53 -0
  92. package/dist/utils/error-handler.d.ts.map +1 -0
  93. package/dist/utils/error-handler.js +174 -0
  94. package/dist/utils/error-handler.js.map +1 -0
  95. package/dist/utils/fuzzy-match.d.ts +31 -0
  96. package/dist/utils/fuzzy-match.d.ts.map +1 -0
  97. package/dist/utils/fuzzy-match.js +138 -0
  98. package/dist/utils/fuzzy-match.js.map +1 -0
  99. package/dist/utils/input-parser.d.ts +14 -0
  100. package/dist/utils/input-parser.d.ts.map +1 -0
  101. package/dist/utils/input-parser.js +34 -0
  102. package/dist/utils/input-parser.js.map +1 -0
  103. package/dist/utils/output.d.ts +55 -0
  104. package/dist/utils/output.d.ts.map +1 -0
  105. package/dist/utils/output.js +80 -0
  106. package/dist/utils/output.js.map +1 -0
  107. package/dist/utils/recent-workflows.d.ts +37 -0
  108. package/dist/utils/recent-workflows.d.ts.map +1 -0
  109. package/dist/utils/recent-workflows.js +172 -0
  110. package/dist/utils/recent-workflows.js.map +1 -0
  111. package/dist/utils/studio-api-client.d.ts +3 -0
  112. package/dist/utils/studio-api-client.d.ts.map +1 -0
  113. package/dist/utils/studio-api-client.js +3 -0
  114. package/dist/utils/studio-api-client.js.map +1 -0
  115. package/dist/utils/studio-api.d.ts +53 -0
  116. package/dist/utils/studio-api.d.ts.map +1 -0
  117. package/dist/utils/studio-api.js +102 -0
  118. package/dist/utils/studio-api.js.map +1 -0
  119. package/dist/utils/studio-config.d.ts +74 -0
  120. package/dist/utils/studio-config.d.ts.map +1 -0
  121. package/dist/utils/studio-config.js +213 -0
  122. package/dist/utils/studio-config.js.map +1 -0
  123. package/dist/utils/token-manager.d.ts +4 -0
  124. package/dist/utils/token-manager.d.ts.map +1 -0
  125. package/dist/utils/token-manager.js +3 -0
  126. package/dist/utils/token-manager.js.map +1 -0
  127. package/dist/utils/ui.d.ts +55 -1
  128. package/dist/utils/ui.d.ts.map +1 -1
  129. package/dist/utils/ui.js +151 -2
  130. package/dist/utils/ui.js.map +1 -1
  131. package/package.json +4 -1
  132. package/dist/__tests__/config-schema.test.d.ts +0 -2
  133. package/dist/__tests__/config-schema.test.d.ts.map +0 -1
  134. package/dist/__tests__/config-schema.test.js +0 -471
  135. package/dist/__tests__/config-schema.test.js.map +0 -1
  136. package/dist/__tests__/config.test.d.ts +0 -2
  137. package/dist/__tests__/config.test.d.ts.map +0 -1
  138. package/dist/__tests__/config.test.js +0 -75
  139. package/dist/__tests__/config.test.js.map +0 -1
  140. package/dist/__tests__/integration/configure.test.d.ts +0 -2
  141. package/dist/__tests__/integration/configure.test.d.ts.map +0 -1
  142. package/dist/__tests__/integration/configure.test.js +0 -247
  143. package/dist/__tests__/integration/configure.test.js.map +0 -1
  144. package/dist/__tests__/integration/fixtures/configs.d.ts +0 -477
  145. package/dist/__tests__/integration/fixtures/configs.d.ts.map +0 -1
  146. package/dist/__tests__/integration/fixtures/configs.js +0 -175
  147. package/dist/__tests__/integration/fixtures/configs.js.map +0 -1
  148. package/dist/__tests__/integration/helpers/cli-runner.d.ts +0 -63
  149. package/dist/__tests__/integration/helpers/cli-runner.d.ts.map +0 -1
  150. package/dist/__tests__/integration/helpers/cli-runner.js +0 -152
  151. package/dist/__tests__/integration/helpers/cli-runner.js.map +0 -1
  152. package/dist/__tests__/integration/helpers/command-runner.d.ts +0 -53
  153. package/dist/__tests__/integration/helpers/command-runner.d.ts.map +0 -1
  154. package/dist/__tests__/integration/helpers/command-runner.js +0 -117
  155. package/dist/__tests__/integration/helpers/command-runner.js.map +0 -1
  156. package/dist/__tests__/integration/studio-create.test.d.ts +0 -2
  157. package/dist/__tests__/integration/studio-create.test.d.ts.map +0 -1
  158. package/dist/__tests__/integration/studio-create.test.js +0 -209
  159. package/dist/__tests__/integration/studio-create.test.js.map +0 -1
  160. package/dist/__tests__/integration/studio-update.test.d.ts +0 -2
  161. package/dist/__tests__/integration/studio-update.test.d.ts.map +0 -1
  162. package/dist/__tests__/integration/studio-update.test.js +0 -166
  163. package/dist/__tests__/integration/studio-update.test.js.map +0 -1
  164. package/dist/commands/__tests__/configure.test.d.ts +0 -2
  165. package/dist/commands/__tests__/configure.test.d.ts.map +0 -1
  166. package/dist/commands/__tests__/configure.test.js +0 -229
  167. package/dist/commands/__tests__/configure.test.js.map +0 -1
  168. package/dist/prompts/__tests__/environment-setup.test.d.ts +0 -2
  169. package/dist/prompts/__tests__/environment-setup.test.d.ts.map +0 -1
  170. package/dist/prompts/__tests__/environment-setup.test.js +0 -206
  171. package/dist/prompts/__tests__/environment-setup.test.js.map +0 -1
  172. package/dist/prompts/__tests__/hub-integration.test.d.ts +0 -2
  173. package/dist/prompts/__tests__/hub-integration.test.d.ts.map +0 -1
  174. package/dist/prompts/__tests__/hub-integration.test.js +0 -126
  175. package/dist/prompts/__tests__/hub-integration.test.js.map +0 -1
  176. package/dist/prompts/__tests__/prompt-helpers.test.d.ts +0 -2
  177. package/dist/prompts/__tests__/prompt-helpers.test.d.ts.map +0 -1
  178. package/dist/prompts/__tests__/prompt-helpers.test.js +0 -235
  179. package/dist/prompts/__tests__/prompt-helpers.test.js.map +0 -1
  180. package/dist/sembix-cli-1.3.0.tgz +0 -0
  181. package/dist/utils/__tests__/config-file.test.d.ts +0 -2
  182. package/dist/utils/__tests__/config-file.test.d.ts.map +0 -1
  183. package/dist/utils/__tests__/config-file.test.js +0 -218
  184. package/dist/utils/__tests__/config-file.test.js.map +0 -1
  185. package/dist/utils/__tests__/config-loader.test.d.ts +0 -2
  186. package/dist/utils/__tests__/config-loader.test.d.ts.map +0 -1
  187. package/dist/utils/__tests__/config-loader.test.js +0 -325
  188. package/dist/utils/__tests__/config-loader.test.js.map +0 -1
  189. package/dist/utils/__tests__/github.test.d.ts +0 -2
  190. package/dist/utils/__tests__/github.test.d.ts.map +0 -1
  191. package/dist/utils/__tests__/github.test.js +0 -282
  192. package/dist/utils/__tests__/github.test.js.map +0 -1
  193. package/dist/utils/__tests__/ui.test.d.ts +0 -2
  194. package/dist/utils/__tests__/ui.test.d.ts.map +0 -1
  195. package/dist/utils/__tests__/ui.test.js +0 -256
  196. package/dist/utils/__tests__/ui.test.js.map +0 -1
@@ -1,247 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
- import { promises as fs } from 'fs';
3
- import { existsSync } from 'fs';
4
- import { configureCommand } from '../../commands/configure.js';
5
- import * as prompts from '@inquirer/prompts';
6
- import { join } from 'path';
7
- // Mock prompts
8
- vi.mock('@inquirer/prompts');
9
- // Mock chalk to avoid ANSI codes in tests
10
- const createChalkMock = () => {
11
- const mockFn = (str) => str;
12
- return new Proxy(mockFn, {
13
- get: () => createChalkMock(),
14
- apply: (target, thisArg, args) => args[0],
15
- });
16
- };
17
- vi.mock('chalk', () => ({
18
- default: createChalkMock(),
19
- }));
20
- // Mock ui utilities
21
- vi.mock('../../utils/ui.js', () => ({
22
- banner: vi.fn(),
23
- highlight: vi.fn((text) => text),
24
- dim: vi.fn((text) => text),
25
- success: vi.fn(),
26
- spinner: vi.fn(() => ({ stop: vi.fn() })),
27
- }));
28
- // Mock os.homedir to use temp directory for tests
29
- // Use process.cwd() with manual path construction to avoid hoisting issues
30
- vi.mock('os', () => {
31
- return {
32
- homedir: vi.fn(() => `${process.cwd()}/.tmp-test/sembix-test-integration`),
33
- tmpdir: () => '/tmp',
34
- };
35
- });
36
- const mockPassword = vi.mocked(prompts.password);
37
- const mockInput = vi.mocked(prompts.input);
38
- const mockConfirm = vi.mocked(prompts.confirm);
39
- describe('configure command - Integration Tests', () => {
40
- const testConfigDir = `${process.cwd()}/.tmp-test/sembix-test-integration`;
41
- const configPath = join(testConfigDir, '.sembix', 'config');
42
- beforeEach(async () => {
43
- vi.clearAllMocks();
44
- // Clean up test directory
45
- try {
46
- await fs.rm(join(testConfigDir, '.sembix'), { recursive: true, force: true });
47
- }
48
- catch {
49
- // Ignore if doesn't exist
50
- }
51
- });
52
- afterEach(async () => {
53
- // Clean up after tests
54
- try {
55
- await fs.rm(join(testConfigDir, '.sembix'), { recursive: true, force: true });
56
- }
57
- catch {
58
- // Ignore cleanup errors
59
- }
60
- });
61
- describe('first-time configuration', () => {
62
- it('should create config directory and file', async () => {
63
- mockPassword.mockResolvedValue('ghp_testtoken123');
64
- mockInput.mockResolvedValue('test-org');
65
- await configureCommand();
66
- // Verify directory was created
67
- expect(existsSync(join(testConfigDir, '.sembix'))).toBe(true);
68
- // Verify file was created
69
- expect(existsSync(configPath)).toBe(true);
70
- // Verify content
71
- const content = await fs.readFile(configPath, 'utf-8');
72
- expect(content).toContain('github_token=ghp_testtoken123');
73
- expect(content).toContain('default_github_org=test-org');
74
- });
75
- it('should create config with token only', async () => {
76
- mockPassword.mockResolvedValue('ghp_testtoken456');
77
- mockInput.mockResolvedValue('');
78
- await configureCommand();
79
- const content = await fs.readFile(configPath, 'utf-8');
80
- expect(content).toContain('github_token=ghp_testtoken456');
81
- expect(content).not.toContain('default_github_org=');
82
- });
83
- it('should set correct file permissions (0600)', async () => {
84
- mockPassword.mockResolvedValue('ghp_testtoken789');
85
- mockInput.mockResolvedValue('');
86
- await configureCommand();
87
- const stats = await fs.stat(configPath);
88
- // Check that file is readable and writable by owner only
89
- // 0o100600 is the full mode including file type bits
90
- expect(stats.mode & 0o777).toBe(0o600);
91
- });
92
- it('should include header comments in config file', async () => {
93
- mockPassword.mockResolvedValue('ghp_testtoken');
94
- mockInput.mockResolvedValue('');
95
- await configureCommand();
96
- const content = await fs.readFile(configPath, 'utf-8');
97
- expect(content).toContain('# Sembix CLI Configuration');
98
- expect(content).toContain('# Generated by: sembix configure');
99
- });
100
- });
101
- describe('updating existing configuration', () => {
102
- it('should preserve existing token when user chooses to keep it', async () => {
103
- // Create initial config
104
- mockPassword.mockResolvedValue('ghp_initialtoken');
105
- mockInput.mockResolvedValue('initial-org');
106
- await configureCommand();
107
- // Update config, keeping token
108
- vi.clearAllMocks();
109
- mockConfirm.mockResolvedValue(true); // Keep existing token
110
- mockInput.mockResolvedValue('updated-org');
111
- await configureCommand();
112
- const content = await fs.readFile(configPath, 'utf-8');
113
- expect(content).toContain('github_token=ghp_initialtoken');
114
- expect(content).toContain('default_github_org=updated-org');
115
- });
116
- it('should update token when user chooses to replace it', async () => {
117
- // Create initial config
118
- mockPassword.mockResolvedValue('ghp_initialtoken');
119
- mockInput.mockResolvedValue('initial-org');
120
- await configureCommand();
121
- // Update config, replacing token
122
- vi.clearAllMocks();
123
- mockConfirm.mockResolvedValue(false); // Replace token
124
- mockPassword.mockResolvedValue('ghp_newtoken');
125
- mockInput.mockResolvedValue('initial-org');
126
- await configureCommand();
127
- const content = await fs.readFile(configPath, 'utf-8');
128
- expect(content).toContain('github_token=ghp_newtoken');
129
- expect(content).not.toContain('ghp_initialtoken');
130
- });
131
- it('should handle removing org by setting empty value', async () => {
132
- // Create initial config with org
133
- mockPassword.mockResolvedValue('ghp_token');
134
- mockInput.mockResolvedValue('some-org');
135
- await configureCommand();
136
- // Update config, removing org
137
- vi.clearAllMocks();
138
- mockConfirm.mockResolvedValue(true);
139
- mockInput.mockResolvedValue('');
140
- await configureCommand();
141
- const content = await fs.readFile(configPath, 'utf-8');
142
- expect(content).toContain('github_token=ghp_token');
143
- expect(content).not.toContain('default_github_org=');
144
- });
145
- });
146
- describe('config file parsing', () => {
147
- it('should correctly read back written configuration', async () => {
148
- const testToken = 'ghp_roundtriptest';
149
- const testOrg = 'roundtrip-org';
150
- mockPassword.mockResolvedValue(testToken);
151
- mockInput.mockResolvedValue(testOrg);
152
- await configureCommand();
153
- // Read the config file directly
154
- const content = await fs.readFile(configPath, 'utf-8');
155
- const lines = content.split('\n');
156
- const tokenLine = lines.find((line) => line.startsWith('github_token='));
157
- const orgLine = lines.find((line) => line.startsWith('default_github_org='));
158
- expect(tokenLine).toBe(`github_token=${testToken}`);
159
- expect(orgLine).toBe(`default_github_org=${testOrg}`);
160
- });
161
- it('should handle special characters in values', async () => {
162
- const tokenWithSpecialChars = 'ghp_test-token.with_special/chars123';
163
- const orgWithSpecialChars = 'org-name_with.special-chars';
164
- mockPassword.mockResolvedValue(tokenWithSpecialChars);
165
- mockInput.mockResolvedValue(orgWithSpecialChars);
166
- await configureCommand();
167
- const content = await fs.readFile(configPath, 'utf-8');
168
- expect(content).toContain(`github_token=${tokenWithSpecialChars}`);
169
- expect(content).toContain(`default_github_org=${orgWithSpecialChars}`);
170
- });
171
- });
172
- describe('error scenarios', () => {
173
- it('should handle write permission errors', async () => {
174
- // Create config directory with no write permissions
175
- await fs.mkdir(join(testConfigDir, '.sembix'), { recursive: true, mode: 0o555 });
176
- mockPassword.mockResolvedValue('ghp_testtoken');
177
- mockInput.mockResolvedValue('test-org');
178
- await expect(configureCommand()).rejects.toThrow(/Failed to save configuration/);
179
- // Cleanup: restore permissions
180
- await fs.chmod(join(testConfigDir, '.sembix'), 0o755);
181
- });
182
- it('should validate token format', async () => {
183
- mockPassword.mockResolvedValue('ghp_validtoken');
184
- mockInput.mockResolvedValue('');
185
- await configureCommand();
186
- // Get the validation function that was passed to password()
187
- const passwordOptions = mockPassword.mock.calls[0][0];
188
- const validate = passwordOptions.validate;
189
- expect(validate).toBeDefined();
190
- if (validate) {
191
- // Test valid tokens
192
- expect(validate('ghp_validtoken123')).toBe(true);
193
- expect(validate('github_pat_validtoken456')).toBe(true);
194
- // Test invalid tokens
195
- expect(validate('')).toBe('GitHub token is required');
196
- expect(validate(' ')).toBe('GitHub token is required');
197
- expect(validate('invalid_prefix_token')).toBe('Token should start with ghp_ or github_pat_');
198
- }
199
- });
200
- });
201
- describe('sequential updates', () => {
202
- it('should handle multiple updates correctly', async () => {
203
- // First update
204
- mockPassword.mockResolvedValue('ghp_token1');
205
- mockInput.mockResolvedValue('org1');
206
- await configureCommand();
207
- let content = await fs.readFile(configPath, 'utf-8');
208
- expect(content).toContain('github_token=ghp_token1');
209
- expect(content).toContain('default_github_org=org1');
210
- // Second update - change org, keep token
211
- vi.clearAllMocks();
212
- mockConfirm.mockResolvedValue(true); // Keep token
213
- mockInput.mockResolvedValue('org2');
214
- await configureCommand();
215
- content = await fs.readFile(configPath, 'utf-8');
216
- expect(content).toContain('github_token=ghp_token1');
217
- expect(content).toContain('default_github_org=org2');
218
- // Third update - change token
219
- vi.clearAllMocks();
220
- mockConfirm.mockResolvedValue(false); // Replace token
221
- mockPassword.mockResolvedValue('ghp_token3');
222
- mockInput.mockResolvedValue('org3');
223
- await configureCommand();
224
- content = await fs.readFile(configPath, 'utf-8');
225
- expect(content).toContain('github_token=ghp_token3');
226
- expect(content).toContain('default_github_org=org3');
227
- });
228
- });
229
- describe('config file format validation', () => {
230
- it('should maintain INI format with proper structure', async () => {
231
- mockPassword.mockResolvedValue('ghp_formattest');
232
- mockInput.mockResolvedValue('format-org');
233
- await configureCommand();
234
- const content = await fs.readFile(configPath, 'utf-8');
235
- const lines = content.split('\n').filter((line) => line.trim() !== '');
236
- // Check header comments exist
237
- expect(lines[0]).toMatch(/^#/);
238
- expect(lines[1]).toMatch(/^#/);
239
- // Check key=value format
240
- const configLines = lines.filter((line) => !line.startsWith('#') && !line.startsWith(';'));
241
- for (const line of configLines) {
242
- expect(line).toMatch(/^[a-z_]+=.+$/);
243
- }
244
- });
245
- });
246
- });
247
- //# sourceMappingURL=configure.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"configure.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/configure.test.ts"],"names":[],"mappings":"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"}