claude-flow-novice 2.15.6 → 2.15.8

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 (122) hide show
  1. package/.claude/cfn-extras/agents/google-sheets/google-sheets-coordinator.md +1 -1
  2. package/.claude/cfn-extras/docs/GOOGLE_SHEETS_CFN_LOOP.md +13 -11
  3. package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +39 -577
  4. package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +49 -270
  5. package/.claude/skills/cfn-loop-orchestration/src/helpers/consensus.ts +87 -0
  6. package/.claude/skills/cfn-loop-orchestration/src/helpers/deliverable-verifier.ts +103 -0
  7. package/.claude/skills/cfn-loop-orchestration/src/helpers/gate-check.ts +115 -0
  8. package/.claude/skills/cfn-loop-orchestration/src/helpers/iteration-manager.ts +45 -0
  9. package/.claude/skills/cfn-loop-orchestration/src/helpers/parse-test-results.ts +372 -0
  10. package/.claude/skills/cfn-loop-orchestration/src/helpers/timeout-calculator.ts +41 -0
  11. package/.claude/skills/cfn-loop-orchestration/tests/consensus.test.ts +142 -0
  12. package/.claude/skills/cfn-loop-orchestration/tests/deliverable-verifier.test.ts +197 -0
  13. package/.claude/skills/cfn-loop-orchestration/tests/gate-check.test.ts +325 -0
  14. package/.claude/skills/cfn-loop-orchestration/tests/iteration-manager.test.ts +132 -0
  15. package/.claude/skills/cfn-loop-orchestration/tests/parse-test-results.test.ts +382 -0
  16. package/.claude/skills/cfn-loop-orchestration/tests/timeout-calculator.test.ts +118 -0
  17. package/.claude/skills/cfn-redis-coordination/coverage/clover.xml +1447 -0
  18. package/.claude/skills/cfn-redis-coordination/coverage/coverage-final.json +13 -0
  19. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/agent-logger.ts.html +1423 -0
  20. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/agent-recovery.ts.html +1447 -0
  21. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/base.css +224 -0
  22. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/block-navigation.js +87 -0
  23. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/completion-reporter.ts.html +1273 -0
  24. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/context-manager.ts.html +1066 -0
  25. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/favicon.png +0 -0
  26. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/index.html +281 -0
  27. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/mode-detector.ts.html +550 -0
  28. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/prettify.css +1 -0
  29. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/prettify.js +2 -0
  30. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/redis-client.ts.html +2047 -0
  31. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/result-collector.ts.html +1396 -0
  32. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  33. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/sorter.js +210 -0
  34. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/swarm-manager.ts.html +1567 -0
  35. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/task-analyzer.ts.html +1297 -0
  36. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/task-executor.ts.html +1354 -0
  37. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/types.ts.html +790 -0
  38. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/waiting-coordinator.ts.html +1846 -0
  39. package/.claude/skills/cfn-redis-coordination/coverage/lcov.info +2650 -0
  40. package/.claude/skills/cfn-redis-coordination/dist/task-analyzer.js +1 -1
  41. package/.claude/skills/cfn-redis-coordination/src/task-analyzer.ts +1 -1
  42. package/.claude/skills/cfn-redis-coordination/tests/coordination.test.ts +18 -9
  43. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +13 -72
  44. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +5 -65
  45. package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +465 -508
  46. package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +733 -743
  47. package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +13 -79
  48. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +13 -18
  49. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +13 -18
  50. package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +13 -18
  51. package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +15 -17
  52. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +15 -17
  53. package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +15 -14
  54. package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +15 -17
  55. package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +15 -17
  56. package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +15 -17
  57. package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +23 -30
  58. package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +13 -18
  59. package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +13 -18
  60. package/claude-assets/agents/cfn-dev-team/reviewers/code-reviewer.md +312 -317
  61. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +23 -20
  62. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +23 -20
  63. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +23 -20
  64. package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +23 -20
  65. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +15 -20
  66. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +15 -20
  67. package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +718 -737
  68. package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +817 -828
  69. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +15 -20
  70. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +8 -9
  71. package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +668 -684
  72. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +15 -20
  73. package/claude-assets/agents/cfn-dev-team/testers/tester.md +248 -253
  74. package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +13 -18
  75. package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +13 -18
  76. package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +13 -18
  77. package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-coordinator.md +1 -1
  78. package/claude-assets/cfn-extras/docs/GOOGLE_SHEETS_CFN_LOOP.md +13 -11
  79. package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +39 -577
  80. package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +49 -270
  81. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/consensus.ts +87 -0
  82. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/deliverable-verifier.ts +103 -0
  83. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/gate-check.ts +115 -0
  84. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/iteration-manager.ts +45 -0
  85. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/parse-test-results.ts +372 -0
  86. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/timeout-calculator.ts +41 -0
  87. package/claude-assets/skills/cfn-loop-orchestration/tests/consensus.test.ts +142 -0
  88. package/claude-assets/skills/cfn-loop-orchestration/tests/deliverable-verifier.test.ts +197 -0
  89. package/claude-assets/skills/cfn-loop-orchestration/tests/gate-check.test.ts +325 -0
  90. package/claude-assets/skills/cfn-loop-orchestration/tests/iteration-manager.test.ts +132 -0
  91. package/claude-assets/skills/cfn-loop-orchestration/tests/parse-test-results.test.ts +382 -0
  92. package/claude-assets/skills/cfn-loop-orchestration/tests/timeout-calculator.test.ts +118 -0
  93. package/claude-assets/skills/cfn-redis-coordination/coverage/clover.xml +1447 -0
  94. package/claude-assets/skills/cfn-redis-coordination/coverage/coverage-final.json +13 -0
  95. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/agent-logger.ts.html +1423 -0
  96. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/agent-recovery.ts.html +1447 -0
  97. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/base.css +224 -0
  98. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/block-navigation.js +87 -0
  99. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/completion-reporter.ts.html +1273 -0
  100. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/context-manager.ts.html +1066 -0
  101. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/favicon.png +0 -0
  102. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/index.html +281 -0
  103. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/mode-detector.ts.html +550 -0
  104. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/prettify.css +1 -0
  105. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/prettify.js +2 -0
  106. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/redis-client.ts.html +2047 -0
  107. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/result-collector.ts.html +1396 -0
  108. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  109. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/sorter.js +210 -0
  110. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/swarm-manager.ts.html +1567 -0
  111. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/task-analyzer.ts.html +1297 -0
  112. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/task-executor.ts.html +1354 -0
  113. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/types.ts.html +790 -0
  114. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/waiting-coordinator.ts.html +1846 -0
  115. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov.info +2650 -0
  116. package/claude-assets/skills/cfn-redis-coordination/dist/task-analyzer.js +1 -1
  117. package/claude-assets/skills/cfn-redis-coordination/src/task-analyzer.ts +1 -1
  118. package/claude-assets/skills/cfn-redis-coordination/tests/coordination.test.ts +18 -9
  119. package/dist/agents/agent-loader.js +165 -146
  120. package/dist/agents/agent-loader.js.map +1 -1
  121. package/package.json +1 -1
  122. package/scripts/clean-agent-profiles.sh +112 -0
@@ -0,0 +1,382 @@
1
+ import { parseTestResults } from '../src/helpers/parse-test-results';
2
+
3
+ describe('parseTestResults', () => {
4
+ describe('Jest parser', () => {
5
+ it('should parse passing Jest output', () => {
6
+ const jestOutput = `
7
+ PASS tests/example.test.ts
8
+ ✓ test case 1 (5 ms)
9
+ ✓ test case 2 (3 ms)
10
+
11
+ Test Suites: 1 passed, 1 total
12
+ Tests: 2 passed, 2 total
13
+ Time: 1.234 s
14
+ `;
15
+
16
+ const result = parseTestResults('jest', jestOutput);
17
+
18
+ expect(result.framework).toBe('jest');
19
+ expect(result.total).toBe(2);
20
+ expect(result.passed).toBe(2);
21
+ expect(result.failed).toBe(0);
22
+ expect(result.skipped).toBe(0);
23
+ expect(result.passRate).toBeCloseTo(1.0, 4);
24
+ expect(result.durationMs).toBeGreaterThan(0);
25
+ });
26
+
27
+ it('should parse failing Jest output', () => {
28
+ const jestOutput = `
29
+ FAIL tests/example.test.ts
30
+ ✓ test case 1 (5 ms)
31
+ ✕ test case 2 (3 ms)
32
+ ✕ test case 3 (2 ms)
33
+
34
+ ● test case 2
35
+ ● test case 3
36
+
37
+ Test Suites: 1 failed, 1 total
38
+ Tests: 1 passed, 2 failed, 3 total
39
+ Time: 0.567 s
40
+ `;
41
+
42
+ const result = parseTestResults('jest', jestOutput);
43
+
44
+ expect(result.framework).toBe('jest');
45
+ expect(result.total).toBe(3);
46
+ expect(result.passed).toBe(1);
47
+ expect(result.failed).toBe(2);
48
+ expect(result.passRate).toBeCloseTo(0.3333, 4);
49
+ expect(result.failedTestNames).toEqual(['test case 2', 'test case 3']);
50
+ });
51
+
52
+ it('should handle Jest output with skipped tests', () => {
53
+ const jestOutput = `
54
+ Tests: 2 passed, 1 skipped, 3 total
55
+ `;
56
+
57
+ const result = parseTestResults('jest', jestOutput);
58
+
59
+ expect(result.total).toBe(3);
60
+ expect(result.passed).toBe(2);
61
+ expect(result.skipped).toBe(1);
62
+ expect(result.passRate).toBeCloseTo(0.6667, 4);
63
+ });
64
+
65
+ it('should handle invalid Jest output', () => {
66
+ const result = parseTestResults('jest', 'invalid output');
67
+
68
+ expect(result.total).toBe(0);
69
+ expect(result.passed).toBe(0);
70
+ expect(result.failed).toBe(0);
71
+ expect(result.passRate).toBe(0.0);
72
+ });
73
+ });
74
+
75
+ describe('Mocha parser', () => {
76
+ it('should parse passing Mocha output', () => {
77
+ const mochaOutput = `
78
+ ✓ test case 1
79
+ ✓ test case 2
80
+
81
+ 2 passing (150ms)
82
+ `;
83
+
84
+ const result = parseTestResults('mocha', mochaOutput);
85
+
86
+ expect(result.framework).toBe('mocha');
87
+ expect(result.total).toBe(2);
88
+ expect(result.passed).toBe(2);
89
+ expect(result.failed).toBe(0);
90
+ expect(result.passRate).toBe(1.0);
91
+ expect(result.durationMs).toBe(150);
92
+ });
93
+
94
+ it('should parse failing Mocha output', () => {
95
+ const mochaOutput = `
96
+ ✓ test case 1
97
+ 1) test case 2: AssertionError
98
+ 2) test case 3: Error
99
+
100
+ 1 passing (100ms)
101
+ 2 failing
102
+ `;
103
+
104
+ const result = parseTestResults('mocha', mochaOutput);
105
+
106
+ expect(result.total).toBe(3);
107
+ expect(result.passed).toBe(1);
108
+ expect(result.failed).toBe(2);
109
+ expect(result.passRate).toBeCloseTo(0.3333, 4);
110
+ expect(result.failedTestNames).toHaveLength(2);
111
+ });
112
+
113
+ it('should parse Mocha output with pending tests', () => {
114
+ const mochaOutput = `
115
+ 2 passing (50ms)
116
+ 1 pending
117
+ `;
118
+
119
+ const result = parseTestResults('mocha', mochaOutput);
120
+
121
+ expect(result.total).toBe(3);
122
+ expect(result.passed).toBe(2);
123
+ expect(result.skipped).toBe(1);
124
+ });
125
+
126
+ it('should handle time in seconds', () => {
127
+ const mochaOutput = `
128
+ 5 passing (2.5s)
129
+ `;
130
+
131
+ const result = parseTestResults('mocha', mochaOutput);
132
+
133
+ expect(result.durationMs).toBe(2500);
134
+ });
135
+ });
136
+
137
+ describe('Pytest parser', () => {
138
+ it('should parse passing pytest output', () => {
139
+ const pytestOutput = `
140
+ test_example.py::test_case_1 PASSED
141
+ test_example.py::test_case_2 PASSED
142
+
143
+ ====== 2 passed in 0.45s ======
144
+ `;
145
+
146
+ const result = parseTestResults('pytest', pytestOutput);
147
+
148
+ expect(result.framework).toBe('pytest');
149
+ expect(result.total).toBe(2);
150
+ expect(result.passed).toBe(2);
151
+ expect(result.failed).toBe(0);
152
+ expect(result.passRate).toBe(1.0);
153
+ expect(result.durationMs).toBe(450);
154
+ });
155
+
156
+ it('should parse failing pytest output', () => {
157
+ const pytestOutput = `
158
+ test_example.py::test_case_1 PASSED
159
+ test_example.py::test_case_2 FAILED
160
+
161
+ FAILED test_example.py::test_case_2
162
+
163
+ 1 passed, 1 failed in 1.23s
164
+ `;
165
+
166
+ const result = parseTestResults('pytest', pytestOutput);
167
+
168
+ expect(result.total).toBe(2);
169
+ expect(result.passed).toBe(1);
170
+ expect(result.failed).toBe(1);
171
+ expect(result.passRate).toBe(0.5);
172
+ expect(result.failedTestNames).toContain('test_example.py::test_case_2');
173
+ });
174
+
175
+ it('should parse pytest output with skipped tests', () => {
176
+ const pytestOutput = `
177
+ 2 passed, 1 skipped in 0.5s
178
+ `;
179
+
180
+ const result = parseTestResults('pytest', pytestOutput);
181
+
182
+ expect(result.total).toBe(3);
183
+ expect(result.skipped).toBe(1);
184
+ });
185
+ });
186
+
187
+ describe('TAP parser', () => {
188
+ it('should parse passing TAP output', () => {
189
+ const tapOutput = `
190
+ 1..3
191
+ ok 1 - test case 1
192
+ ok 2 - test case 2
193
+ ok 3 - test case 3
194
+ `;
195
+
196
+ const result = parseTestResults('tap', tapOutput);
197
+
198
+ expect(result.framework).toBe('tap');
199
+ expect(result.total).toBe(3);
200
+ expect(result.passed).toBe(3);
201
+ expect(result.failed).toBe(0);
202
+ expect(result.passRate).toBe(1.0);
203
+ });
204
+
205
+ it('should parse failing TAP output', () => {
206
+ const tapOutput = `
207
+ 1..4
208
+ ok 1 - test case 1
209
+ not ok 2 - test case 2
210
+ ok 3 - test case 3
211
+ not ok 4 - test case 4
212
+ `;
213
+
214
+ const result = parseTestResults('tap', tapOutput);
215
+
216
+ expect(result.total).toBe(4);
217
+ expect(result.passed).toBe(2);
218
+ expect(result.failed).toBe(2);
219
+ expect(result.passRate).toBe(0.5);
220
+ expect(result.failedTestNames).toHaveLength(2);
221
+ });
222
+
223
+ it('should parse TAP output with skipped tests', () => {
224
+ const tapOutput = `
225
+ 1..3
226
+ ok 1 - test case 1
227
+ ok 2 - test case 2 # SKIP not implemented
228
+ ok 3 - test case 3
229
+ `;
230
+
231
+ const result = parseTestResults('tap', tapOutput);
232
+
233
+ expect(result.total).toBe(3);
234
+ expect(result.passed).toBe(2);
235
+ expect(result.skipped).toBe(1);
236
+ });
237
+ });
238
+
239
+ describe('Go test parser', () => {
240
+ it('should parse passing Go test output', () => {
241
+ const goOutput = `
242
+ --- PASS: TestExample1 (0.00s)
243
+ --- PASS: TestExample2 (0.01s)
244
+ PASS
245
+ ok example/package 0.123s
246
+ `;
247
+
248
+ const result = parseTestResults('go', goOutput);
249
+
250
+ expect(result.framework).toBe('go');
251
+ expect(result.total).toBe(2);
252
+ expect(result.passed).toBe(2);
253
+ expect(result.failed).toBe(0);
254
+ expect(result.passRate).toBe(1.0);
255
+ expect(result.durationMs).toBe(123);
256
+ });
257
+
258
+ it('should parse failing Go test output', () => {
259
+ const goOutput = `
260
+ --- PASS: TestExample1 (0.00s)
261
+ --- FAIL: TestExample2 (0.01s)
262
+ --- FAIL: TestExample3 (0.00s)
263
+ FAIL
264
+ ok example/package 0.234s
265
+ `;
266
+
267
+ const result = parseTestResults('go', goOutput);
268
+
269
+ expect(result.total).toBe(3);
270
+ expect(result.passed).toBe(1);
271
+ expect(result.failed).toBe(2);
272
+ expect(result.passRate).toBeCloseTo(0.3333, 4);
273
+ expect(result.failedTestNames).toHaveLength(2);
274
+ });
275
+
276
+ it('should parse Go output with skipped tests', () => {
277
+ const goOutput = `
278
+ --- PASS: TestExample1 (0.00s)
279
+ --- SKIP: TestExample2 (0.00s)
280
+ ok example/package 0.1s
281
+ `;
282
+
283
+ const result = parseTestResults('go', goOutput);
284
+
285
+ expect(result.total).toBe(2);
286
+ expect(result.passed).toBe(1);
287
+ expect(result.skipped).toBe(1);
288
+ });
289
+ });
290
+
291
+ describe('Auto-detect framework', () => {
292
+ it('should auto-detect Jest output', () => {
293
+ const jestOutput = `
294
+ Test Suites: 1 passed, 1 total
295
+ Tests: 5 passed, 5 total
296
+ `;
297
+
298
+ const result = parseTestResults('auto', jestOutput);
299
+
300
+ expect(result.framework).toBe('jest');
301
+ expect(result.total).toBe(5);
302
+ });
303
+
304
+ it('should auto-detect Mocha output', () => {
305
+ const mochaOutput = `
306
+ 3 passing (100ms)
307
+ 1 failing
308
+ `;
309
+
310
+ const result = parseTestResults('auto', mochaOutput);
311
+
312
+ expect(result.framework).toBe('mocha');
313
+ expect(result.total).toBe(4);
314
+ });
315
+
316
+ it('should auto-detect pytest output', () => {
317
+ const pytestOutput = `
318
+ ====== 5 passed in 1.2s ======
319
+ `;
320
+
321
+ const result = parseTestResults('auto', pytestOutput);
322
+
323
+ expect(result.framework).toBe('pytest');
324
+ });
325
+
326
+ it('should auto-detect TAP output', () => {
327
+ const tapOutput = `
328
+ 1..10
329
+ ok 1 - test
330
+ `;
331
+
332
+ const result = parseTestResults('auto', tapOutput);
333
+
334
+ expect(result.framework).toBe('tap');
335
+ });
336
+
337
+ it('should auto-detect Go test output', () => {
338
+ const goOutput = `
339
+ --- PASS: TestExample (0.00s)
340
+ PASS
341
+ `;
342
+
343
+ const result = parseTestResults('auto', goOutput);
344
+
345
+ expect(result.framework).toBe('go');
346
+ });
347
+
348
+ it('should return unknown for unrecognized output', () => {
349
+ const result = parseTestResults('auto', 'completely random output');
350
+
351
+ expect(result.framework).toBe('unknown');
352
+ expect(result.total).toBe(0);
353
+ });
354
+ });
355
+
356
+ describe('Edge cases', () => {
357
+ it('should handle empty output', () => {
358
+ const result = parseTestResults('jest', '');
359
+
360
+ expect(result.total).toBe(0);
361
+ expect(result.passRate).toBe(0.0);
362
+ });
363
+
364
+ it('should handle zero tests', () => {
365
+ const jestOutput = `
366
+ Tests: 0 total
367
+ `;
368
+
369
+ const result = parseTestResults('jest', jestOutput);
370
+
371
+ expect(result.total).toBe(0);
372
+ expect(result.passRate).toBe(0.0);
373
+ });
374
+
375
+ it('should preserve raw output', () => {
376
+ const rawOutput = 'test output here';
377
+ const result = parseTestResults('jest', rawOutput);
378
+
379
+ expect(result.raw).toBe(rawOutput);
380
+ });
381
+ });
382
+ });
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Timeout Calculator Tests
3
+ * Tests for calculating mode and phase-specific timeouts
4
+ */
5
+
6
+ import { calculateTimeout, Mode } from '../src/helpers/timeout-calculator';
7
+
8
+ describe('timeout-calculator', () => {
9
+ describe('mode-based timeouts', () => {
10
+ it('should calculate timeout for mvp mode', () => {
11
+ const timeout = calculateTimeout({ mode: 'mvp' });
12
+ expect(timeout).toBe(1800); // 30 min
13
+ });
14
+
15
+ it('should calculate timeout for standard mode', () => {
16
+ const timeout = calculateTimeout({ mode: 'standard' });
17
+ expect(timeout).toBe(3600); // 60 min
18
+ });
19
+
20
+ it('should calculate timeout for enterprise mode', () => {
21
+ const timeout = calculateTimeout({ mode: 'enterprise' });
22
+ expect(timeout).toBe(7200); // 120 min
23
+ });
24
+ });
25
+
26
+ describe('phase multipliers', () => {
27
+ it('should apply phase-1 multiplier (1x)', () => {
28
+ const timeout = calculateTimeout({ mode: 'standard', phase: 'phase-1' });
29
+ expect(timeout).toBe(3600); // 60 min * 1.0
30
+ });
31
+
32
+ it('should apply phase-2 multiplier (1.5x)', () => {
33
+ const timeout = calculateTimeout({ mode: 'standard', phase: 'phase-2' });
34
+ expect(timeout).toBe(5400); // 60 min * 1.5
35
+ });
36
+
37
+ it('should apply phase-3 multiplier (2x)', () => {
38
+ const timeout = calculateTimeout({ mode: 'standard', phase: 'phase-3' });
39
+ expect(timeout).toBe(7200); // 60 min * 2.0
40
+ });
41
+
42
+ it('should apply phase-4 multiplier (1.0x)', () => {
43
+ const timeout = calculateTimeout({ mode: 'standard', phase: 'phase-4' });
44
+ expect(timeout).toBe(3600); // 60 min * 1.0
45
+ });
46
+ });
47
+
48
+ describe('combined mode and phase calculations', () => {
49
+ it('should calculate mvp mode with phase-2', () => {
50
+ const timeout = calculateTimeout({ mode: 'mvp', phase: 'phase-2' });
51
+ expect(timeout).toBe(2700); // 30 min * 1.5
52
+ });
53
+
54
+ it('should calculate mvp mode with phase-3', () => {
55
+ const timeout = calculateTimeout({ mode: 'mvp', phase: 'phase-3' });
56
+ expect(timeout).toBe(3600); // 30 min * 2.0
57
+ });
58
+
59
+ it('should calculate enterprise mode with phase-2', () => {
60
+ const timeout = calculateTimeout({ mode: 'enterprise', phase: 'phase-2' });
61
+ expect(timeout).toBe(10800); // 120 min * 1.5
62
+ });
63
+
64
+ it('should calculate enterprise mode with phase-3', () => {
65
+ const timeout = calculateTimeout({ mode: 'enterprise', phase: 'phase-3' });
66
+ expect(timeout).toBe(14400); // 120 min * 2.0
67
+ });
68
+ });
69
+
70
+ describe('edge cases', () => {
71
+ it('should use base timeout when no phase specified', () => {
72
+ const timeout = calculateTimeout({ mode: 'standard' });
73
+ expect(timeout).toBe(3600); // No multiplier
74
+ });
75
+
76
+ it('should use base timeout for unknown phase', () => {
77
+ const timeout = calculateTimeout({ mode: 'standard', phase: 'unknown-phase' });
78
+ expect(timeout).toBe(3600); // Default multiplier = 1.0
79
+ });
80
+
81
+ it('should handle phase with different casing', () => {
82
+ const timeout = calculateTimeout({ mode: 'standard', phase: 'PHASE-2' });
83
+ expect(timeout).toBe(5400); // Case-insensitive
84
+ });
85
+ });
86
+
87
+ describe('timeout consistency', () => {
88
+ it('should return same timeout for same inputs', () => {
89
+ const timeout1 = calculateTimeout({ mode: 'standard', phase: 'phase-2' });
90
+ const timeout2 = calculateTimeout({ mode: 'standard', phase: 'phase-2' });
91
+ expect(timeout1).toBe(timeout2);
92
+ });
93
+
94
+ it('should return integer values', () => {
95
+ const modes: Mode[] = ['mvp', 'standard', 'enterprise'];
96
+ const phases = ['phase-1', 'phase-2', 'phase-3', 'phase-4'];
97
+
98
+ modes.forEach(mode => {
99
+ phases.forEach(phase => {
100
+ const timeout = calculateTimeout({ mode, phase });
101
+ expect(Number.isInteger(timeout)).toBe(true);
102
+ });
103
+ });
104
+ });
105
+ });
106
+
107
+ describe('timeout ranges', () => {
108
+ it('should have minimum timeout of 1800 seconds (30 min)', () => {
109
+ const timeout = calculateTimeout({ mode: 'mvp' });
110
+ expect(timeout).toBeGreaterThanOrEqual(1800);
111
+ });
112
+
113
+ it('should have maximum timeout of 14400 seconds (240 min)', () => {
114
+ const timeout = calculateTimeout({ mode: 'enterprise', phase: 'phase-3' });
115
+ expect(timeout).toBeLessThanOrEqual(14400);
116
+ });
117
+ });
118
+ });