@sembix/cli 1.2.1 → 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 (205) hide show
  1. package/COMMANDS.md +1522 -0
  2. package/QUICKSTART.md +829 -0
  3. package/README.md +1976 -309
  4. package/USAGE-EXAMPLES.md +872 -0
  5. package/config.example.yaml +3 -0
  6. package/dist/commands/configure.d.ts.map +1 -1
  7. package/dist/commands/configure.js +172 -2
  8. package/dist/commands/configure.js.map +1 -1
  9. package/dist/commands/index.d.ts +10 -0
  10. package/dist/commands/index.d.ts.map +1 -0
  11. package/dist/commands/index.js +11 -0
  12. package/dist/commands/index.js.map +1 -0
  13. package/dist/commands/login.d.ts +19 -0
  14. package/dist/commands/login.d.ts.map +1 -0
  15. package/dist/commands/login.js +118 -0
  16. package/dist/commands/login.js.map +1 -0
  17. package/dist/commands/logout.d.ts +21 -0
  18. package/dist/commands/logout.d.ts.map +1 -0
  19. package/dist/commands/logout.js +66 -0
  20. package/dist/commands/logout.js.map +1 -0
  21. package/dist/commands/profile-project.d.ts +14 -0
  22. package/dist/commands/profile-project.d.ts.map +1 -0
  23. package/dist/commands/profile-project.js +123 -0
  24. package/dist/commands/profile-project.js.map +1 -0
  25. package/dist/commands/profile.d.ts +26 -0
  26. package/dist/commands/profile.d.ts.map +1 -0
  27. package/dist/commands/profile.js +177 -0
  28. package/dist/commands/profile.js.map +1 -0
  29. package/dist/commands/project.d.ts +16 -0
  30. package/dist/commands/project.d.ts.map +1 -0
  31. package/dist/commands/project.js +153 -0
  32. package/dist/commands/project.js.map +1 -0
  33. package/dist/commands/setup.js +3 -0
  34. package/dist/commands/setup.js.map +1 -1
  35. package/dist/commands/workflow.d.ts +91 -0
  36. package/dist/commands/workflow.d.ts.map +1 -0
  37. package/dist/commands/workflow.js +1201 -0
  38. package/dist/commands/workflow.js.map +1 -0
  39. package/dist/config-schema.d.ts +26 -0
  40. package/dist/config-schema.d.ts.map +1 -1
  41. package/dist/config-schema.js +24 -1
  42. package/dist/config-schema.js.map +1 -1
  43. package/dist/config.d.ts +4 -0
  44. package/dist/config.d.ts.map +1 -1
  45. package/dist/config.js +23 -2
  46. package/dist/config.js.map +1 -1
  47. package/dist/index.js +324 -1
  48. package/dist/index.js.map +1 -1
  49. package/dist/prompts/environment-setup.d.ts.map +1 -1
  50. package/dist/prompts/environment-setup.js +12 -0
  51. package/dist/prompts/environment-setup.js.map +1 -1
  52. package/dist/prompts/project-selection.d.ts +8 -0
  53. package/dist/prompts/project-selection.d.ts.map +1 -0
  54. package/dist/prompts/project-selection.js +132 -0
  55. package/dist/prompts/project-selection.js.map +1 -0
  56. package/dist/prompts/workflow-inputs.d.ts +10 -0
  57. package/dist/prompts/workflow-inputs.d.ts.map +1 -0
  58. package/dist/prompts/workflow-inputs.js +71 -0
  59. package/dist/prompts/workflow-inputs.js.map +1 -0
  60. package/dist/prompts/workflow-selection.d.ts +8 -0
  61. package/dist/prompts/workflow-selection.d.ts.map +1 -0
  62. package/dist/prompts/workflow-selection.js +147 -0
  63. package/dist/prompts/workflow-selection.js.map +1 -0
  64. package/dist/sembix-cli-1.4.0.tgz +0 -0
  65. package/dist/services/cognito-auth.d.ts +92 -0
  66. package/dist/services/cognito-auth.d.ts.map +1 -0
  67. package/dist/services/cognito-auth.js +319 -0
  68. package/dist/services/cognito-auth.js.map +1 -0
  69. package/dist/services/studio-api-client.d.ts +127 -0
  70. package/dist/services/studio-api-client.d.ts.map +1 -0
  71. package/dist/services/studio-api-client.js +291 -0
  72. package/dist/services/studio-api-client.js.map +1 -0
  73. package/dist/types/studio.d.ts +82 -0
  74. package/dist/types/studio.d.ts.map +1 -0
  75. package/dist/types/studio.js +7 -0
  76. package/dist/types/studio.js.map +1 -0
  77. package/dist/types.d.ts +286 -0
  78. package/dist/types.d.ts.map +1 -1
  79. package/dist/types.js +5 -0
  80. package/dist/types.js.map +1 -1
  81. package/dist/utils/browser-auth.d.ts +45 -0
  82. package/dist/utils/browser-auth.d.ts.map +1 -0
  83. package/dist/utils/browser-auth.js +168 -0
  84. package/dist/utils/browser-auth.js.map +1 -0
  85. package/dist/utils/cognito-auth.d.ts +3 -0
  86. package/dist/utils/cognito-auth.d.ts.map +1 -0
  87. package/dist/utils/cognito-auth.js +3 -0
  88. package/dist/utils/cognito-auth.js.map +1 -0
  89. package/dist/utils/config-file.d.ts +40 -0
  90. package/dist/utils/config-file.d.ts.map +1 -1
  91. package/dist/utils/config-file.js +158 -4
  92. package/dist/utils/config-file.js.map +1 -1
  93. package/dist/utils/config-loader.d.ts.map +1 -1
  94. package/dist/utils/config-loader.js +15 -2
  95. package/dist/utils/config-loader.js.map +1 -1
  96. package/dist/utils/environment.d.ts +22 -0
  97. package/dist/utils/environment.d.ts.map +1 -0
  98. package/dist/utils/environment.js +39 -0
  99. package/dist/utils/environment.js.map +1 -0
  100. package/dist/utils/error-handler.d.ts +53 -0
  101. package/dist/utils/error-handler.d.ts.map +1 -0
  102. package/dist/utils/error-handler.js +174 -0
  103. package/dist/utils/error-handler.js.map +1 -0
  104. package/dist/utils/fuzzy-match.d.ts +31 -0
  105. package/dist/utils/fuzzy-match.d.ts.map +1 -0
  106. package/dist/utils/fuzzy-match.js +138 -0
  107. package/dist/utils/fuzzy-match.js.map +1 -0
  108. package/dist/utils/input-parser.d.ts +14 -0
  109. package/dist/utils/input-parser.d.ts.map +1 -0
  110. package/dist/utils/input-parser.js +34 -0
  111. package/dist/utils/input-parser.js.map +1 -0
  112. package/dist/utils/output.d.ts +55 -0
  113. package/dist/utils/output.d.ts.map +1 -0
  114. package/dist/utils/output.js +80 -0
  115. package/dist/utils/output.js.map +1 -0
  116. package/dist/utils/recent-workflows.d.ts +37 -0
  117. package/dist/utils/recent-workflows.d.ts.map +1 -0
  118. package/dist/utils/recent-workflows.js +172 -0
  119. package/dist/utils/recent-workflows.js.map +1 -0
  120. package/dist/utils/studio-api-client.d.ts +3 -0
  121. package/dist/utils/studio-api-client.d.ts.map +1 -0
  122. package/dist/utils/studio-api-client.js +3 -0
  123. package/dist/utils/studio-api-client.js.map +1 -0
  124. package/dist/utils/studio-api.d.ts +53 -0
  125. package/dist/utils/studio-api.d.ts.map +1 -0
  126. package/dist/utils/studio-api.js +102 -0
  127. package/dist/utils/studio-api.js.map +1 -0
  128. package/dist/utils/studio-config.d.ts +74 -0
  129. package/dist/utils/studio-config.d.ts.map +1 -0
  130. package/dist/utils/studio-config.js +213 -0
  131. package/dist/utils/studio-config.js.map +1 -0
  132. package/dist/utils/token-manager.d.ts +4 -0
  133. package/dist/utils/token-manager.d.ts.map +1 -0
  134. package/dist/utils/token-manager.js +3 -0
  135. package/dist/utils/token-manager.js.map +1 -0
  136. package/dist/utils/ui.d.ts +55 -1
  137. package/dist/utils/ui.d.ts.map +1 -1
  138. package/dist/utils/ui.js +151 -2
  139. package/dist/utils/ui.js.map +1 -1
  140. package/package.json +4 -1
  141. package/dist/__tests__/config-schema.test.d.ts +0 -2
  142. package/dist/__tests__/config-schema.test.d.ts.map +0 -1
  143. package/dist/__tests__/config-schema.test.js +0 -471
  144. package/dist/__tests__/config-schema.test.js.map +0 -1
  145. package/dist/__tests__/config.test.d.ts +0 -2
  146. package/dist/__tests__/config.test.d.ts.map +0 -1
  147. package/dist/__tests__/config.test.js +0 -75
  148. package/dist/__tests__/config.test.js.map +0 -1
  149. package/dist/__tests__/integration/configure.test.d.ts +0 -2
  150. package/dist/__tests__/integration/configure.test.d.ts.map +0 -1
  151. package/dist/__tests__/integration/configure.test.js +0 -247
  152. package/dist/__tests__/integration/configure.test.js.map +0 -1
  153. package/dist/__tests__/integration/fixtures/configs.d.ts +0 -477
  154. package/dist/__tests__/integration/fixtures/configs.d.ts.map +0 -1
  155. package/dist/__tests__/integration/fixtures/configs.js +0 -175
  156. package/dist/__tests__/integration/fixtures/configs.js.map +0 -1
  157. package/dist/__tests__/integration/helpers/cli-runner.d.ts +0 -63
  158. package/dist/__tests__/integration/helpers/cli-runner.d.ts.map +0 -1
  159. package/dist/__tests__/integration/helpers/cli-runner.js +0 -152
  160. package/dist/__tests__/integration/helpers/cli-runner.js.map +0 -1
  161. package/dist/__tests__/integration/helpers/command-runner.d.ts +0 -53
  162. package/dist/__tests__/integration/helpers/command-runner.d.ts.map +0 -1
  163. package/dist/__tests__/integration/helpers/command-runner.js +0 -117
  164. package/dist/__tests__/integration/helpers/command-runner.js.map +0 -1
  165. package/dist/__tests__/integration/studio-create.test.d.ts +0 -2
  166. package/dist/__tests__/integration/studio-create.test.d.ts.map +0 -1
  167. package/dist/__tests__/integration/studio-create.test.js +0 -209
  168. package/dist/__tests__/integration/studio-create.test.js.map +0 -1
  169. package/dist/__tests__/integration/studio-update.test.d.ts +0 -2
  170. package/dist/__tests__/integration/studio-update.test.d.ts.map +0 -1
  171. package/dist/__tests__/integration/studio-update.test.js +0 -166
  172. package/dist/__tests__/integration/studio-update.test.js.map +0 -1
  173. package/dist/commands/__tests__/configure.test.d.ts +0 -2
  174. package/dist/commands/__tests__/configure.test.d.ts.map +0 -1
  175. package/dist/commands/__tests__/configure.test.js +0 -229
  176. package/dist/commands/__tests__/configure.test.js.map +0 -1
  177. package/dist/prompts/__tests__/environment-setup.test.d.ts +0 -2
  178. package/dist/prompts/__tests__/environment-setup.test.d.ts.map +0 -1
  179. package/dist/prompts/__tests__/environment-setup.test.js +0 -206
  180. package/dist/prompts/__tests__/environment-setup.test.js.map +0 -1
  181. package/dist/prompts/__tests__/hub-integration.test.d.ts +0 -2
  182. package/dist/prompts/__tests__/hub-integration.test.d.ts.map +0 -1
  183. package/dist/prompts/__tests__/hub-integration.test.js +0 -126
  184. package/dist/prompts/__tests__/hub-integration.test.js.map +0 -1
  185. package/dist/prompts/__tests__/prompt-helpers.test.d.ts +0 -2
  186. package/dist/prompts/__tests__/prompt-helpers.test.d.ts.map +0 -1
  187. package/dist/prompts/__tests__/prompt-helpers.test.js +0 -235
  188. package/dist/prompts/__tests__/prompt-helpers.test.js.map +0 -1
  189. package/dist/sembix-cli-1.2.1.tgz +0 -0
  190. package/dist/utils/__tests__/config-file.test.d.ts +0 -2
  191. package/dist/utils/__tests__/config-file.test.d.ts.map +0 -1
  192. package/dist/utils/__tests__/config-file.test.js +0 -218
  193. package/dist/utils/__tests__/config-file.test.js.map +0 -1
  194. package/dist/utils/__tests__/config-loader.test.d.ts +0 -2
  195. package/dist/utils/__tests__/config-loader.test.d.ts.map +0 -1
  196. package/dist/utils/__tests__/config-loader.test.js +0 -325
  197. package/dist/utils/__tests__/config-loader.test.js.map +0 -1
  198. package/dist/utils/__tests__/github.test.d.ts +0 -2
  199. package/dist/utils/__tests__/github.test.d.ts.map +0 -1
  200. package/dist/utils/__tests__/github.test.js +0 -282
  201. package/dist/utils/__tests__/github.test.js.map +0 -1
  202. package/dist/utils/__tests__/ui.test.d.ts +0 -2
  203. package/dist/utils/__tests__/ui.test.d.ts.map +0 -1
  204. package/dist/utils/__tests__/ui.test.js +0 -256
  205. package/dist/utils/__tests__/ui.test.js.map +0 -1
@@ -0,0 +1,132 @@
1
+ import { input, select } from '@inquirer/prompts';
2
+ import * as ui from '../utils/ui.js';
3
+ import { getRecentProjects } from '../utils/recent-workflows.js';
4
+ /**
5
+ * Prompts the user to select a project interactively
6
+ * Shows recent projects if available, otherwise shows search options
7
+ */
8
+ export async function promptForProject(apiClient, profileName) {
9
+ // Check for recent projects
10
+ const recent = await getRecentProjects(profileName, 3);
11
+ if (recent.length > 0) {
12
+ // Show recent projects + search option
13
+ const choices = [
14
+ ...recent.map(r => ({
15
+ name: `${r.projectName} (${ui.dim(r.projectId)})`,
16
+ value: r.projectId,
17
+ description: `Last used: ${new Date(r.lastUsed).toLocaleDateString()}`
18
+ })),
19
+ { name: '---', value: 'separator', disabled: true },
20
+ { name: 'Search all projects', value: 'search' },
21
+ { name: 'Enter project ID manually', value: 'manual' }
22
+ ];
23
+ const selection = await select({
24
+ message: 'Select a project:',
25
+ choices
26
+ });
27
+ if (selection === 'search') {
28
+ return await promptProjectSearch(apiClient);
29
+ }
30
+ else if (selection === 'manual') {
31
+ return await promptManualProjectEntry(apiClient);
32
+ }
33
+ else {
34
+ // Recent project selected
35
+ const project = await apiClient.getProject(selection);
36
+ if (!project) {
37
+ throw new Error(`Project ${selection} not found`);
38
+ }
39
+ return project;
40
+ }
41
+ }
42
+ else {
43
+ // No recent projects, go straight to search
44
+ const choice = await select({
45
+ message: 'How would you like to find the project?',
46
+ choices: [
47
+ { name: 'Search all projects', value: 'search' },
48
+ { name: 'Enter project ID manually', value: 'manual' }
49
+ ]
50
+ });
51
+ if (choice === 'search') {
52
+ return await promptProjectSearch(apiClient);
53
+ }
54
+ else {
55
+ return await promptManualProjectEntry(apiClient);
56
+ }
57
+ }
58
+ }
59
+ /**
60
+ * Prompts user to search/filter projects by name
61
+ */
62
+ async function promptProjectSearch(apiClient) {
63
+ console.log();
64
+ console.log('Search for a project by name (or press Enter to list all):');
65
+ console.log();
66
+ const searchQuery = await input({
67
+ message: 'Project name (optional):',
68
+ default: ''
69
+ });
70
+ // Load projects
71
+ const spinner = ui.spinner('Loading projects...');
72
+ spinner.start();
73
+ const response = searchQuery
74
+ ? await apiClient.searchProjects({ projectName: searchQuery })
75
+ : await apiClient.searchProjects();
76
+ const projects = response.items;
77
+ spinner.stop();
78
+ if (projects.length === 0) {
79
+ console.log();
80
+ ui.error('No projects found matching your search.');
81
+ console.log();
82
+ console.log('To create a project, visit your Studio dashboard.');
83
+ process.exit(1);
84
+ }
85
+ // If only one project, auto-select it
86
+ if (projects.length === 1) {
87
+ console.log();
88
+ console.log(`Found one project: ${ui.highlight(projects[0].name)}`);
89
+ return projects[0];
90
+ }
91
+ // Show project selection menu
92
+ console.log();
93
+ console.log(`Found ${projects.length} project(s):`);
94
+ console.log();
95
+ const choices = projects.map(p => ({
96
+ name: `${p.name}${p.description ? ui.dim(` - ${p.description}`) : ''}`,
97
+ value: p.projectId,
98
+ description: ui.dim(p.projectId)
99
+ }));
100
+ // Add manual entry option
101
+ choices.push({ name: 'Enter project ID manually instead', value: 'manual', description: '' });
102
+ const selection = await select({
103
+ message: 'Select a project:',
104
+ choices
105
+ });
106
+ if (selection === 'manual') {
107
+ return await promptManualProjectEntry(apiClient);
108
+ }
109
+ const project = projects.find(p => p.projectId === selection);
110
+ if (!project) {
111
+ throw new Error(`Project ${selection} not found`);
112
+ }
113
+ return project;
114
+ }
115
+ /**
116
+ * Prompts user to manually enter a project ID
117
+ */
118
+ async function promptManualProjectEntry(apiClient) {
119
+ const projectId = await input({
120
+ message: 'Enter project ID:',
121
+ validate: (val) => val.length > 0 || 'Project ID is required'
122
+ });
123
+ const spinner = ui.spinner('Fetching project...');
124
+ spinner.start();
125
+ const project = await apiClient.getProject(projectId);
126
+ spinner.stop();
127
+ if (!project) {
128
+ throw new Error(`Project "${projectId}" not found`);
129
+ }
130
+ return project;
131
+ }
132
+ //# sourceMappingURL=project-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-selection.js","sourceRoot":"","sources":["../../src/prompts/project-selection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { InitialInstructions } from '../types.js';
2
+ /**
3
+ * Interactively prompt for workflow inputs based on template definition.
4
+ * Prompts the user for each input parameter defined in the template.
5
+ *
6
+ * @param initialInstructions - Array of initial instructions from the workflow template
7
+ * @returns Promise resolving to array of InitialInstructions with user-provided values
8
+ */
9
+ export declare function promptForWorkflowInputs(initialInstructions: InitialInstructions[]): Promise<InitialInstructions[]>;
10
+ //# sourceMappingURL=workflow-inputs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-inputs.d.ts","sourceRoot":"","sources":["../../src/prompts/workflow-inputs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGvD;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,mBAAmB,EAAE,mBAAmB,EAAE,GACzC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CA+DhC"}
@@ -0,0 +1,71 @@
1
+ import { input, confirm } from '@inquirer/prompts';
2
+ import * as ui from '../utils/ui.js';
3
+ /**
4
+ * Interactively prompt for workflow inputs based on template definition.
5
+ * Prompts the user for each input parameter defined in the template.
6
+ *
7
+ * @param initialInstructions - Array of initial instructions from the workflow template
8
+ * @returns Promise resolving to array of InitialInstructions with user-provided values
9
+ */
10
+ export async function promptForWorkflowInputs(initialInstructions) {
11
+ if (!initialInstructions || initialInstructions.length === 0) {
12
+ console.log(ui.dim('This workflow has no input parameters.'));
13
+ return [];
14
+ }
15
+ console.log();
16
+ console.log(`This workflow requires ${ui.highlight(String(initialInstructions.length))} input(s):`);
17
+ console.log();
18
+ const results = [];
19
+ for (const instr of initialInstructions) {
20
+ console.log(`${ui.highlight(instr.name)}`);
21
+ if (instr.description) {
22
+ console.log(ui.dim(` ${instr.description}`));
23
+ }
24
+ console.log();
25
+ // Determine prompt type based on dataType
26
+ let value;
27
+ if (instr.dataType === 'boolean') {
28
+ value = await confirm({
29
+ message: `${instr.name}${instr.isRequired ? ' (required)' : ' (optional)'}:`,
30
+ default: Boolean(instr.instruction)
31
+ });
32
+ }
33
+ else if (instr.dataType === 'number') {
34
+ const numStr = await input({
35
+ message: `${instr.name}${instr.isRequired ? ' (required)' : ' (optional)'}:`,
36
+ default: instr.instruction ? String(instr.instruction) : undefined,
37
+ validate: (val) => {
38
+ if (!val && instr.isRequired)
39
+ return 'This field is required';
40
+ if (val && isNaN(Number(val)))
41
+ return 'Must be a number';
42
+ return true;
43
+ }
44
+ });
45
+ value = numStr ? Number(numStr) : undefined;
46
+ }
47
+ else {
48
+ // string, object, array, image - treat as string for now
49
+ value = await input({
50
+ message: `${instr.name}${instr.isRequired ? ' (required)' : ' (optional)'}:`,
51
+ default: instr.instruction ? String(instr.instruction) : undefined,
52
+ validate: (val) => {
53
+ if (!val && instr.isRequired)
54
+ return 'This field is required';
55
+ return true;
56
+ }
57
+ });
58
+ }
59
+ results.push({
60
+ id: instr.id,
61
+ name: instr.name,
62
+ description: instr.description,
63
+ instruction: value,
64
+ dataType: instr.dataType,
65
+ isRequired: instr.isRequired
66
+ });
67
+ console.log();
68
+ }
69
+ return results;
70
+ }
71
+ //# sourceMappingURL=workflow-inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-inputs.js","sourceRoot":"","sources":["../../src/prompts/workflow-inputs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { StudioApiClient } from '../services/studio-api-client.js';
2
+ import type { Workflow } from '../types.js';
3
+ /**
4
+ * Prompts the user to select a workflow interactively
5
+ * Shows recent workflows if available, then fuzzy search options
6
+ */
7
+ export declare function promptForWorkflow(apiClient: StudioApiClient, profileName: string, projectId: string): Promise<Workflow>;
8
+ //# sourceMappingURL=workflow-selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-selection.d.ts","sourceRoot":"","sources":["../../src/prompts/workflow-selection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAK5C;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,eAAe,EAC1B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,CAAC,CA+CnB"}
@@ -0,0 +1,147 @@
1
+ import { input, select, confirm } from '@inquirer/prompts';
2
+ import * as ui from '../utils/ui.js';
3
+ import { getRecentWorkflows } from '../utils/recent-workflows.js';
4
+ import { fuzzyMatch, highlightMatches, scoreToPercentage } from '../utils/fuzzy-match.js';
5
+ /**
6
+ * Prompts the user to select a workflow interactively
7
+ * Shows recent workflows if available, then fuzzy search options
8
+ */
9
+ export async function promptForWorkflow(apiClient, profileName, projectId) {
10
+ // Check for recent workflows for this project
11
+ const recent = await getRecentWorkflows(profileName, projectId, 5);
12
+ if (recent.length > 0) {
13
+ // Show recent workflows + search option
14
+ const choices = [
15
+ ...recent.map(r => ({
16
+ name: `${r.workflowName} ${ui.dim(`(${r.workflowId})`)} - Used ${r.useCount} time${r.useCount > 1 ? 's' : ''}`,
17
+ value: r.workflowId,
18
+ description: `Last used: ${new Date(r.lastUsed).toLocaleDateString()}`
19
+ })),
20
+ { name: '---', value: 'separator', disabled: true },
21
+ { name: 'Search all workflows (fuzzy matching)', value: 'search' },
22
+ { name: 'Enter workflow ID or name manually', value: 'manual' }
23
+ ];
24
+ const selection = await select({
25
+ message: 'Select a workflow:',
26
+ choices
27
+ });
28
+ if (selection === 'search') {
29
+ return await promptFuzzySearch(apiClient, projectId);
30
+ }
31
+ else if (selection === 'manual') {
32
+ return await promptManualEntry(apiClient, projectId);
33
+ }
34
+ else {
35
+ // Recent workflow selected
36
+ const workflow = await apiClient.getWorkflow(projectId, selection);
37
+ return workflow;
38
+ }
39
+ }
40
+ else {
41
+ // No recent workflows, go straight to search
42
+ const choice = await select({
43
+ message: 'How would you like to find the workflow?',
44
+ choices: [
45
+ { name: 'Search workflows (fuzzy matching)', value: 'search' },
46
+ { name: 'Enter workflow ID or name manually', value: 'manual' }
47
+ ]
48
+ });
49
+ if (choice === 'search') {
50
+ return await promptFuzzySearch(apiClient, projectId);
51
+ }
52
+ else {
53
+ return await promptManualEntry(apiClient, projectId);
54
+ }
55
+ }
56
+ }
57
+ /**
58
+ * Prompts user with fuzzy search interface
59
+ */
60
+ async function promptFuzzySearch(apiClient, projectId) {
61
+ // Load all workflows for the project
62
+ const spinner = ui.spinner('Loading workflows...');
63
+ spinner.start();
64
+ const response = await apiClient.listWorkflows({ projectId });
65
+ // API returns only parent workflows by default (child workflows only returned if parentWorkflowId specified)
66
+ const workflows = response.workflows;
67
+ spinner.stop();
68
+ if (workflows.length === 0) {
69
+ console.log();
70
+ ui.error('No workflows found in this project.');
71
+ console.log();
72
+ console.log('Create a workflow in Sembix Studio first, then try again.');
73
+ process.exit(1);
74
+ }
75
+ console.log();
76
+ console.log(`Found ${workflows.length} workflow(s). Type to search with fuzzy matching...`);
77
+ console.log();
78
+ const query = await input({
79
+ message: 'Search workflows:',
80
+ validate: (val) => val.length > 0 || 'Please enter a search query'
81
+ });
82
+ const matches = fuzzyMatch(query, workflows, (w) => w.name, 100 // minimum score
83
+ );
84
+ if (matches.length === 0) {
85
+ console.log();
86
+ ui.warning('No workflows matched your search.');
87
+ console.log();
88
+ console.log('Try a different search query or enter the workflow ID/name manually.');
89
+ return await promptManualEntry(apiClient, projectId);
90
+ }
91
+ // If single high-confidence match (>90%), offer to auto-select
92
+ if (matches.length === 1 && matches[0].score > 900) {
93
+ const workflow = matches[0].item;
94
+ console.log();
95
+ console.log(`Found exact match: ${ui.highlight(workflow.name)}`);
96
+ const confirmed = await confirm({
97
+ message: `Use workflow "${workflow.name}"?`,
98
+ default: true
99
+ });
100
+ if (confirmed) {
101
+ return await apiClient.getWorkflow(projectId, workflow.workflowId);
102
+ }
103
+ }
104
+ // Show top 10 matches
105
+ const topMatches = matches.slice(0, 10);
106
+ console.log();
107
+ const choices = topMatches.map(m => {
108
+ const percentage = scoreToPercentage(m.score);
109
+ return {
110
+ name: `${highlightMatches(m.item.name, m.matches)} ${ui.dim(`(${m.item.workflowId})`)} - ${percentage}% match`,
111
+ value: m.item.workflowId,
112
+ description: m.item.description || ui.dim('No description')
113
+ };
114
+ });
115
+ choices.push({ name: 'Enter manually instead', value: 'manual', description: '' });
116
+ const selection = await select({
117
+ message: `Select a workflow (${topMatches.length} match${topMatches.length > 1 ? 'es' : ''}):`,
118
+ choices
119
+ });
120
+ if (selection === 'manual') {
121
+ return await promptManualEntry(apiClient, projectId);
122
+ }
123
+ return await apiClient.getWorkflow(projectId, selection);
124
+ }
125
+ /**
126
+ * Prompts user to manually enter workflow ID or name
127
+ */
128
+ async function promptManualEntry(apiClient, projectId) {
129
+ const idOrName = await input({
130
+ message: 'Enter workflow ID or name:',
131
+ validate: (val) => val.length > 0 || 'Workflow ID or name is required'
132
+ });
133
+ // Try as ID first
134
+ try {
135
+ const workflow = await apiClient.getWorkflow(projectId, idOrName);
136
+ return workflow;
137
+ }
138
+ catch {
139
+ // Try as name
140
+ const workflow = await apiClient.findWorkflowByName(projectId, idOrName);
141
+ if (!workflow) {
142
+ throw new Error(`Workflow "${idOrName}" not found in project ${projectId}`);
143
+ }
144
+ return workflow;
145
+ }
146
+ }
147
+ //# sourceMappingURL=workflow-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-selection.js","sourceRoot":"","sources":["../../src/prompts/workflow-selection.ts"],"names":[],"mappings":"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"}
Binary file
@@ -0,0 +1,92 @@
1
+ import type { StudioProfile, StudioAuthTokens } from '../types.js';
2
+ /**
3
+ * CognitoAuthService handles OAuth 2.0 Authorization Code flow with PKCE
4
+ * for Cognito authentication. It manages the browser-based login flow,
5
+ * token exchange, and token refresh operations.
6
+ */
7
+ export declare class CognitoAuthService {
8
+ private profile;
9
+ constructor(profile: StudioProfile);
10
+ /**
11
+ * Initiates the OAuth login flow by starting a local callback server,
12
+ * generating PKCE parameters, and exchanging the authorization code for tokens.
13
+ *
14
+ * @returns Promise resolving to authentication tokens
15
+ * @throws Error if authentication fails or times out
16
+ */
17
+ initiateLogin(): Promise<StudioAuthTokens>;
18
+ /**
19
+ * Refreshes expired access tokens using the refresh token.
20
+ *
21
+ * @param refreshToken - The refresh token from previous authentication
22
+ * @returns Promise resolving to new authentication tokens
23
+ * @throws Error if token refresh fails
24
+ */
25
+ refreshTokens(refreshToken: string): Promise<StudioAuthTokens>;
26
+ /**
27
+ * Authenticates using OAuth 2.0 Client Credentials flow
28
+ * Used for machine-to-machine authentication (CI/CD)
29
+ *
30
+ * @param clientId - M2M client ID
31
+ * @param clientSecret - M2M client secret
32
+ * @returns Promise resolving to authentication tokens
33
+ * @throws Error if authentication fails
34
+ */
35
+ authenticateWithClientCredentials(clientId: string, clientSecret: string): Promise<StudioAuthTokens>;
36
+ /**
37
+ * Generates PKCE code verifier and challenge for secure OAuth flow.
38
+ * Uses SHA256 hashing as required by OAuth 2.0 PKCE specification.
39
+ *
40
+ * @returns Object containing base64url-encoded verifier and challenge
41
+ */
42
+ private generatePKCE;
43
+ /**
44
+ * Starts a temporary HTTP server on localhost to receive OAuth callback.
45
+ * Finds an available port in the range 3000-9000.
46
+ *
47
+ * @returns Promise resolving to server port and a promise for the authorization code
48
+ */
49
+ private startLocalServer;
50
+ /**
51
+ * Builds the Cognito authorization URL with PKCE parameters.
52
+ *
53
+ * @param redirectUri - Callback URL for OAuth flow
54
+ * @param codeChallenge - PKCE code challenge
55
+ * @param state - Random state parameter for CSRF protection
56
+ * @returns Complete authorization URL
57
+ */
58
+ private buildAuthorizationUrl;
59
+ /**
60
+ * Exchanges authorization code for access tokens via Cognito token endpoint.
61
+ *
62
+ * @param code - Authorization code from OAuth callback
63
+ * @param codeVerifier - PKCE code verifier
64
+ * @param redirectUri - Must match the redirect_uri used in authorization request
65
+ * @returns Promise resolving to token set
66
+ * @throws Error if token exchange fails
67
+ */
68
+ private exchangeCodeForTokens;
69
+ /**
70
+ * Attempts to open the authorization URL in the default browser.
71
+ * Uses platform-specific commands (open on macOS, start on Windows, xdg-open on Linux).
72
+ *
73
+ * @param url - URL to open
74
+ * @throws Error if browser cannot be opened (non-fatal, user can use manual URL)
75
+ */
76
+ private openBrowser;
77
+ }
78
+ /**
79
+ * Validates if a token is still valid based on expiration time.
80
+ *
81
+ * @param tokens - Authentication tokens to validate
82
+ * @returns true if token is valid, false if expired
83
+ */
84
+ export declare function validateToken(tokens: StudioAuthTokens): boolean;
85
+ /**
86
+ * Loads stored tokens for a profile.
87
+ *
88
+ * @param profileName - Name of the profile
89
+ * @returns Promise resolving to tokens or null if not found
90
+ */
91
+ export declare function getStoredTokens(profileName: string): Promise<StudioAuthTokens | null>;
92
+ //# sourceMappingURL=cognito-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cognito-auth.d.ts","sourceRoot":"","sources":["../../src/services/cognito-auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAY,MAAM,aAAa,CAAC;AAG7E;;;;GAIG;AACH,qBAAa,kBAAkB;IACjB,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,aAAa;IAE1C;;;;;;OAMG;IACG,aAAa,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAkDhD;;;;;;OAMG;IACG,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAwCpE;;;;;;;;OAQG;IACG,iCAAiC,CACrC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,CAAC;IAyC5B;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAYpB;;;;;OAKG;YACW,gBAAgB;IAkE9B;;;;;;;OAOG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;;;;;;;OAQG;YACW,qBAAqB;IAsCnC;;;;;;OAMG;YACW,WAAW;CAsB1B;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAE/D;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAG3F"}