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.
Files changed (161) hide show
  1. package/LICENSE +21 -0
  2. package/README.ko.md +1034 -0
  3. package/README.md +1031 -0
  4. package/dist/cli/index.d.ts +19 -0
  5. package/dist/cli/index.d.ts.map +1 -0
  6. package/dist/cli/index.js +147 -0
  7. package/dist/cli/index.js.map +1 -0
  8. package/dist/cli/prompts.d.ts +48 -0
  9. package/dist/cli/prompts.d.ts.map +1 -0
  10. package/dist/cli/prompts.js +75 -0
  11. package/dist/cli/prompts.js.map +1 -0
  12. package/dist/cli/ui.d.ts +39 -0
  13. package/dist/cli/ui.d.ts.map +1 -0
  14. package/dist/cli/ui.js +84 -0
  15. package/dist/cli/ui.js.map +1 -0
  16. package/dist/core/__tests__/actual-execution.test.d.ts +2 -0
  17. package/dist/core/__tests__/actual-execution.test.d.ts.map +1 -0
  18. package/dist/core/__tests__/actual-execution.test.js +140 -0
  19. package/dist/core/__tests__/actual-execution.test.js.map +1 -0
  20. package/dist/core/__tests__/base-dir.test.d.ts +2 -0
  21. package/dist/core/__tests__/base-dir.test.d.ts.map +1 -0
  22. package/dist/core/__tests__/base-dir.test.js +146 -0
  23. package/dist/core/__tests__/base-dir.test.js.map +1 -0
  24. package/dist/core/__tests__/built-code-execution.test.d.ts +2 -0
  25. package/dist/core/__tests__/built-code-execution.test.d.ts.map +1 -0
  26. package/dist/core/__tests__/built-code-execution.test.js +48 -0
  27. package/dist/core/__tests__/built-code-execution.test.js.map +1 -0
  28. package/dist/core/__tests__/choose-as-var-condition.test.d.ts +2 -0
  29. package/dist/core/__tests__/choose-as-var-condition.test.d.ts.map +1 -0
  30. package/dist/core/__tests__/choose-as-var-condition.test.js +308 -0
  31. package/dist/core/__tests__/choose-as-var-condition.test.js.map +1 -0
  32. package/dist/core/__tests__/cli-integration.test.d.ts +2 -0
  33. package/dist/core/__tests__/cli-integration.test.d.ts.map +1 -0
  34. package/dist/core/__tests__/cli-integration.test.js +83 -0
  35. package/dist/core/__tests__/cli-integration.test.js.map +1 -0
  36. package/dist/core/__tests__/comprehensive-basic-yaml.test.d.ts +2 -0
  37. package/dist/core/__tests__/comprehensive-basic-yaml.test.d.ts.map +1 -0
  38. package/dist/core/__tests__/comprehensive-basic-yaml.test.js +111 -0
  39. package/dist/core/__tests__/comprehensive-basic-yaml.test.js.map +1 -0
  40. package/dist/core/__tests__/condition-evaluator.test.d.ts +2 -0
  41. package/dist/core/__tests__/condition-evaluator.test.d.ts.map +1 -0
  42. package/dist/core/__tests__/condition-evaluator.test.js +170 -0
  43. package/dist/core/__tests__/condition-evaluator.test.js.map +1 -0
  44. package/dist/core/__tests__/debug-basic-yaml.test.d.ts +2 -0
  45. package/dist/core/__tests__/debug-basic-yaml.test.d.ts.map +1 -0
  46. package/dist/core/__tests__/debug-basic-yaml.test.js +128 -0
  47. package/dist/core/__tests__/debug-basic-yaml.test.js.map +1 -0
  48. package/dist/core/__tests__/example-files.test.d.ts +2 -0
  49. package/dist/core/__tests__/example-files.test.d.ts.map +1 -0
  50. package/dist/core/__tests__/example-files.test.js +200 -0
  51. package/dist/core/__tests__/example-files.test.js.map +1 -0
  52. package/dist/core/__tests__/executor-choice-integration.test.d.ts +2 -0
  53. package/dist/core/__tests__/executor-choice-integration.test.d.ts.map +1 -0
  54. package/dist/core/__tests__/executor-choice-integration.test.js +171 -0
  55. package/dist/core/__tests__/executor-choice-integration.test.js.map +1 -0
  56. package/dist/core/__tests__/executor-choice.test.d.ts +2 -0
  57. package/dist/core/__tests__/executor-choice.test.d.ts.map +1 -0
  58. package/dist/core/__tests__/executor-choice.test.js +174 -0
  59. package/dist/core/__tests__/executor-choice.test.js.map +1 -0
  60. package/dist/core/__tests__/executor-parallel.test.d.ts +2 -0
  61. package/dist/core/__tests__/executor-parallel.test.d.ts.map +1 -0
  62. package/dist/core/__tests__/executor-parallel.test.js +136 -0
  63. package/dist/core/__tests__/executor-parallel.test.js.map +1 -0
  64. package/dist/core/__tests__/executor-prompt.test.d.ts +2 -0
  65. package/dist/core/__tests__/executor-prompt.test.d.ts.map +1 -0
  66. package/dist/core/__tests__/executor-prompt.test.js +149 -0
  67. package/dist/core/__tests__/executor-prompt.test.js.map +1 -0
  68. package/dist/core/__tests__/executor-real-scenario.test.d.ts +2 -0
  69. package/dist/core/__tests__/executor-real-scenario.test.d.ts.map +1 -0
  70. package/dist/core/__tests__/executor-real-scenario.test.js +169 -0
  71. package/dist/core/__tests__/executor-real-scenario.test.js.map +1 -0
  72. package/dist/core/__tests__/file-condition.test.d.ts +2 -0
  73. package/dist/core/__tests__/file-condition.test.d.ts.map +1 -0
  74. package/dist/core/__tests__/file-condition.test.js +182 -0
  75. package/dist/core/__tests__/file-condition.test.js.map +1 -0
  76. package/dist/core/__tests__/final-verification.test.d.ts +2 -0
  77. package/dist/core/__tests__/final-verification.test.d.ts.map +1 -0
  78. package/dist/core/__tests__/final-verification.test.js +59 -0
  79. package/dist/core/__tests__/final-verification.test.js.map +1 -0
  80. package/dist/core/__tests__/parallel-when-condition.test.d.ts +2 -0
  81. package/dist/core/__tests__/parallel-when-condition.test.d.ts.map +1 -0
  82. package/dist/core/__tests__/parallel-when-condition.test.js +155 -0
  83. package/dist/core/__tests__/parallel-when-condition.test.js.map +1 -0
  84. package/dist/core/__tests__/parser.test.d.ts +2 -0
  85. package/dist/core/__tests__/parser.test.d.ts.map +1 -0
  86. package/dist/core/__tests__/parser.test.js +94 -0
  87. package/dist/core/__tests__/parser.test.js.map +1 -0
  88. package/dist/core/__tests__/real-inquirer-test.test.d.ts +2 -0
  89. package/dist/core/__tests__/real-inquirer-test.test.d.ts.map +1 -0
  90. package/dist/core/__tests__/real-inquirer-test.test.js +20 -0
  91. package/dist/core/__tests__/real-inquirer-test.test.js.map +1 -0
  92. package/dist/core/__tests__/reproduce-bug.test.d.ts +2 -0
  93. package/dist/core/__tests__/reproduce-bug.test.d.ts.map +1 -0
  94. package/dist/core/__tests__/reproduce-bug.test.js +84 -0
  95. package/dist/core/__tests__/reproduce-bug.test.js.map +1 -0
  96. package/dist/core/__tests__/timeout-retry.test.d.ts +2 -0
  97. package/dist/core/__tests__/timeout-retry.test.d.ts.map +1 -0
  98. package/dist/core/__tests__/timeout-retry.test.js +184 -0
  99. package/dist/core/__tests__/timeout-retry.test.js.map +1 -0
  100. package/dist/core/__tests__/workflow-validation.test.d.ts +2 -0
  101. package/dist/core/__tests__/workflow-validation.test.d.ts.map +1 -0
  102. package/dist/core/__tests__/workflow-validation.test.js +120 -0
  103. package/dist/core/__tests__/workflow-validation.test.js.map +1 -0
  104. package/dist/core/__tests__/workspace.test.d.ts +2 -0
  105. package/dist/core/__tests__/workspace.test.d.ts.map +1 -0
  106. package/dist/core/__tests__/workspace.test.js +29 -0
  107. package/dist/core/__tests__/workspace.test.js.map +1 -0
  108. package/dist/core/__tests__/yaml-integration.test.d.ts +2 -0
  109. package/dist/core/__tests__/yaml-integration.test.d.ts.map +1 -0
  110. package/dist/core/__tests__/yaml-integration.test.js +114 -0
  111. package/dist/core/__tests__/yaml-integration.test.js.map +1 -0
  112. package/dist/core/__tests__/yaml-scenarios.test.d.ts +2 -0
  113. package/dist/core/__tests__/yaml-scenarios.test.d.ts.map +1 -0
  114. package/dist/core/__tests__/yaml-scenarios.test.js +199 -0
  115. package/dist/core/__tests__/yaml-scenarios.test.js.map +1 -0
  116. package/dist/core/condition-evaluator.d.ts +44 -0
  117. package/dist/core/condition-evaluator.d.ts.map +1 -0
  118. package/dist/core/condition-evaluator.js +121 -0
  119. package/dist/core/condition-evaluator.js.map +1 -0
  120. package/dist/core/executor.d.ts +172 -0
  121. package/dist/core/executor.d.ts.map +1 -0
  122. package/dist/core/executor.js +579 -0
  123. package/dist/core/executor.js.map +1 -0
  124. package/dist/core/parser.d.ts +41 -0
  125. package/dist/core/parser.d.ts.map +1 -0
  126. package/dist/core/parser.js +202 -0
  127. package/dist/core/parser.js.map +1 -0
  128. package/dist/core/rust-task-runner.d.ts +14 -0
  129. package/dist/core/rust-task-runner.d.ts.map +1 -0
  130. package/dist/core/rust-task-runner.js +34 -0
  131. package/dist/core/rust-task-runner.js.map +1 -0
  132. package/dist/core/task-runner.d.ts +63 -0
  133. package/dist/core/task-runner.d.ts.map +1 -0
  134. package/dist/core/task-runner.js +252 -0
  135. package/dist/core/task-runner.js.map +1 -0
  136. package/dist/core/template.d.ts +11 -0
  137. package/dist/core/template.d.ts.map +1 -0
  138. package/dist/core/template.js +36 -0
  139. package/dist/core/template.js.map +1 -0
  140. package/dist/core/workflow-schema.d.ts +31 -0
  141. package/dist/core/workflow-schema.d.ts.map +1 -0
  142. package/dist/core/workflow-schema.js +125 -0
  143. package/dist/core/workflow-schema.js.map +1 -0
  144. package/dist/core/workspace.d.ts +90 -0
  145. package/dist/core/workspace.d.ts.map +1 -0
  146. package/dist/core/workspace.js +143 -0
  147. package/dist/core/workspace.js.map +1 -0
  148. package/dist/index.d.ts +10 -0
  149. package/dist/index.d.ts.map +1 -0
  150. package/dist/index.js +10 -0
  151. package/dist/index.js.map +1 -0
  152. package/dist/task-pipeliner-rs.node +0 -0
  153. package/dist/types/condition.d.ts +62 -0
  154. package/dist/types/condition.d.ts.map +1 -0
  155. package/dist/types/condition.js +6 -0
  156. package/dist/types/condition.js.map +1 -0
  157. package/dist/types/workflow.d.ts +69 -0
  158. package/dist/types/workflow.d.ts.map +1 -0
  159. package/dist/types/workflow.js +2 -0
  160. package/dist/types/workflow.js.map +1 -0
  161. 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"}