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,84 @@
|
|
|
1
|
+
import { readFileSync } from 'fs';
|
|
2
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
3
|
+
import { parse } from 'yaml';
|
|
4
|
+
import { Executor } from '../executor.js';
|
|
5
|
+
// Bug reproduction test: same environment as actual execution
|
|
6
|
+
describe('BUG REPRODUCTION: Choice condition not working', () => {
|
|
7
|
+
it('REPRODUCE: Execute basic.yaml and verify staging step runs', async () => {
|
|
8
|
+
const content = readFileSync('examples/yaml-examples/basic.yaml', 'utf-8');
|
|
9
|
+
const workflow = parse(content);
|
|
10
|
+
const executor = new Executor();
|
|
11
|
+
const executed = [];
|
|
12
|
+
// Use actual taskRunner
|
|
13
|
+
const taskRunner = executor.taskRunner;
|
|
14
|
+
const originalRun = taskRunner.run.bind(taskRunner);
|
|
15
|
+
taskRunner.run = vi.fn().mockImplementation(async (cmd) => {
|
|
16
|
+
executed.push(cmd);
|
|
17
|
+
console.log(`[EXEC] ${cmd}`);
|
|
18
|
+
return await originalRun(cmd);
|
|
19
|
+
});
|
|
20
|
+
// Use actual choicePrompt (mocked)
|
|
21
|
+
const choicePrompt = executor.choicePrompt;
|
|
22
|
+
choicePrompt.prompt = vi.fn().mockResolvedValue({ id: 'staging', label: 'Staging' });
|
|
23
|
+
// Mock TextPrompt (prevent timeout)
|
|
24
|
+
const textPrompt = executor.textPrompt;
|
|
25
|
+
textPrompt.prompt = vi.fn().mockResolvedValue('1.0.0');
|
|
26
|
+
process.env.CI = 'false';
|
|
27
|
+
try {
|
|
28
|
+
// Execute
|
|
29
|
+
await executor.execute(workflow);
|
|
30
|
+
// Verify
|
|
31
|
+
console.log('\n=== EXECUTION RESULT ===');
|
|
32
|
+
console.log('Executed:', executed);
|
|
33
|
+
console.log('Workspace choices:', Array.from(executor.workspace.state.choices.entries()));
|
|
34
|
+
// Required: staging step must execute
|
|
35
|
+
expect(executed).toContain('echo "Deploying to staging..."');
|
|
36
|
+
expect(executed).not.toContain('echo "Deploying to production..."');
|
|
37
|
+
// Verify workspace
|
|
38
|
+
const workspace = executor.workspace;
|
|
39
|
+
expect(workspace.hasChoice('staging')).toBe(true);
|
|
40
|
+
expect(workspace.getChoice('staging')).toBe('staging');
|
|
41
|
+
if (!executed.includes('echo "Deploying to staging..."')) {
|
|
42
|
+
throw new Error('BUG REPRODUCED: staging step did not execute!');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
delete process.env.CI;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
it('DEBUG: Trace exact execution flow', async () => {
|
|
50
|
+
const workflow = {
|
|
51
|
+
steps: [
|
|
52
|
+
{ choose: { message: 'Choose?', options: [{ id: 'staging', label: 'S' }] } },
|
|
53
|
+
{ choose: { message: 'Choose?', options: [{ id: 'staging', label: 'S' }], as: 'env' } },
|
|
54
|
+
{ when: { var: { env: 'staging' } }, run: 'echo "Staging"' },
|
|
55
|
+
],
|
|
56
|
+
};
|
|
57
|
+
const executor = new Executor();
|
|
58
|
+
const executed = [];
|
|
59
|
+
const taskRunner = executor.taskRunner;
|
|
60
|
+
taskRunner.run = vi.fn().mockImplementation((cmd) => {
|
|
61
|
+
executed.push(cmd);
|
|
62
|
+
return Promise.resolve(true);
|
|
63
|
+
});
|
|
64
|
+
const choicePrompt = executor.choicePrompt;
|
|
65
|
+
choicePrompt.prompt = vi.fn()
|
|
66
|
+
.mockResolvedValueOnce({ id: 'staging', label: 'S' })
|
|
67
|
+
.mockResolvedValueOnce({ id: 'staging', label: 'S' });
|
|
68
|
+
// Mock TextPrompt (prevent timeout)
|
|
69
|
+
const textPrompt = executor.textPrompt;
|
|
70
|
+
textPrompt.prompt = vi.fn().mockResolvedValue('1.0.0');
|
|
71
|
+
// Workspace state before execution
|
|
72
|
+
const workspaceBefore = executor.workspace;
|
|
73
|
+
console.log('Before execution - choices:', Array.from(workspaceBefore.state.choices.entries()));
|
|
74
|
+
await executor.execute(workflow);
|
|
75
|
+
// Workspace state after execution
|
|
76
|
+
const workspaceAfter = executor.workspace;
|
|
77
|
+
console.log('After execution - choices:', Array.from(workspaceAfter.state.choices.entries()));
|
|
78
|
+
console.log('Executed commands:', executed);
|
|
79
|
+
// Required verification
|
|
80
|
+
expect(workspaceAfter.hasChoice('staging')).toBe(true);
|
|
81
|
+
expect(executed).toContain('echo "Staging"');
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=reproduce-bug.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reproduce-bug.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/reproduce-bug.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout-retry.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/timeout-retry.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,184 @@
|
|
|
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.js', () => {
|
|
6
|
+
return {
|
|
7
|
+
TaskRunner: vi.fn().mockImplementation(() => {
|
|
8
|
+
return {
|
|
9
|
+
run: mockRun,
|
|
10
|
+
};
|
|
11
|
+
}),
|
|
12
|
+
};
|
|
13
|
+
});
|
|
14
|
+
describe('Timeout and Retry', () => {
|
|
15
|
+
let executor;
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
vi.clearAllMocks();
|
|
18
|
+
executor = new Executor();
|
|
19
|
+
});
|
|
20
|
+
describe('Timeout', () => {
|
|
21
|
+
it('should pass timeout to TaskRunner', async () => {
|
|
22
|
+
mockRun.mockResolvedValueOnce(true);
|
|
23
|
+
const workflow = {
|
|
24
|
+
steps: [
|
|
25
|
+
{
|
|
26
|
+
run: 'echo "test"',
|
|
27
|
+
timeout: 30, // 30 seconds
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
};
|
|
31
|
+
await executor.execute(workflow);
|
|
32
|
+
expect(mockRun).toHaveBeenCalledWith('echo "test"', expect.any(Number), 'echo "test"', undefined, false, false, undefined, undefined, undefined, 30 // timeout should be passed
|
|
33
|
+
);
|
|
34
|
+
});
|
|
35
|
+
it('should handle timeout when command exceeds limit', async () => {
|
|
36
|
+
// Simulate timeout by returning false
|
|
37
|
+
mockRun.mockResolvedValueOnce(false);
|
|
38
|
+
const workflow = {
|
|
39
|
+
steps: [
|
|
40
|
+
{
|
|
41
|
+
run: 'sleep 100',
|
|
42
|
+
timeout: 1, // 1 second timeout
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
};
|
|
46
|
+
// Executor throws error on failure, which is expected
|
|
47
|
+
await expect(executor.execute(workflow)).rejects.toThrow();
|
|
48
|
+
expect(mockRun).toHaveBeenCalledWith('sleep 100', expect.any(Number), 'sleep 100', undefined, false, false, undefined, undefined, undefined, 1);
|
|
49
|
+
});
|
|
50
|
+
it('should work without timeout (undefined)', async () => {
|
|
51
|
+
mockRun.mockResolvedValueOnce(true);
|
|
52
|
+
const workflow = {
|
|
53
|
+
steps: [
|
|
54
|
+
{
|
|
55
|
+
run: 'echo "test"',
|
|
56
|
+
// no timeout specified
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
};
|
|
60
|
+
await executor.execute(workflow);
|
|
61
|
+
expect(mockRun).toHaveBeenCalledWith('echo "test"', expect.any(Number), 'echo "test"', undefined, false, false, undefined, undefined, undefined, undefined // timeout should be undefined
|
|
62
|
+
);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe('Retry', () => {
|
|
66
|
+
it('should retry on failure', async () => {
|
|
67
|
+
// First attempt fails, second succeeds
|
|
68
|
+
mockRun.mockResolvedValueOnce(false);
|
|
69
|
+
mockRun.mockResolvedValueOnce(true);
|
|
70
|
+
const workflow = {
|
|
71
|
+
steps: [
|
|
72
|
+
{
|
|
73
|
+
run: 'echo "test"',
|
|
74
|
+
retry: 1, // Retry once
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
await executor.execute(workflow);
|
|
79
|
+
// Should be called twice (initial + 1 retry)
|
|
80
|
+
expect(mockRun).toHaveBeenCalledTimes(2);
|
|
81
|
+
});
|
|
82
|
+
it('should retry multiple times', async () => {
|
|
83
|
+
// First two attempts fail, third succeeds
|
|
84
|
+
mockRun.mockResolvedValueOnce(false);
|
|
85
|
+
mockRun.mockResolvedValueOnce(false);
|
|
86
|
+
mockRun.mockResolvedValueOnce(true);
|
|
87
|
+
const workflow = {
|
|
88
|
+
steps: [
|
|
89
|
+
{
|
|
90
|
+
run: 'echo "test"',
|
|
91
|
+
retry: 2, // Retry twice
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
};
|
|
95
|
+
await executor.execute(workflow);
|
|
96
|
+
// Should be called 3 times (initial + 2 retries)
|
|
97
|
+
expect(mockRun).toHaveBeenCalledTimes(3);
|
|
98
|
+
});
|
|
99
|
+
it('should stop retrying after success', async () => {
|
|
100
|
+
// First attempt succeeds
|
|
101
|
+
mockRun.mockResolvedValueOnce(true);
|
|
102
|
+
const workflow = {
|
|
103
|
+
steps: [
|
|
104
|
+
{
|
|
105
|
+
run: 'echo "test"',
|
|
106
|
+
retry: 5, // Even though retry is 5, should stop after success
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
};
|
|
110
|
+
await executor.execute(workflow);
|
|
111
|
+
// Should be called only once (success on first try)
|
|
112
|
+
expect(mockRun).toHaveBeenCalledTimes(1);
|
|
113
|
+
});
|
|
114
|
+
it('should stop after max retries even if still failing', async () => {
|
|
115
|
+
// All attempts fail
|
|
116
|
+
mockRun.mockResolvedValue(false);
|
|
117
|
+
const workflow = {
|
|
118
|
+
steps: [
|
|
119
|
+
{
|
|
120
|
+
run: 'echo "test"',
|
|
121
|
+
retry: 2, // Retry twice
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
};
|
|
125
|
+
// Executor throws error on failure after all retries, which is expected
|
|
126
|
+
await expect(executor.execute(workflow)).rejects.toThrow();
|
|
127
|
+
// Should be called 3 times (initial + 2 retries), then stop
|
|
128
|
+
expect(mockRun).toHaveBeenCalledTimes(3);
|
|
129
|
+
});
|
|
130
|
+
it('should not retry if retry is 0', async () => {
|
|
131
|
+
mockRun.mockResolvedValueOnce(false);
|
|
132
|
+
const workflow = {
|
|
133
|
+
steps: [
|
|
134
|
+
{
|
|
135
|
+
run: 'echo "test"',
|
|
136
|
+
retry: 0, // No retry
|
|
137
|
+
},
|
|
138
|
+
],
|
|
139
|
+
};
|
|
140
|
+
// Executor throws error on failure, which is expected
|
|
141
|
+
await expect(executor.execute(workflow)).rejects.toThrow();
|
|
142
|
+
// Should be called only once
|
|
143
|
+
expect(mockRun).toHaveBeenCalledTimes(1);
|
|
144
|
+
});
|
|
145
|
+
it('should not retry if retry is not specified', async () => {
|
|
146
|
+
mockRun.mockResolvedValueOnce(false);
|
|
147
|
+
const workflow = {
|
|
148
|
+
steps: [
|
|
149
|
+
{
|
|
150
|
+
run: 'echo "test"',
|
|
151
|
+
// retry not specified
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
};
|
|
155
|
+
// Executor throws error on failure, which is expected
|
|
156
|
+
await expect(executor.execute(workflow)).rejects.toThrow();
|
|
157
|
+
// Should be called only once (default: no retry)
|
|
158
|
+
expect(mockRun).toHaveBeenCalledTimes(1);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
describe('Timeout and Retry Combined', () => {
|
|
162
|
+
it('should support both timeout and retry', async () => {
|
|
163
|
+
mockRun.mockResolvedValueOnce(false);
|
|
164
|
+
mockRun.mockResolvedValueOnce(true);
|
|
165
|
+
const workflow = {
|
|
166
|
+
steps: [
|
|
167
|
+
{
|
|
168
|
+
run: 'echo "test"',
|
|
169
|
+
timeout: 30,
|
|
170
|
+
retry: 1,
|
|
171
|
+
},
|
|
172
|
+
],
|
|
173
|
+
};
|
|
174
|
+
await executor.execute(workflow);
|
|
175
|
+
// Both timeout and retry should be passed
|
|
176
|
+
expect(mockRun).toHaveBeenCalledTimes(2);
|
|
177
|
+
expect(mockRun).toHaveBeenNthCalledWith(1, 'echo "test"', expect.any(Number), 'echo "test"', undefined, false, false, undefined, undefined, undefined, 30 // timeout
|
|
178
|
+
);
|
|
179
|
+
expect(mockRun).toHaveBeenNthCalledWith(2, 'echo "test"', expect.any(Number), 'echo "test"', undefined, false, false, undefined, undefined, undefined, 30 // timeout (same for retry)
|
|
180
|
+
);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
//# sourceMappingURL=timeout-retry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout-retry.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/timeout-retry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-validation.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/workflow-validation.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { YAMLParser, JSONParser } from '../parser.js';
|
|
3
|
+
describe('Workflow Validation', () => {
|
|
4
|
+
describe('YAMLParser', () => {
|
|
5
|
+
it('should validate correct workflow', () => {
|
|
6
|
+
const parser = new YAMLParser();
|
|
7
|
+
const yaml = `
|
|
8
|
+
name: test
|
|
9
|
+
steps:
|
|
10
|
+
- run: echo "hello"
|
|
11
|
+
`;
|
|
12
|
+
const workflow = parser.parse(yaml);
|
|
13
|
+
expect(workflow.name).toBe('test');
|
|
14
|
+
expect(workflow.steps).toHaveLength(1);
|
|
15
|
+
});
|
|
16
|
+
it('should reject workflow with invalid step', () => {
|
|
17
|
+
const parser = new YAMLParser();
|
|
18
|
+
const yaml = `
|
|
19
|
+
name: test
|
|
20
|
+
steps:
|
|
21
|
+
- invalid_step: "this should fail"
|
|
22
|
+
`;
|
|
23
|
+
expect(() => parser.parse(yaml)).toThrow('Invalid workflow structure');
|
|
24
|
+
});
|
|
25
|
+
it('should reject workflow without steps', () => {
|
|
26
|
+
const parser = new YAMLParser();
|
|
27
|
+
const yaml = `
|
|
28
|
+
name: test
|
|
29
|
+
`;
|
|
30
|
+
expect(() => parser.parse(yaml)).toThrow('Invalid workflow structure');
|
|
31
|
+
});
|
|
32
|
+
it('should reject workflow with empty steps array', () => {
|
|
33
|
+
const parser = new YAMLParser();
|
|
34
|
+
const yaml = `
|
|
35
|
+
name: test
|
|
36
|
+
steps: []
|
|
37
|
+
`;
|
|
38
|
+
expect(() => parser.parse(yaml)).toThrow('Invalid workflow structure');
|
|
39
|
+
});
|
|
40
|
+
it('should validate workflow with all step types', () => {
|
|
41
|
+
const parser = new YAMLParser();
|
|
42
|
+
const yaml = `
|
|
43
|
+
name: test
|
|
44
|
+
steps:
|
|
45
|
+
- run: echo "hello"
|
|
46
|
+
- choose:
|
|
47
|
+
message: "Select"
|
|
48
|
+
options:
|
|
49
|
+
- id: opt1
|
|
50
|
+
label: "Option 1"
|
|
51
|
+
as: choice
|
|
52
|
+
- prompt:
|
|
53
|
+
message: "Enter name"
|
|
54
|
+
as: name
|
|
55
|
+
- parallel:
|
|
56
|
+
- run: echo "task1"
|
|
57
|
+
- run: echo "task2"
|
|
58
|
+
- fail:
|
|
59
|
+
message: "Error"
|
|
60
|
+
`;
|
|
61
|
+
const workflow = parser.parse(yaml);
|
|
62
|
+
expect(workflow.steps).toHaveLength(5);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe('JSONParser', () => {
|
|
66
|
+
it('should validate correct workflow', () => {
|
|
67
|
+
const parser = new JSONParser();
|
|
68
|
+
const json = JSON.stringify({
|
|
69
|
+
name: 'test',
|
|
70
|
+
steps: [
|
|
71
|
+
{ run: 'echo "hello"' }
|
|
72
|
+
]
|
|
73
|
+
});
|
|
74
|
+
const workflow = parser.parse(json);
|
|
75
|
+
expect(workflow.name).toBe('test');
|
|
76
|
+
expect(workflow.steps).toHaveLength(1);
|
|
77
|
+
});
|
|
78
|
+
it('should reject workflow with invalid step', () => {
|
|
79
|
+
const parser = new JSONParser();
|
|
80
|
+
const json = JSON.stringify({
|
|
81
|
+
name: 'test',
|
|
82
|
+
steps: [
|
|
83
|
+
{ invalid_step: 'this should fail' }
|
|
84
|
+
]
|
|
85
|
+
});
|
|
86
|
+
expect(() => parser.parse(json)).toThrow('Invalid workflow structure');
|
|
87
|
+
});
|
|
88
|
+
it('should reject workflow without steps', () => {
|
|
89
|
+
const parser = new JSONParser();
|
|
90
|
+
const json = JSON.stringify({
|
|
91
|
+
name: 'test'
|
|
92
|
+
});
|
|
93
|
+
expect(() => parser.parse(json)).toThrow('Invalid workflow structure');
|
|
94
|
+
});
|
|
95
|
+
it('should reject invalid JSON format', () => {
|
|
96
|
+
const parser = new JSONParser();
|
|
97
|
+
const json = '{ invalid json }';
|
|
98
|
+
expect(() => parser.parse(json)).toThrow('Invalid JSON format');
|
|
99
|
+
});
|
|
100
|
+
it('should validate workflow with conditions', () => {
|
|
101
|
+
const parser = new JSONParser();
|
|
102
|
+
const json = JSON.stringify({
|
|
103
|
+
steps: [
|
|
104
|
+
{
|
|
105
|
+
run: 'echo "hello"',
|
|
106
|
+
when: {
|
|
107
|
+
var: {
|
|
108
|
+
env: 'dev'
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
]
|
|
113
|
+
});
|
|
114
|
+
const workflow = parser.parse(json);
|
|
115
|
+
expect(workflow.steps).toHaveLength(1);
|
|
116
|
+
expect(workflow.steps[0]).toHaveProperty('when');
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
//# sourceMappingURL=workflow-validation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-validation.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/workflow-validation.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/workspace.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { Workspace } from '../workspace.js';
|
|
3
|
+
describe('Workspace', () => {
|
|
4
|
+
it('should set and get facts', () => {
|
|
5
|
+
const workspace = new Workspace();
|
|
6
|
+
workspace.setFact('test', true);
|
|
7
|
+
expect(workspace.hasFact('test')).toBe(true);
|
|
8
|
+
expect(workspace.getFact('test')).toBe(true);
|
|
9
|
+
});
|
|
10
|
+
it('should set and get choices', () => {
|
|
11
|
+
const workspace = new Workspace();
|
|
12
|
+
workspace.setChoice('staging', 'staging');
|
|
13
|
+
expect(workspace.hasChoice('staging')).toBe(true);
|
|
14
|
+
expect(workspace.getChoice('staging')).toBe('staging');
|
|
15
|
+
});
|
|
16
|
+
it('should return false for non-existent choice', () => {
|
|
17
|
+
const workspace = new Workspace();
|
|
18
|
+
expect(workspace.hasChoice('nonexistent')).toBe(false);
|
|
19
|
+
});
|
|
20
|
+
it('should clone workspace state', () => {
|
|
21
|
+
const workspace = new Workspace();
|
|
22
|
+
workspace.setFact('test', true);
|
|
23
|
+
workspace.setChoice('staging', 'staging');
|
|
24
|
+
const cloned = workspace.clone();
|
|
25
|
+
expect(cloned.hasFact('test')).toBe(true);
|
|
26
|
+
expect(cloned.hasChoice('staging')).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=workspace.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/workspace.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;QAClC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;QAClC,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC1C,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;QAClC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;QAClC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAChC,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAE1C,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-integration.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/yaml-integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { readFileSync } from 'fs';
|
|
2
|
+
import { resolve, dirname } from 'path';
|
|
3
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
4
|
+
import { parse } from 'yaml';
|
|
5
|
+
import { Executor } from '../executor.js';
|
|
6
|
+
// Mock TaskRunner
|
|
7
|
+
const mockRun = vi.fn().mockResolvedValue(true);
|
|
8
|
+
vi.mock('../task-runner.js', () => {
|
|
9
|
+
return {
|
|
10
|
+
TaskRunner: vi.fn().mockImplementation(() => {
|
|
11
|
+
return {
|
|
12
|
+
run: mockRun,
|
|
13
|
+
};
|
|
14
|
+
}),
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
// Mock ChoicePrompt, TextPrompt
|
|
18
|
+
const mockChoicePrompt = vi.fn();
|
|
19
|
+
const mockTextPrompt = vi.fn();
|
|
20
|
+
vi.mock('../../cli/prompts.js', () => {
|
|
21
|
+
return {
|
|
22
|
+
ChoicePrompt: vi.fn().mockImplementation(() => {
|
|
23
|
+
return {
|
|
24
|
+
prompt: mockChoicePrompt,
|
|
25
|
+
};
|
|
26
|
+
}),
|
|
27
|
+
TextPrompt: vi.fn().mockImplementation(() => {
|
|
28
|
+
return {
|
|
29
|
+
prompt: mockTextPrompt,
|
|
30
|
+
};
|
|
31
|
+
}),
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
describe('YAML Integration Tests', () => {
|
|
35
|
+
let executor;
|
|
36
|
+
beforeEach(() => {
|
|
37
|
+
vi.clearAllMocks();
|
|
38
|
+
executor = new Executor();
|
|
39
|
+
});
|
|
40
|
+
it('should execute basic.yaml workflow correctly - staging choice', async () => {
|
|
41
|
+
const yamlContent = readFileSync('examples/yaml-examples/basic.yaml', 'utf-8');
|
|
42
|
+
const workflow = parse(yamlContent);
|
|
43
|
+
// Mock staging selection
|
|
44
|
+
mockChoicePrompt.mockResolvedValueOnce({ id: 'staging', label: 'Staging' });
|
|
45
|
+
await executor.execute(workflow);
|
|
46
|
+
// All steps should be executed
|
|
47
|
+
const calls = mockRun.mock.calls.map(call => call[0]);
|
|
48
|
+
expect(calls).toContain('echo "Building..."');
|
|
49
|
+
// Staging step should execute after staging is selected
|
|
50
|
+
expect(calls).toContain('echo "Deploying to staging..."');
|
|
51
|
+
// Prod step should not be executed
|
|
52
|
+
expect(calls).not.toContain('echo "Deploying to production..."');
|
|
53
|
+
});
|
|
54
|
+
it('should execute basic.yaml workflow correctly - prod choice', async () => {
|
|
55
|
+
const yamlContent = readFileSync('examples/yaml-examples/basic.yaml', 'utf-8');
|
|
56
|
+
const workflow = parse(yamlContent);
|
|
57
|
+
// Mock prod selection
|
|
58
|
+
mockChoicePrompt.mockResolvedValueOnce({ id: 'prod', label: 'Production' });
|
|
59
|
+
await executor.execute(workflow);
|
|
60
|
+
// Prod step should execute after prod is selected
|
|
61
|
+
const calls = mockRun.mock.calls.map(call => call[0]);
|
|
62
|
+
expect(calls).toContain('echo "Deploying to production..."');
|
|
63
|
+
// Staging step should not be executed
|
|
64
|
+
expect(calls).not.toContain('echo "Deploying to staging..."');
|
|
65
|
+
});
|
|
66
|
+
it('should execute parallel.yaml workflow correctly', async () => {
|
|
67
|
+
const yamlContent = readFileSync('examples/yaml-examples/parallel.yaml', 'utf-8');
|
|
68
|
+
const workflow = parse(yamlContent);
|
|
69
|
+
mockChoicePrompt.mockResolvedValueOnce({ id: 'blue_green', label: 'Blue-Green' });
|
|
70
|
+
await executor.execute(workflow);
|
|
71
|
+
// All parallel steps should be executed
|
|
72
|
+
const calls = mockRun.mock.calls.map(call => call[0]);
|
|
73
|
+
expect(calls).toContain('echo "Running web tests..."');
|
|
74
|
+
expect(calls).toContain('echo "Running API tests..."');
|
|
75
|
+
// Step execution based on selection
|
|
76
|
+
expect(calls).toContain('echo "Deploying with blue-green strategy..."');
|
|
77
|
+
});
|
|
78
|
+
it('should verify workspace state after each step', async () => {
|
|
79
|
+
const yamlContent = readFileSync('examples/yaml-examples/basic.yaml', 'utf-8');
|
|
80
|
+
const workflow = parse(yamlContent);
|
|
81
|
+
mockChoicePrompt.mockResolvedValueOnce({ id: 'staging', label: 'Staging' });
|
|
82
|
+
await executor.execute(workflow);
|
|
83
|
+
// Check workspace state
|
|
84
|
+
const workspace = executor.workspace;
|
|
85
|
+
// Staging choice should be set
|
|
86
|
+
expect(workspace.hasChoice('staging')).toBe(true);
|
|
87
|
+
expect(workspace.getChoice('staging')).toBe('staging');
|
|
88
|
+
// Prod choice should not be set
|
|
89
|
+
expect(workspace.hasChoice('prod')).toBe(false);
|
|
90
|
+
});
|
|
91
|
+
it('should execute base-dir-example.yaml with baseDir correctly', async () => {
|
|
92
|
+
const yamlContent = readFileSync('examples/yaml-examples/base-dir-example.yaml', 'utf-8');
|
|
93
|
+
const workflow = parse(yamlContent);
|
|
94
|
+
// Set file path for baseDir resolution
|
|
95
|
+
workflow._filePath = resolve(process.cwd(), 'examples/yaml-examples/base-dir-example.yaml');
|
|
96
|
+
await executor.execute(workflow);
|
|
97
|
+
// Verify commands were executed
|
|
98
|
+
expect(mockRun).toHaveBeenCalledTimes(2);
|
|
99
|
+
// Verify baseDir was resolved correctly
|
|
100
|
+
// baseDir is relative to YAML file directory (examples/), so ./examples resolves to examples/examples
|
|
101
|
+
if (!workflow._filePath) {
|
|
102
|
+
throw new Error('_filePath should be set');
|
|
103
|
+
}
|
|
104
|
+
const yamlDir = dirname(workflow._filePath);
|
|
105
|
+
const expectedBaseDir = resolve(yamlDir, 'examples');
|
|
106
|
+
const actualBaseDir = executor.baseDir;
|
|
107
|
+
expect(actualBaseDir).toBe(expectedBaseDir);
|
|
108
|
+
// Verify all commands used the correct cwd
|
|
109
|
+
mockRun.mock.calls.forEach(call => {
|
|
110
|
+
expect(call[8]).toBe(expectedBaseDir); // cwd is 9th parameter (index 8)
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
//# sourceMappingURL=yaml-integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-integration.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/yaml-integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-scenarios.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/yaml-scenarios.test.ts"],"names":[],"mappings":""}
|