task-pipeliner 0.1.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/LICENSE +21 -0
- package/README.ko.md +1034 -0
- package/README.md +1031 -0
- package/dist/cli/index.d.ts +19 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +147 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/prompts.d.ts +48 -0
- package/dist/cli/prompts.d.ts.map +1 -0
- package/dist/cli/prompts.js +75 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/cli/ui.d.ts +39 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +84 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/core/__tests__/actual-execution.test.d.ts +2 -0
- package/dist/core/__tests__/actual-execution.test.d.ts.map +1 -0
- package/dist/core/__tests__/actual-execution.test.js +140 -0
- package/dist/core/__tests__/actual-execution.test.js.map +1 -0
- package/dist/core/__tests__/base-dir.test.d.ts +2 -0
- package/dist/core/__tests__/base-dir.test.d.ts.map +1 -0
- package/dist/core/__tests__/base-dir.test.js +146 -0
- package/dist/core/__tests__/base-dir.test.js.map +1 -0
- package/dist/core/__tests__/built-code-execution.test.d.ts +2 -0
- package/dist/core/__tests__/built-code-execution.test.d.ts.map +1 -0
- package/dist/core/__tests__/built-code-execution.test.js +48 -0
- package/dist/core/__tests__/built-code-execution.test.js.map +1 -0
- package/dist/core/__tests__/choose-as-var-condition.test.d.ts +2 -0
- package/dist/core/__tests__/choose-as-var-condition.test.d.ts.map +1 -0
- package/dist/core/__tests__/choose-as-var-condition.test.js +308 -0
- package/dist/core/__tests__/choose-as-var-condition.test.js.map +1 -0
- package/dist/core/__tests__/cli-integration.test.d.ts +2 -0
- package/dist/core/__tests__/cli-integration.test.d.ts.map +1 -0
- package/dist/core/__tests__/cli-integration.test.js +83 -0
- package/dist/core/__tests__/cli-integration.test.js.map +1 -0
- package/dist/core/__tests__/comprehensive-basic-yaml.test.d.ts +2 -0
- package/dist/core/__tests__/comprehensive-basic-yaml.test.d.ts.map +1 -0
- package/dist/core/__tests__/comprehensive-basic-yaml.test.js +111 -0
- package/dist/core/__tests__/comprehensive-basic-yaml.test.js.map +1 -0
- package/dist/core/__tests__/condition-evaluator.test.d.ts +2 -0
- package/dist/core/__tests__/condition-evaluator.test.d.ts.map +1 -0
- package/dist/core/__tests__/condition-evaluator.test.js +170 -0
- package/dist/core/__tests__/condition-evaluator.test.js.map +1 -0
- package/dist/core/__tests__/debug-basic-yaml.test.d.ts +2 -0
- package/dist/core/__tests__/debug-basic-yaml.test.d.ts.map +1 -0
- package/dist/core/__tests__/debug-basic-yaml.test.js +128 -0
- package/dist/core/__tests__/debug-basic-yaml.test.js.map +1 -0
- package/dist/core/__tests__/example-files.test.d.ts +2 -0
- package/dist/core/__tests__/example-files.test.d.ts.map +1 -0
- package/dist/core/__tests__/example-files.test.js +200 -0
- package/dist/core/__tests__/example-files.test.js.map +1 -0
- package/dist/core/__tests__/executor-choice-integration.test.d.ts +2 -0
- package/dist/core/__tests__/executor-choice-integration.test.d.ts.map +1 -0
- package/dist/core/__tests__/executor-choice-integration.test.js +171 -0
- package/dist/core/__tests__/executor-choice-integration.test.js.map +1 -0
- package/dist/core/__tests__/executor-choice.test.d.ts +2 -0
- package/dist/core/__tests__/executor-choice.test.d.ts.map +1 -0
- package/dist/core/__tests__/executor-choice.test.js +174 -0
- package/dist/core/__tests__/executor-choice.test.js.map +1 -0
- package/dist/core/__tests__/executor-parallel.test.d.ts +2 -0
- package/dist/core/__tests__/executor-parallel.test.d.ts.map +1 -0
- package/dist/core/__tests__/executor-parallel.test.js +136 -0
- package/dist/core/__tests__/executor-parallel.test.js.map +1 -0
- package/dist/core/__tests__/executor-prompt.test.d.ts +2 -0
- package/dist/core/__tests__/executor-prompt.test.d.ts.map +1 -0
- package/dist/core/__tests__/executor-prompt.test.js +149 -0
- package/dist/core/__tests__/executor-prompt.test.js.map +1 -0
- package/dist/core/__tests__/executor-real-scenario.test.d.ts +2 -0
- package/dist/core/__tests__/executor-real-scenario.test.d.ts.map +1 -0
- package/dist/core/__tests__/executor-real-scenario.test.js +169 -0
- package/dist/core/__tests__/executor-real-scenario.test.js.map +1 -0
- package/dist/core/__tests__/file-condition.test.d.ts +2 -0
- package/dist/core/__tests__/file-condition.test.d.ts.map +1 -0
- package/dist/core/__tests__/file-condition.test.js +182 -0
- package/dist/core/__tests__/file-condition.test.js.map +1 -0
- package/dist/core/__tests__/final-verification.test.d.ts +2 -0
- package/dist/core/__tests__/final-verification.test.d.ts.map +1 -0
- package/dist/core/__tests__/final-verification.test.js +59 -0
- package/dist/core/__tests__/final-verification.test.js.map +1 -0
- package/dist/core/__tests__/parallel-when-condition.test.d.ts +2 -0
- package/dist/core/__tests__/parallel-when-condition.test.d.ts.map +1 -0
- package/dist/core/__tests__/parallel-when-condition.test.js +155 -0
- package/dist/core/__tests__/parallel-when-condition.test.js.map +1 -0
- package/dist/core/__tests__/parser.test.d.ts +2 -0
- package/dist/core/__tests__/parser.test.d.ts.map +1 -0
- package/dist/core/__tests__/parser.test.js +94 -0
- package/dist/core/__tests__/parser.test.js.map +1 -0
- package/dist/core/__tests__/real-inquirer-test.test.d.ts +2 -0
- package/dist/core/__tests__/real-inquirer-test.test.d.ts.map +1 -0
- package/dist/core/__tests__/real-inquirer-test.test.js +20 -0
- package/dist/core/__tests__/real-inquirer-test.test.js.map +1 -0
- package/dist/core/__tests__/reproduce-bug.test.d.ts +2 -0
- package/dist/core/__tests__/reproduce-bug.test.d.ts.map +1 -0
- package/dist/core/__tests__/reproduce-bug.test.js +84 -0
- package/dist/core/__tests__/reproduce-bug.test.js.map +1 -0
- package/dist/core/__tests__/timeout-retry.test.d.ts +2 -0
- package/dist/core/__tests__/timeout-retry.test.d.ts.map +1 -0
- package/dist/core/__tests__/timeout-retry.test.js +184 -0
- package/dist/core/__tests__/timeout-retry.test.js.map +1 -0
- package/dist/core/__tests__/workflow-validation.test.d.ts +2 -0
- package/dist/core/__tests__/workflow-validation.test.d.ts.map +1 -0
- package/dist/core/__tests__/workflow-validation.test.js +120 -0
- package/dist/core/__tests__/workflow-validation.test.js.map +1 -0
- package/dist/core/__tests__/workspace.test.d.ts +2 -0
- package/dist/core/__tests__/workspace.test.d.ts.map +1 -0
- package/dist/core/__tests__/workspace.test.js +29 -0
- package/dist/core/__tests__/workspace.test.js.map +1 -0
- package/dist/core/__tests__/yaml-integration.test.d.ts +2 -0
- package/dist/core/__tests__/yaml-integration.test.d.ts.map +1 -0
- package/dist/core/__tests__/yaml-integration.test.js +114 -0
- package/dist/core/__tests__/yaml-integration.test.js.map +1 -0
- package/dist/core/__tests__/yaml-scenarios.test.d.ts +2 -0
- package/dist/core/__tests__/yaml-scenarios.test.d.ts.map +1 -0
- package/dist/core/__tests__/yaml-scenarios.test.js +199 -0
- package/dist/core/__tests__/yaml-scenarios.test.js.map +1 -0
- package/dist/core/condition-evaluator.d.ts +44 -0
- package/dist/core/condition-evaluator.d.ts.map +1 -0
- package/dist/core/condition-evaluator.js +121 -0
- package/dist/core/condition-evaluator.js.map +1 -0
- package/dist/core/executor.d.ts +172 -0
- package/dist/core/executor.d.ts.map +1 -0
- package/dist/core/executor.js +579 -0
- package/dist/core/executor.js.map +1 -0
- package/dist/core/parser.d.ts +41 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/parser.js +202 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core/rust-task-runner.d.ts +14 -0
- package/dist/core/rust-task-runner.d.ts.map +1 -0
- package/dist/core/rust-task-runner.js +34 -0
- package/dist/core/rust-task-runner.js.map +1 -0
- package/dist/core/task-runner.d.ts +63 -0
- package/dist/core/task-runner.d.ts.map +1 -0
- package/dist/core/task-runner.js +252 -0
- package/dist/core/task-runner.js.map +1 -0
- package/dist/core/template.d.ts +11 -0
- package/dist/core/template.d.ts.map +1 -0
- package/dist/core/template.js +36 -0
- package/dist/core/template.js.map +1 -0
- package/dist/core/workflow-schema.d.ts +31 -0
- package/dist/core/workflow-schema.d.ts.map +1 -0
- package/dist/core/workflow-schema.js +125 -0
- package/dist/core/workflow-schema.js.map +1 -0
- package/dist/core/workspace.d.ts +90 -0
- package/dist/core/workspace.d.ts.map +1 -0
- package/dist/core/workspace.js +143 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/task-pipeliner-rs.node +0 -0
- package/dist/types/condition.d.ts +62 -0
- package/dist/types/condition.d.ts.map +1 -0
- package/dist/types/condition.js +6 -0
- package/dist/types/condition.js.map +1 -0
- package/dist/types/workflow.d.ts +69 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +2 -0
- package/dist/types/workflow.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,579 @@
|
|
|
1
|
+
import { resolve, isAbsolute, dirname } from 'path';
|
|
2
|
+
import logUpdate from 'log-update';
|
|
3
|
+
import { ChoicePrompt, TextPrompt } from '../cli/prompts.js';
|
|
4
|
+
import { createParallelHeaderBox, createParallelFooterMessage, createErrorBox, } from '../cli/ui.js';
|
|
5
|
+
import { ConditionEvaluator } from './condition-evaluator.js';
|
|
6
|
+
import { TaskRunner } from './task-runner.js';
|
|
7
|
+
import { substituteVariables } from './template.js';
|
|
8
|
+
import { Workspace } from './workspace.js';
|
|
9
|
+
export class Executor {
|
|
10
|
+
// Multiply step index by this to encode branch index in parallel execution
|
|
11
|
+
// Example: step 5, branch 2 = 5000 + 2 = 5002
|
|
12
|
+
static PARALLEL_STEP_INDEX_MULTIPLIER = 1000;
|
|
13
|
+
workspace;
|
|
14
|
+
taskRunner;
|
|
15
|
+
choicePrompt;
|
|
16
|
+
textPrompt;
|
|
17
|
+
baseDir; // Base directory for command execution
|
|
18
|
+
constructor() {
|
|
19
|
+
this.workspace = new Workspace();
|
|
20
|
+
this.taskRunner = new TaskRunner();
|
|
21
|
+
this.choicePrompt = new ChoicePrompt();
|
|
22
|
+
this.textPrompt = new TextPrompt();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Resolve baseDir path from workflow configuration
|
|
26
|
+
*
|
|
27
|
+
* baseDir determines where commands will be executed:
|
|
28
|
+
* - If absolute path: use as-is
|
|
29
|
+
* - If relative path: resolve relative to YAML file location
|
|
30
|
+
* - If no _filePath: resolve relative to current working directory
|
|
31
|
+
*/
|
|
32
|
+
resolveBaseDir(workflow) {
|
|
33
|
+
if (!workflow.baseDir) {
|
|
34
|
+
return; // No baseDir specified, use default (process.cwd())
|
|
35
|
+
}
|
|
36
|
+
// Absolute path: use directly
|
|
37
|
+
if (isAbsolute(workflow.baseDir)) {
|
|
38
|
+
this.baseDir = workflow.baseDir;
|
|
39
|
+
}
|
|
40
|
+
// Relative path: resolve against YAML file directory
|
|
41
|
+
else if (workflow._filePath) {
|
|
42
|
+
const yamlDir = dirname(workflow._filePath);
|
|
43
|
+
this.baseDir = resolve(yamlDir, workflow.baseDir);
|
|
44
|
+
}
|
|
45
|
+
// Fallback: resolve against current working directory
|
|
46
|
+
else {
|
|
47
|
+
this.baseDir = resolve(process.cwd(), workflow.baseDir);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Create execution context for a step
|
|
52
|
+
*
|
|
53
|
+
* Context contains information needed to execute a step:
|
|
54
|
+
* - Workspace reference (for storing/reading state)
|
|
55
|
+
* - Step index (for tracking which step we're on)
|
|
56
|
+
* - Line number and file name (for error reporting)
|
|
57
|
+
*/
|
|
58
|
+
createStepContext(stepIndex, workflow) {
|
|
59
|
+
const context = {
|
|
60
|
+
workspace: this.workspace,
|
|
61
|
+
stepIndex,
|
|
62
|
+
};
|
|
63
|
+
// Add line number for better error messages
|
|
64
|
+
if (workflow._lineNumbers) {
|
|
65
|
+
context.lineNumber = workflow._lineNumbers.get(stepIndex);
|
|
66
|
+
}
|
|
67
|
+
// Add file name for better error messages
|
|
68
|
+
if (workflow._fileName) {
|
|
69
|
+
context.fileName = workflow._fileName;
|
|
70
|
+
}
|
|
71
|
+
return context;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Evaluate step condition and return whether step should execute
|
|
75
|
+
*/
|
|
76
|
+
evaluateStepCondition(step) {
|
|
77
|
+
if (!step.when) {
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
const evaluator = new ConditionEvaluator(this.workspace);
|
|
81
|
+
return evaluator.evaluate(step.when);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Calculate base step index for parallel execution
|
|
85
|
+
* When in parallel, stepIndex is encoded as: baseStepIndex * MULTIPLIER + branchIndex
|
|
86
|
+
* So we divide by MULTIPLIER to get the original step index
|
|
87
|
+
*/
|
|
88
|
+
calculateBaseStepIndex(context) {
|
|
89
|
+
if (context.branchIndex === undefined) {
|
|
90
|
+
return context.stepIndex;
|
|
91
|
+
}
|
|
92
|
+
return Math.floor(context.stepIndex / Executor.PARALLEL_STEP_INDEX_MULTIPLIER);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Execute workflow steps sequentially
|
|
96
|
+
*
|
|
97
|
+
* Main entry point for workflow execution:
|
|
98
|
+
* 1. Resolve baseDir for command execution
|
|
99
|
+
* 2. Loop through each step
|
|
100
|
+
* 3. Evaluate conditions (when clauses)
|
|
101
|
+
* 4. Execute step if condition passes
|
|
102
|
+
* 5. Check for failures and handle errors
|
|
103
|
+
*/
|
|
104
|
+
async execute(workflow) {
|
|
105
|
+
// Set up working directory for all commands
|
|
106
|
+
this.resolveBaseDir(workflow);
|
|
107
|
+
// Execute each step one by one
|
|
108
|
+
for (let i = 0; i < workflow.steps.length; i++) {
|
|
109
|
+
const step = workflow.steps[i];
|
|
110
|
+
const context = this.createStepContext(i, workflow);
|
|
111
|
+
// Check if step has a condition (when clause)
|
|
112
|
+
const hasWhenCondition = !!step.when;
|
|
113
|
+
// Skip step if condition is not met
|
|
114
|
+
if (!this.evaluateStepCondition(step)) {
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
// Execute the step (run, choose, prompt, parallel, or fail)
|
|
119
|
+
const stepResult = await this.executeStep(step, context, false, hasWhenCondition);
|
|
120
|
+
// For run steps, check if command succeeded
|
|
121
|
+
if (!this.isStepSuccessful(stepResult, step)) {
|
|
122
|
+
const lineInfo = context.lineNumber ? ` (line ${context.lineNumber})` : '';
|
|
123
|
+
throw new Error(`Step ${i}${lineInfo} failed`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
// Mark step as failed in workspace
|
|
128
|
+
this.workspace.setStepResult(i, false);
|
|
129
|
+
// Re-throw to let CLI handle error display
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Check if step result indicates success
|
|
136
|
+
*/
|
|
137
|
+
isStepSuccessful(stepResult, step) {
|
|
138
|
+
if (!('run' in step)) {
|
|
139
|
+
return true; // Non-run steps don't have success/failure
|
|
140
|
+
}
|
|
141
|
+
if (typeof stepResult === 'boolean') {
|
|
142
|
+
return stepResult;
|
|
143
|
+
}
|
|
144
|
+
if (stepResult && typeof stepResult === 'object' && 'success' in stepResult) {
|
|
145
|
+
return stepResult.success;
|
|
146
|
+
}
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Fix malformed step (YAML indentation issue)
|
|
151
|
+
* When choose/prompt is null but properties exist at step level
|
|
152
|
+
* This happens when YAML is incorrectly indented
|
|
153
|
+
*/
|
|
154
|
+
fixMalformedStep(step) {
|
|
155
|
+
// Type guard: check if step has malformed choose structure
|
|
156
|
+
const stepAsUnknown = step;
|
|
157
|
+
const stepAsRecord = stepAsUnknown;
|
|
158
|
+
const hasMalformedChoose = 'choose' in step &&
|
|
159
|
+
stepAsRecord.choose === null &&
|
|
160
|
+
'message' in step &&
|
|
161
|
+
'options' in step;
|
|
162
|
+
if (hasMalformedChoose) {
|
|
163
|
+
return {
|
|
164
|
+
choose: {
|
|
165
|
+
message: stepAsRecord.message,
|
|
166
|
+
options: stepAsRecord.options,
|
|
167
|
+
as: stepAsRecord.as,
|
|
168
|
+
},
|
|
169
|
+
when: stepAsRecord.when,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
// Type guard: check if step has malformed prompt structure
|
|
173
|
+
const hasMalformedPrompt = 'prompt' in step &&
|
|
174
|
+
stepAsRecord.prompt === null &&
|
|
175
|
+
'message' in step &&
|
|
176
|
+
'as' in step;
|
|
177
|
+
if (hasMalformedPrompt) {
|
|
178
|
+
return {
|
|
179
|
+
prompt: {
|
|
180
|
+
message: stepAsRecord.message,
|
|
181
|
+
as: stepAsRecord.as,
|
|
182
|
+
default: stepAsRecord.default,
|
|
183
|
+
},
|
|
184
|
+
when: stepAsRecord.when,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
return step;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Execute a single step based on its type
|
|
191
|
+
*
|
|
192
|
+
* Steps can be:
|
|
193
|
+
* - run: Execute a shell command
|
|
194
|
+
* - choose: Show user a choice menu
|
|
195
|
+
* - prompt: Ask user for text input
|
|
196
|
+
* - parallel: Execute multiple steps in parallel
|
|
197
|
+
* - fail: Intentionally fail with a message
|
|
198
|
+
*
|
|
199
|
+
* @param bufferOutput - If true, collect output instead of displaying immediately (for parallel)
|
|
200
|
+
* @param hasWhenCondition - If true, step has a condition (affects UI color)
|
|
201
|
+
*/
|
|
202
|
+
async executeStep(step, context, bufferOutput = false, hasWhenCondition = false) {
|
|
203
|
+
// Fix YAML parsing issues (when indentation is wrong)
|
|
204
|
+
step = this.fixMalformedStep(step);
|
|
205
|
+
// Execute shell command
|
|
206
|
+
if ('run' in step) {
|
|
207
|
+
const result = await this.executeRunStep(step, context, bufferOutput, hasWhenCondition);
|
|
208
|
+
// Return TaskRunResult if buffering, boolean otherwise
|
|
209
|
+
return bufferOutput && typeof result === 'object' && 'stdout' in result
|
|
210
|
+
? result
|
|
211
|
+
: result;
|
|
212
|
+
}
|
|
213
|
+
// Show choice menu to user
|
|
214
|
+
if ('choose' in step) {
|
|
215
|
+
await this.executeChooseStep(step, context);
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
// Ask user for text input
|
|
219
|
+
if ('prompt' in step) {
|
|
220
|
+
await this.executePromptStep(step, context);
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
// Execute multiple steps in parallel
|
|
224
|
+
if ('parallel' in step) {
|
|
225
|
+
await this.executeParallelStep(step, context);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
// Intentionally fail with error message
|
|
229
|
+
if ('fail' in step) {
|
|
230
|
+
await this.executeFailStep(step, context);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Execute a run step (shell command)
|
|
236
|
+
*
|
|
237
|
+
* Steps:
|
|
238
|
+
* 1. Calculate base step index (for parallel execution)
|
|
239
|
+
* 2. Substitute variables in command ({{variable}} syntax)
|
|
240
|
+
* 3. Run command via TaskRunner (with retry logic if specified)
|
|
241
|
+
* 4. Store result in workspace
|
|
242
|
+
*/
|
|
243
|
+
async executeRunStep(step, context, bufferOutput = false, hasWhenCondition = false) {
|
|
244
|
+
// For parallel steps, extract the base step index
|
|
245
|
+
const baseStepIndex = this.calculateBaseStepIndex(context);
|
|
246
|
+
// Replace {{variable}} with actual values from workspace
|
|
247
|
+
const command = substituteVariables(step.run, this.workspace);
|
|
248
|
+
// Get retry count (default: 0, meaning no retry)
|
|
249
|
+
const retryCount = step.retry ?? 0;
|
|
250
|
+
const timeoutSeconds = step.timeout;
|
|
251
|
+
// Execute with retry logic
|
|
252
|
+
let lastResult = false;
|
|
253
|
+
let attempt = 0;
|
|
254
|
+
while (attempt <= retryCount) {
|
|
255
|
+
// Execute the command
|
|
256
|
+
const result = await this.taskRunner.run(command, baseStepIndex, command, context.branchIndex, bufferOutput, hasWhenCondition, context.lineNumber, context.fileName, this.baseDir, timeoutSeconds);
|
|
257
|
+
// Extract success status
|
|
258
|
+
const success = typeof result === 'boolean' ? result : result.success;
|
|
259
|
+
lastResult = result;
|
|
260
|
+
// If successful or no more retries, break
|
|
261
|
+
if (success || attempt >= retryCount) {
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
264
|
+
// If failed and retries remaining, wait a bit before retrying
|
|
265
|
+
attempt++;
|
|
266
|
+
if (attempt <= retryCount) {
|
|
267
|
+
// Small delay before retry (exponential backoff: 1s, 2s, 4s...)
|
|
268
|
+
const delayMs = Math.min(1000 * Math.pow(2, attempt - 1), 10000); // Max 10 seconds
|
|
269
|
+
await new Promise(resolve => setTimeout(resolve, delayMs));
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Extract final success status and store in workspace
|
|
273
|
+
const finalSuccess = typeof lastResult === 'boolean' ? lastResult : lastResult.success;
|
|
274
|
+
this.workspace.setStepResult(context.stepIndex, finalSuccess);
|
|
275
|
+
return lastResult;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Execute a choose step (show user a selection menu)
|
|
279
|
+
*
|
|
280
|
+
* User selects from options, and the choice is stored:
|
|
281
|
+
* - As a choice (for when: { choice: 'id' } conditions) - uses choice id
|
|
282
|
+
* - As a variable (for {{variable}} substitution) - uses 'as' field if provided, otherwise choice id
|
|
283
|
+
*/
|
|
284
|
+
async executeChooseStep(step, context) {
|
|
285
|
+
// Show choice menu to user
|
|
286
|
+
const choice = await this.choicePrompt.prompt(step.choose.message, step.choose.options);
|
|
287
|
+
// Validate choice result
|
|
288
|
+
if (!choice?.id) {
|
|
289
|
+
throw new Error(`Invalid choice result: ${JSON.stringify(choice)}`);
|
|
290
|
+
}
|
|
291
|
+
// Determine variable name: use 'as' field if provided, otherwise use choice id
|
|
292
|
+
const variableName = step.choose.as || choice.id;
|
|
293
|
+
// Store choice in workspace (for conditions - always uses choice id)
|
|
294
|
+
this.workspace.setChoice(choice.id, choice.id);
|
|
295
|
+
// Store as variable (for {{variable}} substitution - uses 'as' field if provided)
|
|
296
|
+
this.workspace.setVariable(variableName, choice.id);
|
|
297
|
+
this.workspace.setStepResult(context.stepIndex, true);
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Execute a prompt step (ask user for text input)
|
|
301
|
+
*
|
|
302
|
+
* User enters text, which is stored:
|
|
303
|
+
* - As a variable (for {{variable}} substitution)
|
|
304
|
+
* - As a fact (for when: { var: 'name' } conditions)
|
|
305
|
+
*/
|
|
306
|
+
async executePromptStep(step, context) {
|
|
307
|
+
// Substitute variables in message and default value
|
|
308
|
+
const message = substituteVariables(step.prompt.message, this.workspace);
|
|
309
|
+
const defaultValue = step.prompt.default
|
|
310
|
+
? substituteVariables(step.prompt.default, this.workspace)
|
|
311
|
+
: undefined;
|
|
312
|
+
// Ask user for input
|
|
313
|
+
const value = await this.textPrompt.prompt(message, defaultValue);
|
|
314
|
+
// Store input in workspace (as both variable and fact)
|
|
315
|
+
this.workspace.setVariable(step.prompt.as, value);
|
|
316
|
+
this.workspace.setFact(step.prompt.as, value);
|
|
317
|
+
this.workspace.setStepResult(context.stepIndex, true);
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Create execution contexts for parallel branches
|
|
321
|
+
* Encodes branch index into stepIndex: baseStepIndex * MULTIPLIER + branchIndex
|
|
322
|
+
* Each branch inherits line number and file name from the parallel step
|
|
323
|
+
*/
|
|
324
|
+
createParallelContexts(step, baseContext) {
|
|
325
|
+
return step.parallel.map((_, branchIndex) => ({
|
|
326
|
+
workspace: this.workspace.clone(),
|
|
327
|
+
stepIndex: baseContext.stepIndex * Executor.PARALLEL_STEP_INDEX_MULTIPLIER + branchIndex,
|
|
328
|
+
branchIndex: branchIndex,
|
|
329
|
+
lineNumber: baseContext.lineNumber, // Inherit line number from parallel step
|
|
330
|
+
fileName: baseContext.fileName, // Inherit file name from parallel step
|
|
331
|
+
}));
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Get display name for a parallel branch step
|
|
335
|
+
*/
|
|
336
|
+
getBranchDisplayName(step, index) {
|
|
337
|
+
if ('run' in step) {
|
|
338
|
+
return step.run;
|
|
339
|
+
}
|
|
340
|
+
if ('choose' in step) {
|
|
341
|
+
return `Choose: ${step.choose.message}`;
|
|
342
|
+
}
|
|
343
|
+
if ('prompt' in step) {
|
|
344
|
+
return `Prompt: ${step.prompt.message}`;
|
|
345
|
+
}
|
|
346
|
+
if ('fail' in step) {
|
|
347
|
+
return `Fail: ${step.fail.message}`;
|
|
348
|
+
}
|
|
349
|
+
return `Branch ${index + 1}`;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Execute all parallel branches simultaneously
|
|
353
|
+
*
|
|
354
|
+
* Each branch:
|
|
355
|
+
* 1. Has its own workspace clone (isolated state)
|
|
356
|
+
* 2. Evaluates its own conditions
|
|
357
|
+
* 3. Executes in buffer mode (collects output, don't display yet)
|
|
358
|
+
* 4. Returns result or error
|
|
359
|
+
*
|
|
360
|
+
* All branches run at the same time using Promise.all()
|
|
361
|
+
* Uses log-update to show all branch statuses in real-time
|
|
362
|
+
*/
|
|
363
|
+
async executeParallelBranches(steps, contexts) {
|
|
364
|
+
const branchStatuses = [];
|
|
365
|
+
const spinnerFrames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
366
|
+
let spinnerFrameIndex = 0;
|
|
367
|
+
// Initialize branch statuses
|
|
368
|
+
for (let i = 0; i < steps.length; i++) {
|
|
369
|
+
const parallelStep = steps[i];
|
|
370
|
+
const branchContext = contexts[i];
|
|
371
|
+
// Evaluate condition for this branch
|
|
372
|
+
if (parallelStep.when) {
|
|
373
|
+
const evaluator = new ConditionEvaluator(branchContext.workspace);
|
|
374
|
+
const conditionResult = evaluator.evaluate(parallelStep.when);
|
|
375
|
+
if (!conditionResult) {
|
|
376
|
+
continue; // Skip this branch
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
const branchName = this.getBranchDisplayName(parallelStep, i);
|
|
380
|
+
branchStatuses.push({
|
|
381
|
+
index: i,
|
|
382
|
+
name: branchName,
|
|
383
|
+
status: 'pending',
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
// Start spinner animation
|
|
387
|
+
const spinnerInterval = setInterval(() => {
|
|
388
|
+
spinnerFrameIndex = (spinnerFrameIndex + 1) % spinnerFrames.length;
|
|
389
|
+
this.updateParallelBranchesDisplay(branchStatuses, spinnerFrames[spinnerFrameIndex]);
|
|
390
|
+
}, 100);
|
|
391
|
+
// Create promises for all branches
|
|
392
|
+
const promises = branchStatuses.map(async (branchStatus) => {
|
|
393
|
+
const { index } = branchStatus;
|
|
394
|
+
const parallelStep = steps[index];
|
|
395
|
+
const branchContext = contexts[index];
|
|
396
|
+
// Mark as running
|
|
397
|
+
branchStatus.status = 'running';
|
|
398
|
+
try {
|
|
399
|
+
// Execute step in buffer mode (collect output, don't display yet)
|
|
400
|
+
const result = await this.executeStep(parallelStep, branchContext, true);
|
|
401
|
+
// Mark as success
|
|
402
|
+
branchStatus.status = 'success';
|
|
403
|
+
this.updateParallelBranchesDisplay(branchStatuses, spinnerFrames[spinnerFrameIndex]);
|
|
404
|
+
return { index, result: result, context: branchContext };
|
|
405
|
+
}
|
|
406
|
+
catch (error) {
|
|
407
|
+
// Mark branch as failed
|
|
408
|
+
branchContext.workspace.setStepResult(branchContext.stepIndex, false);
|
|
409
|
+
// Mark as failed
|
|
410
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
411
|
+
branchStatus.status = 'failed';
|
|
412
|
+
branchStatus.error = errorMessage;
|
|
413
|
+
this.updateParallelBranchesDisplay(branchStatuses, spinnerFrames[spinnerFrameIndex]);
|
|
414
|
+
return { index, error, context: branchContext };
|
|
415
|
+
}
|
|
416
|
+
});
|
|
417
|
+
// Wait for all branches to complete
|
|
418
|
+
const results = await Promise.all(promises);
|
|
419
|
+
// Stop spinner and show final status
|
|
420
|
+
clearInterval(spinnerInterval);
|
|
421
|
+
this.updateParallelBranchesDisplay(branchStatuses, '', true);
|
|
422
|
+
logUpdate.done();
|
|
423
|
+
return results;
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Update parallel branches display using log-update
|
|
427
|
+
*/
|
|
428
|
+
updateParallelBranchesDisplay(branchStatuses, spinner, final = false) {
|
|
429
|
+
const lines = branchStatuses.map((branch) => {
|
|
430
|
+
const branchNum = branch.index + 1;
|
|
431
|
+
let icon = '';
|
|
432
|
+
let text = '';
|
|
433
|
+
switch (branch.status) {
|
|
434
|
+
case 'pending':
|
|
435
|
+
icon = '○';
|
|
436
|
+
text = `Branch ${branchNum}: ${branch.name} - Pending`;
|
|
437
|
+
break;
|
|
438
|
+
case 'running':
|
|
439
|
+
icon = spinner;
|
|
440
|
+
text = `Branch ${branchNum}: ${branch.name} - Running...`;
|
|
441
|
+
break;
|
|
442
|
+
case 'success':
|
|
443
|
+
icon = '✓';
|
|
444
|
+
text = `Branch ${branchNum}: ${branch.name} - Completed`;
|
|
445
|
+
break;
|
|
446
|
+
case 'failed':
|
|
447
|
+
icon = '✗';
|
|
448
|
+
text = `Branch ${branchNum}: ${branch.name} - Failed${branch.error ? `: ${branch.error}` : ''}`;
|
|
449
|
+
break;
|
|
450
|
+
}
|
|
451
|
+
return `${icon} ${text}`;
|
|
452
|
+
});
|
|
453
|
+
if (final) {
|
|
454
|
+
// Final display - show all statuses
|
|
455
|
+
logUpdate(lines.join('\n'));
|
|
456
|
+
}
|
|
457
|
+
else {
|
|
458
|
+
// Live update
|
|
459
|
+
logUpdate(lines.join('\n'));
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Display parallel execution results
|
|
464
|
+
* Status display is already done, now we show the detailed output
|
|
465
|
+
*/
|
|
466
|
+
displayParallelResults(results, steps, _context) {
|
|
467
|
+
let allBranchesSucceeded = true;
|
|
468
|
+
let hasAnyResult = false;
|
|
469
|
+
// Add a blank line after spinners
|
|
470
|
+
console.log('');
|
|
471
|
+
for (const result of results) {
|
|
472
|
+
if (!result)
|
|
473
|
+
continue;
|
|
474
|
+
hasAnyResult = true;
|
|
475
|
+
const { index, result: stepResult, error, context: branchContext } = result;
|
|
476
|
+
if (error) {
|
|
477
|
+
allBranchesSucceeded = false;
|
|
478
|
+
// Error was already shown by spinner, but show detailed error box
|
|
479
|
+
const errorMessage = `Branch ${index + 1} failed: ${error instanceof Error ? error.message : String(error)}`;
|
|
480
|
+
const errorBox = createErrorBox(errorMessage);
|
|
481
|
+
console.error(errorBox);
|
|
482
|
+
}
|
|
483
|
+
else if (stepResult && typeof stepResult === 'object' && 'stdout' in stepResult) {
|
|
484
|
+
const taskResult = stepResult;
|
|
485
|
+
allBranchesSucceeded = allBranchesSucceeded && taskResult.success;
|
|
486
|
+
// Only show output if there's actual output or if it failed
|
|
487
|
+
if (taskResult.stdout.length > 0 || taskResult.stderr.length > 0 || !taskResult.success) {
|
|
488
|
+
const parallelStep = steps[index];
|
|
489
|
+
const stepName = this.getBranchDisplayName(parallelStep, index);
|
|
490
|
+
// Use branch context's line number and file name for display
|
|
491
|
+
this.taskRunner.displayBufferedOutput(taskResult, stepName, false, branchContext.lineNumber, branchContext.fileName);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
// If no branches executed (all were skipped due to conditions), show a message
|
|
496
|
+
if (!hasAnyResult) {
|
|
497
|
+
console.log('⚠️ All parallel branches were skipped (conditions not met)');
|
|
498
|
+
}
|
|
499
|
+
const parallelFooterMessage = createParallelFooterMessage(allBranchesSucceeded);
|
|
500
|
+
console.log(parallelFooterMessage);
|
|
501
|
+
return allBranchesSucceeded;
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* Merge facts and variables from parallel branches
|
|
505
|
+
*/
|
|
506
|
+
mergeParallelResults(contexts) {
|
|
507
|
+
for (const branchContext of contexts) {
|
|
508
|
+
const facts = branchContext.workspace.getAllFacts();
|
|
509
|
+
const variables = branchContext.workspace.getAllVariables();
|
|
510
|
+
for (const [key, value] of facts) {
|
|
511
|
+
this.workspace.setFact(key, value);
|
|
512
|
+
}
|
|
513
|
+
for (const [key, value] of variables) {
|
|
514
|
+
this.workspace.setVariable(key, value);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* Count how many branches will actually execute (after when condition evaluation)
|
|
520
|
+
*/
|
|
521
|
+
countExecutableBranches(steps, contexts) {
|
|
522
|
+
let count = 0;
|
|
523
|
+
for (let i = 0; i < steps.length; i++) {
|
|
524
|
+
const parallelStep = steps[i];
|
|
525
|
+
const branchContext = contexts[i];
|
|
526
|
+
// Evaluate condition for this branch
|
|
527
|
+
if (parallelStep.when) {
|
|
528
|
+
const evaluator = new ConditionEvaluator(branchContext.workspace);
|
|
529
|
+
const conditionResult = evaluator.evaluate(parallelStep.when);
|
|
530
|
+
if (!conditionResult) {
|
|
531
|
+
continue; // Skip this branch
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
count++;
|
|
535
|
+
}
|
|
536
|
+
return count;
|
|
537
|
+
}
|
|
538
|
+
/**
|
|
539
|
+
* Execute a parallel step (run multiple steps simultaneously)
|
|
540
|
+
*
|
|
541
|
+
* Process:
|
|
542
|
+
* 1. Create isolated contexts for each branch (with cloned workspaces)
|
|
543
|
+
* 2. Count how many branches will actually execute
|
|
544
|
+
* 3. Show header box with actual executable branch count
|
|
545
|
+
* 4. Execute all branches in parallel
|
|
546
|
+
* 5. Display results
|
|
547
|
+
* 6. Merge facts and variables from all branches back to main workspace
|
|
548
|
+
* 7. Throw error if any branch failed
|
|
549
|
+
*/
|
|
550
|
+
async executeParallelStep(step, context) {
|
|
551
|
+
// Create isolated contexts for each branch (each has its own workspace clone)
|
|
552
|
+
const parallelContexts = this.createParallelContexts(step, context);
|
|
553
|
+
// Count how many branches will actually execute (after when condition evaluation)
|
|
554
|
+
const executableBranchCount = this.countExecutableBranches(step.parallel, parallelContexts);
|
|
555
|
+
// Show parallel execution header with actual executable branch count
|
|
556
|
+
const parallelHeaderBox = createParallelHeaderBox(executableBranchCount);
|
|
557
|
+
console.log(parallelHeaderBox);
|
|
558
|
+
// Execute all branches at the same time
|
|
559
|
+
const results = await this.executeParallelBranches(step.parallel, parallelContexts);
|
|
560
|
+
// Display results and check if all succeeded
|
|
561
|
+
const allBranchesSucceeded = this.displayParallelResults(results, step.parallel, context);
|
|
562
|
+
// Store overall result
|
|
563
|
+
this.workspace.setStepResult(context.stepIndex, allBranchesSucceeded);
|
|
564
|
+
// If any branch failed, throw error
|
|
565
|
+
if (!allBranchesSucceeded) {
|
|
566
|
+
const lineInfo = context.lineNumber ? ` (line ${context.lineNumber})` : '';
|
|
567
|
+
throw new Error(`Parallel step ${context.stepIndex}${lineInfo} failed: one or more branches failed`);
|
|
568
|
+
}
|
|
569
|
+
// Merge all facts and variables from branches back to main workspace
|
|
570
|
+
this.mergeParallelResults(parallelContexts);
|
|
571
|
+
}
|
|
572
|
+
async executeFailStep(step, _context) {
|
|
573
|
+
const error = new Error(step.fail.message);
|
|
574
|
+
// Remove stack trace for cleaner error messages
|
|
575
|
+
error.stack = undefined;
|
|
576
|
+
throw error;
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/core/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Parser
|
|
3
|
+
*
|
|
4
|
+
* Supports both YAML and JSON format workflow files.
|
|
5
|
+
* Uses polymorphism to handle different file formats.
|
|
6
|
+
* Validates parsed data using Zod schemas for type safety.
|
|
7
|
+
*/
|
|
8
|
+
import type { Workflow } from '../types/workflow.js';
|
|
9
|
+
/**
|
|
10
|
+
* Parser interface for workflow files
|
|
11
|
+
*/
|
|
12
|
+
export interface WorkflowParser {
|
|
13
|
+
/**
|
|
14
|
+
* Parse workflow content into Workflow object
|
|
15
|
+
*/
|
|
16
|
+
parse(content: string): Workflow;
|
|
17
|
+
/**
|
|
18
|
+
* Extract line numbers for each step (for error reporting)
|
|
19
|
+
* Returns a map: stepIndex -> lineNumber
|
|
20
|
+
*/
|
|
21
|
+
extractStepLineNumbers(content: string): Map<number, number>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* YAML Parser
|
|
25
|
+
*/
|
|
26
|
+
export declare class YAMLParser implements WorkflowParser {
|
|
27
|
+
parse(content: string): Workflow;
|
|
28
|
+
extractStepLineNumbers(content: string): Map<number, number>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* JSON Parser
|
|
32
|
+
*/
|
|
33
|
+
export declare class JSONParser implements WorkflowParser {
|
|
34
|
+
parse(content: string): Workflow;
|
|
35
|
+
extractStepLineNumbers(content: string): Map<number, number>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get appropriate parser based on file extension
|
|
39
|
+
*/
|
|
40
|
+
export declare function getParser(filePath: string): WorkflowParser;
|
|
41
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC;IAEjC;;;OAGG;IACH,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9D;AAwDD;;GAEG;AACH,qBAAa,UAAW,YAAW,cAAc;IAC/C,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ;IAiChC,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;CAqB7D;AAED;;GAEG;AACH,qBAAa,UAAW,YAAW,cAAc;IAC/C,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ;IAiChC,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;CA0C7D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAc1D"}
|