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,111 @@
1
+ import { readFileSync } from 'fs';
2
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
3
+ import { parse } from 'yaml';
4
+ import { ConditionEvaluator } from '../condition-evaluator.js';
5
+ import { Executor } from '../executor.js';
6
+ import { Workspace } from '../workspace.js';
7
+ // Perfectly reproduce actual execution
8
+ describe('COMPREHENSIVE: Basic YAML - Must Work', () => {
9
+ let executor;
10
+ let executedCommands;
11
+ let _workspaceState;
12
+ beforeEach(() => {
13
+ vi.clearAllMocks();
14
+ executor = new Executor();
15
+ executedCommands = [];
16
+ _workspaceState = [];
17
+ // Mock TaskRunner
18
+ const taskRunner = executor.taskRunner;
19
+ taskRunner.run = vi.fn().mockImplementation((cmd) => {
20
+ executedCommands.push(cmd);
21
+ console.log(`[EXEC] ${cmd}`);
22
+ return Promise.resolve(true);
23
+ });
24
+ // Mock TextPrompt (prevent timeout)
25
+ const textPrompt = executor.textPrompt;
26
+ textPrompt.prompt = vi.fn().mockResolvedValue('1.0.0');
27
+ });
28
+ afterEach(() => {
29
+ const workspace = executor.workspace;
30
+ console.log('Final workspace state:');
31
+ console.log(' Choices:', Array.from(workspace.state.choices.entries()));
32
+ console.log(' Facts:', Array.from(workspace.state.facts.entries()));
33
+ });
34
+ it('MUST WORK: Complete basic.yaml execution with staging', async () => {
35
+ const content = readFileSync('examples/yaml-examples/basic.yaml', 'utf-8');
36
+ const workflow = parse(content);
37
+ // Mock ChoicePrompt
38
+ const choicePrompt = executor.choicePrompt;
39
+ choicePrompt.prompt = vi.fn().mockResolvedValue({ id: 'staging', label: 'Staging' });
40
+ process.env.CI = 'false';
41
+ try {
42
+ await executor.execute(workflow);
43
+ // Required verification
44
+ expect(executedCommands).toContain('echo "Deploying to staging..."');
45
+ expect(executedCommands).not.toContain('echo "Deploying to production..."');
46
+ const workspace = executor.workspace;
47
+ expect(workspace.hasChoice('staging')).toBe(true);
48
+ // Verify execution order
49
+ const stagingIndex = executedCommands.indexOf('echo "Deploying to staging..."');
50
+ expect(stagingIndex).toBeGreaterThan(-1);
51
+ expect(stagingIndex).toBeGreaterThan(executedCommands.indexOf('echo "Building..."'));
52
+ console.log('\n✅ TEST PASSED - All commands executed correctly');
53
+ }
54
+ finally {
55
+ delete process.env.CI;
56
+ }
57
+ });
58
+ it('MUST WORK: Step-by-step manual execution', async () => {
59
+ const workflow = {
60
+ steps: [
61
+ { run: 'step1' },
62
+ { choose: { message: 'Choose?', options: [{ id: 's', label: 'S' }], as: 'choice' } },
63
+ { when: { var: { choice: 's' } }, run: 'step3' },
64
+ ],
65
+ };
66
+ // Use executor's actual workspace
67
+ const workspace = executor.workspace;
68
+ const choicePrompt = executor.choicePrompt;
69
+ // Mock choicePrompt
70
+ choicePrompt.prompt = vi.fn().mockResolvedValue({ id: 's', label: 'S' });
71
+ // Step 0
72
+ await executor.executeRunStep(workflow.steps[0], { workspace, stepIndex: 0 });
73
+ // f1 fact is not set if there's no sets/declares
74
+ // Step 1 - executeChooseStep uses this.workspace
75
+ await executor.executeChooseStep(workflow.steps[1], { workspace, stepIndex: 1 });
76
+ // Check if choicePrompt was called
77
+ expect(choicePrompt.prompt).toHaveBeenCalled();
78
+ // Check in executor's workspace
79
+ const execWorkspace = executor.workspace;
80
+ console.log('Workspace choices after choose:', Array.from(execWorkspace.state.choices.entries()));
81
+ expect(execWorkspace.hasChoice('s')).toBe(true);
82
+ expect(execWorkspace.getVariable('choice')).toBe('s');
83
+ // Step 2 - Condition evaluation (using executor's workspace)
84
+ const step2 = workflow.steps[2];
85
+ if (!step2.when) {
86
+ throw new Error('Step 2 should have a when condition');
87
+ }
88
+ const evaluator = new ConditionEvaluator(executor.workspace);
89
+ const result = evaluator.evaluate(step2.when);
90
+ expect(result).toBe(true);
91
+ // Step 2 - Execute
92
+ if (result) {
93
+ await executor.executeRunStep(step2, { workspace: executor.workspace, stepIndex: 2 });
94
+ }
95
+ expect(executedCommands).toContain('step3');
96
+ });
97
+ it('MUST WORK: Verify condition evaluation timing', async () => {
98
+ const workspace = new Workspace();
99
+ workspace.setVariable('env', 'staging');
100
+ const evaluator = new ConditionEvaluator(workspace);
101
+ const condition = {
102
+ var: {
103
+ env: 'staging'
104
+ }
105
+ };
106
+ const result = evaluator.evaluate(condition);
107
+ expect(result).toBe(true);
108
+ expect(workspace.getVariable('env')).toBe('staging');
109
+ });
110
+ });
111
+ //# sourceMappingURL=comprehensive-basic-yaml.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comprehensive-basic-yaml.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/comprehensive-basic-yaml.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=condition-evaluator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"condition-evaluator.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/condition-evaluator.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,170 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { ConditionEvaluator } from '../condition-evaluator.js';
3
+ import { Workspace } from '../workspace.js';
4
+ describe('ConditionEvaluator', () => {
5
+ describe('variable value comparison', () => {
6
+ it('should evaluate variable value comparison correctly', () => {
7
+ const workspace = new Workspace();
8
+ workspace.setVariable('env', 'staging');
9
+ const evaluator = new ConditionEvaluator(workspace);
10
+ const condition = {
11
+ var: {
12
+ env: 'staging'
13
+ }
14
+ };
15
+ expect(evaluator.evaluate(condition)).toBe(true);
16
+ });
17
+ it('should return false when variable value does not match', () => {
18
+ const workspace = new Workspace();
19
+ workspace.setVariable('env', 'staging');
20
+ const evaluator = new ConditionEvaluator(workspace);
21
+ const condition = {
22
+ var: {
23
+ env: 'prod'
24
+ }
25
+ };
26
+ expect(evaluator.evaluate(condition)).toBe(false);
27
+ });
28
+ it('should return false when variable does not exist', () => {
29
+ const workspace = new Workspace();
30
+ const evaluator = new ConditionEvaluator(workspace);
31
+ const condition = {
32
+ var: {
33
+ env: 'staging'
34
+ }
35
+ };
36
+ expect(evaluator.evaluate(condition)).toBe(false);
37
+ });
38
+ it('MUST PASS: should return false when variable is undefined (bug fix test)', () => {
39
+ const workspace = new Workspace();
40
+ // Variable is not set at all
41
+ const evaluator = new ConditionEvaluator(workspace);
42
+ const condition = {
43
+ var: {
44
+ optionType: 'dev'
45
+ }
46
+ };
47
+ // Should return false, not throw error or return true
48
+ expect(evaluator.evaluate(condition)).toBe(false);
49
+ });
50
+ it('MUST PASS: should correctly compare variable values with different types', () => {
51
+ const workspace = new Workspace();
52
+ workspace.setVariable('optionType', 'dev');
53
+ const evaluator = new ConditionEvaluator(workspace);
54
+ // Match
55
+ expect(evaluator.evaluate({ var: { optionType: 'dev' } })).toBe(true);
56
+ // No match
57
+ expect(evaluator.evaluate({ var: { optionType: 'build' } })).toBe(false);
58
+ expect(evaluator.evaluate({ var: { optionType: 'echo' } })).toBe(false);
59
+ });
60
+ it('MUST PASS: should handle multiple variable comparisons correctly', () => {
61
+ const workspace = new Workspace();
62
+ workspace.setVariable('env', 'staging');
63
+ workspace.setVariable('version', '2.0.0');
64
+ const evaluator = new ConditionEvaluator(workspace);
65
+ // All match
66
+ expect(evaluator.evaluate({
67
+ var: {
68
+ env: 'staging',
69
+ version: '2.0.0'
70
+ }
71
+ })).toBe(true);
72
+ // One doesn't match
73
+ expect(evaluator.evaluate({
74
+ var: {
75
+ env: 'staging',
76
+ version: '1.0.0'
77
+ }
78
+ })).toBe(false);
79
+ // One variable doesn't exist
80
+ expect(evaluator.evaluate({
81
+ var: {
82
+ env: 'staging',
83
+ nonexistent: 'value'
84
+ }
85
+ })).toBe(false);
86
+ });
87
+ it('should evaluate variable value in all condition', () => {
88
+ const workspace = new Workspace();
89
+ workspace.setVariable('env', 'staging');
90
+ const evaluator = new ConditionEvaluator(workspace);
91
+ const condition = {
92
+ all: [
93
+ {
94
+ var: {
95
+ env: 'staging'
96
+ }
97
+ },
98
+ { file: 'package.json' },
99
+ ],
100
+ };
101
+ expect(evaluator.evaluate(condition)).toBe(true);
102
+ });
103
+ it('should evaluate variable value in any condition', () => {
104
+ const workspace = new Workspace();
105
+ workspace.setVariable('env', 'staging');
106
+ const evaluator = new ConditionEvaluator(workspace);
107
+ const condition = {
108
+ any: [
109
+ {
110
+ var: {
111
+ env: 'staging'
112
+ }
113
+ },
114
+ {
115
+ var: {
116
+ env: 'prod'
117
+ }
118
+ },
119
+ ],
120
+ };
121
+ expect(evaluator.evaluate(condition)).toBe(true);
122
+ });
123
+ });
124
+ describe('file condition', () => {
125
+ it('should evaluate file exists condition', () => {
126
+ const workspace = new Workspace();
127
+ const evaluator = new ConditionEvaluator(workspace);
128
+ // Check actual file (package.json must exist)
129
+ const condition = { file: 'package.json' };
130
+ expect(evaluator.evaluate(condition)).toBe(true);
131
+ });
132
+ it('should return false when file does not exist', () => {
133
+ const workspace = new Workspace();
134
+ const evaluator = new ConditionEvaluator(workspace);
135
+ const condition = { file: 'nonexistent-file-12345.txt' };
136
+ expect(evaluator.evaluate(condition)).toBe(false);
137
+ });
138
+ it('should work with file in all condition', () => {
139
+ const workspace = new Workspace();
140
+ const evaluator = new ConditionEvaluator(workspace);
141
+ const condition = {
142
+ all: [
143
+ { file: 'package.json' },
144
+ { file: 'tsconfig.json' },
145
+ ],
146
+ };
147
+ expect(evaluator.evaluate(condition)).toBe(true);
148
+ });
149
+ it('should work with file in any condition', () => {
150
+ const workspace = new Workspace();
151
+ const evaluator = new ConditionEvaluator(workspace);
152
+ const condition = {
153
+ any: [
154
+ { file: 'package.json' },
155
+ { file: 'nonexistent-file.txt' },
156
+ ],
157
+ };
158
+ expect(evaluator.evaluate(condition)).toBe(true);
159
+ });
160
+ it('should work with not file condition', () => {
161
+ const workspace = new Workspace();
162
+ const evaluator = new ConditionEvaluator(workspace);
163
+ const condition = {
164
+ not: { file: 'nonexistent-file-12345.txt' },
165
+ };
166
+ expect(evaluator.evaluate(condition)).toBe(true);
167
+ });
168
+ });
169
+ });
170
+ //# sourceMappingURL=condition-evaluator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"condition-evaluator.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/condition-evaluator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=debug-basic-yaml.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-basic-yaml.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/debug-basic-yaml.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,128 @@
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
+ // Mock TaskRunner - actually execute echo commands
6
+ const mockRun = vi.fn().mockImplementation((command) => {
7
+ console.log(`[EXECUTED] ${command}`);
8
+ return Promise.resolve(true);
9
+ });
10
+ vi.mock('../task-runner.js', () => {
11
+ return {
12
+ TaskRunner: vi.fn().mockImplementation(() => {
13
+ return {
14
+ run: mockRun,
15
+ };
16
+ }),
17
+ };
18
+ });
19
+ // Mock ChoicePrompt - behave like actual inquirer
20
+ const mockChoicePrompt = vi.fn();
21
+ vi.mock('../../cli/prompts.js', () => {
22
+ return {
23
+ ChoicePrompt: vi.fn().mockImplementation(() => {
24
+ return {
25
+ prompt: mockChoicePrompt,
26
+ };
27
+ }),
28
+ TextPrompt: vi.fn().mockImplementation(() => {
29
+ return {
30
+ prompt: vi.fn(),
31
+ };
32
+ }),
33
+ };
34
+ });
35
+ describe('DEBUG: Basic YAML Execution - Find the Bug', () => {
36
+ let executor;
37
+ beforeEach(() => {
38
+ vi.clearAllMocks();
39
+ executor = new Executor();
40
+ });
41
+ it('MUST PASS: Execute basic.yaml with staging choice and verify ALL steps run', async () => {
42
+ // Load actual YAML file
43
+ const content = readFileSync('examples/yaml-examples/basic.yaml', 'utf-8');
44
+ const workflow = parse(content);
45
+ console.log('\n=== Starting Workflow Execution ===');
46
+ console.log(`Total steps: ${workflow.steps.length}`);
47
+ // Mock staging selection
48
+ mockChoicePrompt.mockResolvedValueOnce({ id: 'staging', label: 'Staging' });
49
+ // Set CI environment variable
50
+ const originalCI = process.env.CI;
51
+ process.env.CI = 'false';
52
+ try {
53
+ await executor.execute(workflow);
54
+ console.log('\n=== Execution Complete ===');
55
+ console.log(`Total commands executed: ${mockRun.mock.calls.length}`);
56
+ mockRun.mock.calls.forEach((call, i) => {
57
+ console.log(` ${i + 1}. ${call[0]}`);
58
+ });
59
+ // Check workspace state
60
+ const workspace = executor.workspace;
61
+ console.log('\n=== Workspace State ===');
62
+ console.log(`build_started fact: ${workspace.hasFact('build_started')}`);
63
+ console.log(`staging choice: ${workspace.hasChoice('staging')}`);
64
+ console.log(`prod choice: ${workspace.hasChoice('prod')}`);
65
+ // Required verification: staging step must execute
66
+ const executedCommands = mockRun.mock.calls.map(call => call[0]);
67
+ expect(executedCommands).toContain('echo "Building..."');
68
+ // This is the key: staging step should execute
69
+ expect(executedCommands).toContain('echo "Deploying to staging..."');
70
+ // prod step should not execute
71
+ expect(executedCommands).not.toContain('echo "Deploying to production..."');
72
+ // Verify workspace state
73
+ expect(workspace.hasChoice('staging')).toBe(true);
74
+ expect(workspace.getChoice('staging')).toBe('staging');
75
+ console.log('\n✅ ALL ASSERTIONS PASSED');
76
+ }
77
+ catch (error) {
78
+ console.error('\n❌ TEST FAILED:', error);
79
+ throw error;
80
+ }
81
+ finally {
82
+ if (originalCI !== undefined) {
83
+ process.env.CI = originalCI;
84
+ }
85
+ else {
86
+ delete process.env.CI;
87
+ }
88
+ }
89
+ });
90
+ it('DEBUG: Step by step execution trace', async () => {
91
+ const workflow = {
92
+ steps: [
93
+ {
94
+ run: 'echo "Step 1"',
95
+ },
96
+ {
97
+ choose: {
98
+ message: 'Choose?',
99
+ options: [
100
+ { id: 'staging', label: 'Staging' },
101
+ ],
102
+ as: 'env',
103
+ },
104
+ },
105
+ {
106
+ when: {
107
+ var: {
108
+ env: 'staging'
109
+ }
110
+ },
111
+ run: 'echo "Step 3 - Staging"',
112
+ },
113
+ ],
114
+ };
115
+ mockChoicePrompt.mockResolvedValueOnce({ id: 'staging', label: 'Staging' });
116
+ // Log workspace state before and after each step
117
+ const workspace = executor.workspace;
118
+ await executor.execute(workflow);
119
+ // Workspace state after Step 2 (choose)
120
+ console.log('After choose step:');
121
+ console.log(' hasChoice(staging):', workspace.hasChoice('staging'));
122
+ console.log(' getChoice(staging):', workspace.getChoice('staging'));
123
+ // Check if Step 3 executed
124
+ const calls = mockRun.mock.calls.map(call => call[0]);
125
+ expect(calls).toContain('echo "Step 3 - Staging"');
126
+ });
127
+ });
128
+ //# sourceMappingURL=debug-basic-yaml.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-basic-yaml.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/debug-basic-yaml.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=example-files.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example-files.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/example-files.test.ts"],"names":[],"mappings":""}