@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.
- package/COMMANDS.md +1522 -0
- package/QUICKSTART.md +829 -0
- package/README.md +1976 -309
- package/USAGE-EXAMPLES.md +872 -0
- package/config.example.yaml +3 -0
- package/dist/commands/configure.d.ts.map +1 -1
- package/dist/commands/configure.js +172 -2
- package/dist/commands/configure.js.map +1 -1
- package/dist/commands/index.d.ts +10 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +11 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/login.d.ts +19 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +118 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +21 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +66 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/profile-project.d.ts +14 -0
- package/dist/commands/profile-project.d.ts.map +1 -0
- package/dist/commands/profile-project.js +123 -0
- package/dist/commands/profile-project.js.map +1 -0
- package/dist/commands/profile.d.ts +26 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +177 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/project.d.ts +16 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +153 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/setup.js +3 -0
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/workflow.d.ts +91 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +1201 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/config-schema.d.ts +26 -0
- package/dist/config-schema.d.ts.map +1 -1
- package/dist/config-schema.js +24 -1
- package/dist/config-schema.js.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +23 -2
- package/dist/config.js.map +1 -1
- package/dist/index.js +324 -1
- package/dist/index.js.map +1 -1
- package/dist/prompts/environment-setup.d.ts.map +1 -1
- package/dist/prompts/environment-setup.js +12 -0
- package/dist/prompts/environment-setup.js.map +1 -1
- package/dist/prompts/project-selection.d.ts +8 -0
- package/dist/prompts/project-selection.d.ts.map +1 -0
- package/dist/prompts/project-selection.js +132 -0
- package/dist/prompts/project-selection.js.map +1 -0
- package/dist/prompts/workflow-inputs.d.ts +10 -0
- package/dist/prompts/workflow-inputs.d.ts.map +1 -0
- package/dist/prompts/workflow-inputs.js +71 -0
- package/dist/prompts/workflow-inputs.js.map +1 -0
- package/dist/prompts/workflow-selection.d.ts +8 -0
- package/dist/prompts/workflow-selection.d.ts.map +1 -0
- package/dist/prompts/workflow-selection.js +147 -0
- package/dist/prompts/workflow-selection.js.map +1 -0
- package/dist/sembix-cli-1.4.0.tgz +0 -0
- package/dist/services/cognito-auth.d.ts +92 -0
- package/dist/services/cognito-auth.d.ts.map +1 -0
- package/dist/services/cognito-auth.js +319 -0
- package/dist/services/cognito-auth.js.map +1 -0
- package/dist/services/studio-api-client.d.ts +127 -0
- package/dist/services/studio-api-client.d.ts.map +1 -0
- package/dist/services/studio-api-client.js +291 -0
- package/dist/services/studio-api-client.js.map +1 -0
- package/dist/types/studio.d.ts +82 -0
- package/dist/types/studio.d.ts.map +1 -0
- package/dist/types/studio.js +7 -0
- package/dist/types/studio.js.map +1 -0
- package/dist/types.d.ts +286 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -1
- package/dist/utils/browser-auth.d.ts +45 -0
- package/dist/utils/browser-auth.d.ts.map +1 -0
- package/dist/utils/browser-auth.js +168 -0
- package/dist/utils/browser-auth.js.map +1 -0
- package/dist/utils/cognito-auth.d.ts +3 -0
- package/dist/utils/cognito-auth.d.ts.map +1 -0
- package/dist/utils/cognito-auth.js +3 -0
- package/dist/utils/cognito-auth.js.map +1 -0
- package/dist/utils/config-file.d.ts +40 -0
- package/dist/utils/config-file.d.ts.map +1 -1
- package/dist/utils/config-file.js +158 -4
- package/dist/utils/config-file.js.map +1 -1
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +15 -2
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/environment.d.ts +22 -0
- package/dist/utils/environment.d.ts.map +1 -0
- package/dist/utils/environment.js +39 -0
- package/dist/utils/environment.js.map +1 -0
- package/dist/utils/error-handler.d.ts +53 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +174 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/fuzzy-match.d.ts +31 -0
- package/dist/utils/fuzzy-match.d.ts.map +1 -0
- package/dist/utils/fuzzy-match.js +138 -0
- package/dist/utils/fuzzy-match.js.map +1 -0
- package/dist/utils/input-parser.d.ts +14 -0
- package/dist/utils/input-parser.d.ts.map +1 -0
- package/dist/utils/input-parser.js +34 -0
- package/dist/utils/input-parser.js.map +1 -0
- package/dist/utils/output.d.ts +55 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +80 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/recent-workflows.d.ts +37 -0
- package/dist/utils/recent-workflows.d.ts.map +1 -0
- package/dist/utils/recent-workflows.js +172 -0
- package/dist/utils/recent-workflows.js.map +1 -0
- package/dist/utils/studio-api-client.d.ts +3 -0
- package/dist/utils/studio-api-client.d.ts.map +1 -0
- package/dist/utils/studio-api-client.js +3 -0
- package/dist/utils/studio-api-client.js.map +1 -0
- package/dist/utils/studio-api.d.ts +53 -0
- package/dist/utils/studio-api.d.ts.map +1 -0
- package/dist/utils/studio-api.js +102 -0
- package/dist/utils/studio-api.js.map +1 -0
- package/dist/utils/studio-config.d.ts +74 -0
- package/dist/utils/studio-config.d.ts.map +1 -0
- package/dist/utils/studio-config.js +213 -0
- package/dist/utils/studio-config.js.map +1 -0
- package/dist/utils/token-manager.d.ts +4 -0
- package/dist/utils/token-manager.d.ts.map +1 -0
- package/dist/utils/token-manager.js +3 -0
- package/dist/utils/token-manager.js.map +1 -0
- package/dist/utils/ui.d.ts +55 -1
- package/dist/utils/ui.d.ts.map +1 -1
- package/dist/utils/ui.js +151 -2
- package/dist/utils/ui.js.map +1 -1
- package/package.json +4 -1
- package/dist/__tests__/config-schema.test.d.ts +0 -2
- package/dist/__tests__/config-schema.test.d.ts.map +0 -1
- package/dist/__tests__/config-schema.test.js +0 -471
- package/dist/__tests__/config-schema.test.js.map +0 -1
- package/dist/__tests__/config.test.d.ts +0 -2
- package/dist/__tests__/config.test.d.ts.map +0 -1
- package/dist/__tests__/config.test.js +0 -75
- package/dist/__tests__/config.test.js.map +0 -1
- package/dist/__tests__/integration/configure.test.d.ts +0 -2
- package/dist/__tests__/integration/configure.test.d.ts.map +0 -1
- package/dist/__tests__/integration/configure.test.js +0 -247
- package/dist/__tests__/integration/configure.test.js.map +0 -1
- package/dist/__tests__/integration/fixtures/configs.d.ts +0 -477
- package/dist/__tests__/integration/fixtures/configs.d.ts.map +0 -1
- package/dist/__tests__/integration/fixtures/configs.js +0 -175
- package/dist/__tests__/integration/fixtures/configs.js.map +0 -1
- package/dist/__tests__/integration/helpers/cli-runner.d.ts +0 -63
- package/dist/__tests__/integration/helpers/cli-runner.d.ts.map +0 -1
- package/dist/__tests__/integration/helpers/cli-runner.js +0 -152
- package/dist/__tests__/integration/helpers/cli-runner.js.map +0 -1
- package/dist/__tests__/integration/helpers/command-runner.d.ts +0 -53
- package/dist/__tests__/integration/helpers/command-runner.d.ts.map +0 -1
- package/dist/__tests__/integration/helpers/command-runner.js +0 -117
- package/dist/__tests__/integration/helpers/command-runner.js.map +0 -1
- package/dist/__tests__/integration/studio-create.test.d.ts +0 -2
- package/dist/__tests__/integration/studio-create.test.d.ts.map +0 -1
- package/dist/__tests__/integration/studio-create.test.js +0 -209
- package/dist/__tests__/integration/studio-create.test.js.map +0 -1
- package/dist/__tests__/integration/studio-update.test.d.ts +0 -2
- package/dist/__tests__/integration/studio-update.test.d.ts.map +0 -1
- package/dist/__tests__/integration/studio-update.test.js +0 -166
- package/dist/__tests__/integration/studio-update.test.js.map +0 -1
- package/dist/commands/__tests__/configure.test.d.ts +0 -2
- package/dist/commands/__tests__/configure.test.d.ts.map +0 -1
- package/dist/commands/__tests__/configure.test.js +0 -229
- package/dist/commands/__tests__/configure.test.js.map +0 -1
- package/dist/prompts/__tests__/environment-setup.test.d.ts +0 -2
- package/dist/prompts/__tests__/environment-setup.test.d.ts.map +0 -1
- package/dist/prompts/__tests__/environment-setup.test.js +0 -206
- package/dist/prompts/__tests__/environment-setup.test.js.map +0 -1
- package/dist/prompts/__tests__/hub-integration.test.d.ts +0 -2
- package/dist/prompts/__tests__/hub-integration.test.d.ts.map +0 -1
- package/dist/prompts/__tests__/hub-integration.test.js +0 -126
- package/dist/prompts/__tests__/hub-integration.test.js.map +0 -1
- package/dist/prompts/__tests__/prompt-helpers.test.d.ts +0 -2
- package/dist/prompts/__tests__/prompt-helpers.test.d.ts.map +0 -1
- package/dist/prompts/__tests__/prompt-helpers.test.js +0 -235
- package/dist/prompts/__tests__/prompt-helpers.test.js.map +0 -1
- package/dist/sembix-cli-1.2.1.tgz +0 -0
- package/dist/utils/__tests__/config-file.test.d.ts +0 -2
- package/dist/utils/__tests__/config-file.test.d.ts.map +0 -1
- package/dist/utils/__tests__/config-file.test.js +0 -218
- package/dist/utils/__tests__/config-file.test.js.map +0 -1
- package/dist/utils/__tests__/config-loader.test.d.ts +0 -2
- package/dist/utils/__tests__/config-loader.test.d.ts.map +0 -1
- package/dist/utils/__tests__/config-loader.test.js +0 -325
- package/dist/utils/__tests__/config-loader.test.js.map +0 -1
- package/dist/utils/__tests__/github.test.d.ts +0 -2
- package/dist/utils/__tests__/github.test.d.ts.map +0 -1
- package/dist/utils/__tests__/github.test.js +0 -282
- package/dist/utils/__tests__/github.test.js.map +0 -1
- package/dist/utils/__tests__/ui.test.d.ts +0 -2
- package/dist/utils/__tests__/ui.test.d.ts.map +0 -1
- package/dist/utils/__tests__/ui.test.js +0 -256
- 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"}
|