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,182 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { ConditionEvaluator } from '../condition-evaluator.js';
3
+ import { Executor } from '../executor.js';
4
+ import { Workspace } from '../workspace.js';
5
+ // Mock ChoicePrompt, TextPrompt
6
+ vi.mock('../../cli/prompts.js', () => {
7
+ return {
8
+ ChoicePrompt: vi.fn().mockImplementation(() => {
9
+ return {
10
+ prompt: vi.fn(),
11
+ };
12
+ }),
13
+ TextPrompt: vi.fn().mockImplementation(() => {
14
+ return {
15
+ prompt: vi.fn(),
16
+ };
17
+ }),
18
+ };
19
+ });
20
+ // Mock TaskRunner
21
+ const mockRun = vi.fn().mockResolvedValue(true);
22
+ vi.mock('../task-runner.js', () => {
23
+ return {
24
+ TaskRunner: vi.fn().mockImplementation(() => {
25
+ return {
26
+ run: mockRun,
27
+ };
28
+ }),
29
+ };
30
+ });
31
+ describe('File condition and choice-only when clauses', () => {
32
+ let executor;
33
+ beforeEach(() => {
34
+ vi.clearAllMocks();
35
+ executor = new Executor();
36
+ });
37
+ describe('file condition', () => {
38
+ it('should check if file exists', () => {
39
+ const workspace = new Workspace();
40
+ const evaluator = new ConditionEvaluator(workspace);
41
+ // Check actual file (package.json must exist)
42
+ const condition = { file: 'package.json' };
43
+ expect(evaluator.evaluate(condition)).toBe(true);
44
+ });
45
+ it('should return false when file does not exist', () => {
46
+ const workspace = new Workspace();
47
+ const evaluator = new ConditionEvaluator(workspace);
48
+ const condition = { file: 'nonexistent-file-12345.txt' };
49
+ expect(evaluator.evaluate(condition)).toBe(false);
50
+ });
51
+ it('should work with all condition', () => {
52
+ const workspace = new Workspace();
53
+ const evaluator = new ConditionEvaluator(workspace);
54
+ const condition = {
55
+ all: [
56
+ { file: 'package.json' },
57
+ { file: 'tsconfig.json' },
58
+ ],
59
+ };
60
+ expect(evaluator.evaluate(condition)).toBe(true);
61
+ });
62
+ it('should work with any condition', () => {
63
+ const workspace = new Workspace();
64
+ const evaluator = new ConditionEvaluator(workspace);
65
+ const condition = {
66
+ any: [
67
+ { file: 'package.json' },
68
+ { file: 'nonexistent-file.txt' },
69
+ ],
70
+ };
71
+ expect(evaluator.evaluate(condition)).toBe(true);
72
+ });
73
+ });
74
+ describe('variable value comparison when clauses', () => {
75
+ it('should execute step based on variable value', async () => {
76
+ const workflow = {
77
+ steps: [
78
+ {
79
+ choose: {
80
+ message: 'Choose?',
81
+ options: [
82
+ { id: 'option1', label: 'Option 1' },
83
+ ],
84
+ as: 'choice',
85
+ },
86
+ },
87
+ {
88
+ when: {
89
+ var: {
90
+ choice: 'option1'
91
+ }
92
+ },
93
+ run: 'echo "Option 1 selected"',
94
+ },
95
+ ],
96
+ };
97
+ const choicePrompt = executor.choicePrompt;
98
+ choicePrompt.prompt = vi.fn().mockResolvedValue({ id: 'option1', label: 'Option 1' });
99
+ await executor.execute(workflow);
100
+ const calls = mockRun.mock.calls.map(call => call[0]);
101
+ expect(calls).toContain('echo "Option 1 selected"');
102
+ });
103
+ it('should skip step when variable value does not match', async () => {
104
+ const workflow = {
105
+ steps: [
106
+ {
107
+ choose: {
108
+ message: 'Choose?',
109
+ options: [
110
+ { id: 'option1', label: 'Option 1' },
111
+ ],
112
+ as: 'choice',
113
+ },
114
+ },
115
+ {
116
+ when: {
117
+ var: {
118
+ choice: 'option2'
119
+ }
120
+ },
121
+ run: 'echo "This should not run"',
122
+ },
123
+ ],
124
+ };
125
+ const choicePrompt = executor.choicePrompt;
126
+ choicePrompt.prompt = vi.fn().mockResolvedValue({ id: 'option1', label: 'Option 1' });
127
+ await executor.execute(workflow);
128
+ const calls = mockRun.mock.calls.map(call => call[0]);
129
+ expect(calls).not.toContain('echo "This should not run"');
130
+ });
131
+ });
132
+ describe('run step without sets/declares', () => {
133
+ it('should execute run step without fact setting', async () => {
134
+ const workflow = {
135
+ steps: [
136
+ {
137
+ run: 'echo "Step 1"',
138
+ },
139
+ {
140
+ run: 'echo "Step 2"',
141
+ },
142
+ ],
143
+ };
144
+ await executor.execute(workflow);
145
+ const calls = mockRun.mock.calls.map(call => call[0]);
146
+ expect(calls).toContain('echo "Step 1"');
147
+ expect(calls).toContain('echo "Step 2"');
148
+ });
149
+ it('should stop workflow on step failure', async () => {
150
+ let callCount = 0;
151
+ mockRun.mockImplementation((_cmd) => {
152
+ callCount++;
153
+ if (callCount === 1) {
154
+ return Promise.resolve(false);
155
+ }
156
+ return Promise.resolve(true);
157
+ });
158
+ const workflow = {
159
+ steps: [
160
+ {
161
+ run: 'echo "This will fail"',
162
+ },
163
+ {
164
+ run: 'echo "This should not run"',
165
+ },
166
+ ],
167
+ };
168
+ try {
169
+ await executor.execute(workflow);
170
+ expect(true).toBe(false); // Should not reach here
171
+ }
172
+ catch (error) {
173
+ expect(error).toBeDefined();
174
+ }
175
+ const calls = mockRun.mock.calls.map(call => call[0]);
176
+ expect(calls).not.toContain('echo "This should not run"');
177
+ // Restore to original
178
+ mockRun.mockResolvedValue(true);
179
+ });
180
+ });
181
+ });
182
+ //# sourceMappingURL=file-condition.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-condition.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/file-condition.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=final-verification.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"final-verification.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/final-verification.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,59 @@
1
+ import { readFileSync } from 'fs';
2
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
3
+ import { parse } from 'yaml';
4
+ import { Executor } from '../executor.js';
5
+ // Final verification: Execute actual YAML files and verify all steps execute correctly
6
+ describe('FINAL VERIFICATION: Basic YAML Must Work', () => {
7
+ let executor;
8
+ let executedCommands;
9
+ beforeEach(() => {
10
+ vi.clearAllMocks();
11
+ executor = new Executor();
12
+ executedCommands = [];
13
+ const taskRunner = executor.taskRunner;
14
+ taskRunner.run = vi.fn().mockImplementation((cmd) => {
15
+ executedCommands.push(cmd);
16
+ return Promise.resolve(true);
17
+ });
18
+ // Mock TextPrompt (prevent timeout)
19
+ const textPrompt = executor.textPrompt;
20
+ textPrompt.prompt = vi.fn().mockResolvedValue('1.0.0');
21
+ });
22
+ it('FINAL TEST: basic.yaml with staging - ALL STEPS MUST EXECUTE', async () => {
23
+ const content = readFileSync('examples/yaml-examples/basic.yaml', 'utf-8');
24
+ const workflow = parse(content);
25
+ const choicePrompt = executor.choicePrompt;
26
+ choicePrompt.prompt = vi.fn().mockResolvedValue({ id: 'staging', label: 'Staging' });
27
+ await executor.execute(workflow);
28
+ // Required verification - all of these must pass
29
+ const requiredCommands = [
30
+ 'echo "Building..."',
31
+ 'echo "Deploying to staging..."',
32
+ ];
33
+ requiredCommands.forEach(cmd => {
34
+ expect(executedCommands).toContain(cmd);
35
+ });
36
+ // Commands that should not be executed
37
+ expect(executedCommands).not.toContain('echo "Deploying to production..."');
38
+ // Verify workspace state
39
+ const workspace = executor.workspace;
40
+ expect(workspace.hasChoice('staging')).toBe(true);
41
+ expect(workspace.hasChoice('prod')).toBe(false);
42
+ console.log('\n✅ FINAL TEST PASSED - All steps executed correctly');
43
+ console.log('Executed commands:', executedCommands);
44
+ });
45
+ it('FINAL TEST: basic.yaml with prod - ALL STEPS MUST EXECUTE', async () => {
46
+ const content = readFileSync('examples/yaml-examples/basic.yaml', 'utf-8');
47
+ const workflow = parse(content);
48
+ const choicePrompt = executor.choicePrompt;
49
+ choicePrompt.prompt = vi.fn().mockResolvedValue({ id: 'prod', label: 'Production' });
50
+ await executor.execute(workflow);
51
+ expect(executedCommands).toContain('echo "Deploying to production..."');
52
+ expect(executedCommands).not.toContain('echo "Deploying to staging..."');
53
+ const workspace = executor.workspace;
54
+ expect(workspace.hasChoice('prod')).toBe(true);
55
+ expect(workspace.hasChoice('staging')).toBe(false);
56
+ console.log('\n✅ FINAL TEST PASSED - Prod choice works correctly');
57
+ });
58
+ });
59
+ //# sourceMappingURL=final-verification.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"final-verification.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/final-verification.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parallel-when-condition.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-when-condition.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/parallel-when-condition.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,155 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { Executor } from '../executor.js';
3
+ // Mock TaskRunner
4
+ const mockRun = vi.fn();
5
+ vi.mock('../task-runner', () => ({
6
+ TaskRunner: vi.fn().mockImplementation(() => ({
7
+ run: mockRun,
8
+ runRealtime: mockRun,
9
+ displayBufferedOutput: vi.fn(),
10
+ })),
11
+ }));
12
+ describe('Parallel with when condition - Bug Fix Test', () => {
13
+ let executor;
14
+ let choicePrompt;
15
+ beforeEach(() => {
16
+ vi.clearAllMocks();
17
+ executor = new Executor();
18
+ choicePrompt = executor.choicePrompt;
19
+ mockRun.mockResolvedValue({ success: true, stdout: '', stderr: '', exitCode: 0 });
20
+ });
21
+ it('MUST PASS: parallel block with when condition should execute when condition is met', async () => {
22
+ const workflow = {
23
+ steps: [
24
+ {
25
+ run: 'echo "Starting Server"',
26
+ },
27
+ {
28
+ choose: {
29
+ message: 'Start Server with which environment?',
30
+ options: [
31
+ { id: 'dev', label: 'Development' },
32
+ { id: 'hard-task', label: 'hard-task' },
33
+ ],
34
+ as: 'mode',
35
+ },
36
+ },
37
+ {
38
+ when: {
39
+ var: {
40
+ mode: 'dev',
41
+ },
42
+ },
43
+ run: 'echo "dev mode"',
44
+ },
45
+ {
46
+ parallel: [
47
+ {
48
+ when: {
49
+ var: {
50
+ mode: 'hard-task',
51
+ },
52
+ },
53
+ run: 'echo "hard-task mode"',
54
+ timeout: 10,
55
+ retry: 2,
56
+ },
57
+ ],
58
+ },
59
+ ],
60
+ };
61
+ // Mock choose to return 'hard-task'
62
+ vi.spyOn(choicePrompt, 'prompt').mockResolvedValue({ id: 'hard-task', label: 'hard-task' });
63
+ await executor.execute(workflow);
64
+ const calls = mockRun.mock.calls.map((call) => call[0]);
65
+ // Should execute starting server
66
+ expect(calls).toContain('echo "Starting Server"');
67
+ // Should NOT execute dev mode (condition not met)
68
+ expect(calls).not.toContain('echo "dev mode"');
69
+ // SHOULD execute hard-task mode (condition met)
70
+ expect(calls).toContain('echo "hard-task mode"');
71
+ });
72
+ it('MUST PASS: parallel block with when condition should skip when condition is not met', async () => {
73
+ const workflow = {
74
+ steps: [
75
+ {
76
+ choose: {
77
+ message: 'Start Server with which environment?',
78
+ options: [
79
+ { id: 'dev', label: 'Development' },
80
+ { id: 'hard-task', label: 'hard-task' },
81
+ ],
82
+ as: 'mode',
83
+ },
84
+ },
85
+ {
86
+ parallel: [
87
+ {
88
+ when: {
89
+ var: {
90
+ mode: 'hard-task',
91
+ },
92
+ },
93
+ run: 'echo "hard-task mode"',
94
+ },
95
+ ],
96
+ },
97
+ ],
98
+ };
99
+ // Mock choose to return 'dev' (not 'hard-task')
100
+ vi.spyOn(choicePrompt, 'prompt').mockResolvedValue({ id: 'dev', label: 'Development' });
101
+ await executor.execute(workflow);
102
+ const calls = mockRun.mock.calls.map((call) => call[0]);
103
+ // Should NOT execute hard-task mode (condition not met)
104
+ expect(calls).not.toContain('echo "hard-task mode"');
105
+ });
106
+ it('MUST PASS: parallel block with multiple when conditions should only execute matching branches', async () => {
107
+ const workflow = {
108
+ steps: [
109
+ {
110
+ choose: {
111
+ message: 'Select mode',
112
+ options: [
113
+ { id: 'dev', label: 'dev' },
114
+ { id: 'hard-task', label: 'hard-task' },
115
+ ],
116
+ as: 'mode',
117
+ },
118
+ },
119
+ {
120
+ parallel: [
121
+ {
122
+ when: {
123
+ var: {
124
+ mode: 'hard-task',
125
+ },
126
+ },
127
+ run: 'echo "hard-task mode"',
128
+ timeout: 10,
129
+ retry: 2,
130
+ },
131
+ {
132
+ when: {
133
+ var: {
134
+ mode: 'dev',
135
+ },
136
+ },
137
+ run: 'echo "dev mode"',
138
+ timeout: 10,
139
+ retry: 2,
140
+ },
141
+ ],
142
+ },
143
+ ],
144
+ };
145
+ // Mock choose to return 'hard-task'
146
+ vi.spyOn(choicePrompt, 'prompt').mockResolvedValue({ id: 'hard-task', label: 'hard-task' });
147
+ await executor.execute(workflow);
148
+ const calls = mockRun.mock.calls.map((call) => call[0]);
149
+ // Should execute hard-task mode (condition met)
150
+ expect(calls).toContain('echo "hard-task mode"');
151
+ // Should NOT execute dev mode (condition not met)
152
+ expect(calls).not.toContain('echo "dev mode"');
153
+ });
154
+ });
155
+ //# sourceMappingURL=parallel-when-condition.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-when-condition.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/parallel-when-condition.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/parser.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,94 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { YAMLParser, JSONParser, getParser } from '../parser.js';
3
+ describe('Workflow Parser', () => {
4
+ describe('YAMLParser', () => {
5
+ it('should parse YAML workflow', () => {
6
+ const parser = new YAMLParser();
7
+ const yaml = `
8
+ name: test
9
+ steps:
10
+ - run: echo "hello"
11
+ - run: echo "world"
12
+ `;
13
+ const workflow = parser.parse(yaml);
14
+ expect(workflow.name).toBe('test');
15
+ expect(workflow.steps).toHaveLength(2);
16
+ expect(workflow.steps[0]).toHaveProperty('run', 'echo "hello"');
17
+ expect(workflow.steps[1]).toHaveProperty('run', 'echo "world"');
18
+ });
19
+ it('should extract step line numbers from YAML', () => {
20
+ const parser = new YAMLParser();
21
+ const yaml = `steps:
22
+ - run: echo "hello"
23
+ - run: echo "world"
24
+ `;
25
+ const lineNumbers = parser.extractStepLineNumbers(yaml);
26
+ expect(lineNumbers.get(0)).toBe(2); // First step is on line 2
27
+ expect(lineNumbers.get(1)).toBe(3); // Second step is on line 3
28
+ });
29
+ });
30
+ describe('JSONParser', () => {
31
+ it('should parse JSON workflow', () => {
32
+ const parser = new JSONParser();
33
+ const json = JSON.stringify({
34
+ name: 'test',
35
+ steps: [
36
+ { run: 'echo "hello"' },
37
+ { run: 'echo "world"' }
38
+ ]
39
+ });
40
+ const workflow = parser.parse(json);
41
+ expect(workflow.name).toBe('test');
42
+ expect(workflow.steps).toHaveLength(2);
43
+ expect(workflow.steps[0]).toHaveProperty('run', 'echo "hello"');
44
+ expect(workflow.steps[1]).toHaveProperty('run', 'echo "world"');
45
+ });
46
+ it('should throw error for invalid JSON', () => {
47
+ const parser = new JSONParser();
48
+ const invalidJson = '{ invalid json }';
49
+ expect(() => parser.parse(invalidJson)).toThrow('Invalid JSON format');
50
+ });
51
+ it('should extract step line numbers from JSON', () => {
52
+ const parser = new JSONParser();
53
+ const json = `{
54
+ "steps": [
55
+ {
56
+ "run": "echo hello"
57
+ },
58
+ {
59
+ "run": "echo world"
60
+ }
61
+ ]
62
+ }`;
63
+ const lineNumbers = parser.extractStepLineNumbers(json);
64
+ // JSON steps start at the line where the object starts
65
+ expect(lineNumbers.size).toBeGreaterThan(0);
66
+ expect(lineNumbers.get(0)).toBeDefined();
67
+ expect(lineNumbers.get(1)).toBeDefined();
68
+ });
69
+ });
70
+ describe('getParser', () => {
71
+ it('should return YAMLParser for .yaml extension', () => {
72
+ const parser = getParser('workflow.yaml');
73
+ expect(parser).toBeInstanceOf(YAMLParser);
74
+ });
75
+ it('should return YAMLParser for .yml extension', () => {
76
+ const parser = getParser('workflow.yml');
77
+ expect(parser).toBeInstanceOf(YAMLParser);
78
+ });
79
+ it('should return JSONParser for .json extension', () => {
80
+ const parser = getParser('workflow.json');
81
+ expect(parser).toBeInstanceOf(JSONParser);
82
+ });
83
+ it('should default to YAMLParser for unknown extension', () => {
84
+ const parser = getParser('workflow.txt');
85
+ expect(parser).toBeInstanceOf(YAMLParser);
86
+ });
87
+ it('should handle case-insensitive extensions', () => {
88
+ expect(getParser('workflow.YAML')).toBeInstanceOf(YAMLParser);
89
+ expect(getParser('workflow.YML')).toBeInstanceOf(YAMLParser);
90
+ expect(getParser('workflow.JSON')).toBeInstanceOf(JSONParser);
91
+ });
92
+ });
93
+ });
94
+ //# sourceMappingURL=parser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/parser.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=real-inquirer-test.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"real-inquirer-test.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/real-inquirer-test.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import inquirer from 'inquirer';
2
+ import { describe, expect, it, vi } from 'vitest';
3
+ import { ChoicePrompt } from '../../cli/prompts.js';
4
+ // Test using actual inquirer
5
+ describe('Real Inquirer Test', () => {
6
+ it('should return correct format from inquirer', async () => {
7
+ const choicePrompt = new ChoicePrompt();
8
+ // Mock inquirer directly
9
+ const mockInquirer = vi.spyOn(inquirer, 'prompt');
10
+ mockInquirer.mockResolvedValueOnce({ choice: 'staging' });
11
+ const result = await choicePrompt.prompt('Test message', [
12
+ { id: 'staging', label: 'Staging' },
13
+ { id: 'prod', label: 'Production' },
14
+ ]);
15
+ expect(result).toEqual({ id: 'staging', label: 'Staging' });
16
+ expect(result.id).toBe('staging');
17
+ mockInquirer.mockRestore();
18
+ });
19
+ });
20
+ //# sourceMappingURL=real-inquirer-test.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"real-inquirer-test.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/real-inquirer-test.test.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,6BAA6B;AAC7B,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QAExC,yBAAyB;QACzB,MAAM,YAAY,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAClD,YAAY,CAAC,qBAAqB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAE1D,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,CACtC,cAAc,EACd;YACE,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;YACnC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE;SACpC,CACF,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAElC,YAAY,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reproduce-bug.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reproduce-bug.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/reproduce-bug.test.ts"],"names":[],"mappings":""}