sequant 1.1.0 → 1.1.2

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 (64) hide show
  1. package/dist/bin/cli.js +21 -3
  2. package/dist/bin/cli.js.map +1 -1
  3. package/dist/src/commands/doctor.d.ts.map +1 -1
  4. package/dist/src/commands/doctor.js +1 -25
  5. package/dist/src/commands/doctor.js.map +1 -1
  6. package/dist/src/commands/doctor.test.js +28 -97
  7. package/dist/src/commands/doctor.test.js.map +1 -1
  8. package/dist/src/commands/init.d.ts.map +1 -1
  9. package/dist/src/commands/init.js +3 -27
  10. package/dist/src/commands/init.js.map +1 -1
  11. package/dist/src/commands/init.test.js +32 -75
  12. package/dist/src/commands/init.test.js.map +1 -1
  13. package/dist/src/commands/logs.d.ts +18 -0
  14. package/dist/src/commands/logs.d.ts.map +1 -0
  15. package/dist/src/commands/logs.js +188 -0
  16. package/dist/src/commands/logs.js.map +1 -0
  17. package/dist/src/commands/run.d.ts +10 -1
  18. package/dist/src/commands/run.d.ts.map +1 -1
  19. package/dist/src/commands/run.js +429 -98
  20. package/dist/src/commands/run.js.map +1 -1
  21. package/dist/src/commands/update.d.ts.map +1 -1
  22. package/dist/src/commands/update.js +16 -0
  23. package/dist/src/commands/update.js.map +1 -1
  24. package/dist/src/lib/system.d.ts +16 -0
  25. package/dist/src/lib/system.d.ts.map +1 -0
  26. package/dist/src/lib/system.js +52 -0
  27. package/dist/src/lib/system.js.map +1 -0
  28. package/dist/src/lib/system.test.d.ts +2 -0
  29. package/dist/src/lib/system.test.d.ts.map +1 -0
  30. package/dist/src/lib/system.test.js +80 -0
  31. package/dist/src/lib/system.test.js.map +1 -0
  32. package/dist/src/lib/workflow/log-writer.d.ts +83 -0
  33. package/dist/src/lib/workflow/log-writer.d.ts.map +1 -0
  34. package/dist/src/lib/workflow/log-writer.js +193 -0
  35. package/dist/src/lib/workflow/log-writer.js.map +1 -0
  36. package/dist/src/lib/workflow/log-writer.test.d.ts +7 -0
  37. package/dist/src/lib/workflow/log-writer.test.d.ts.map +1 -0
  38. package/dist/src/lib/workflow/log-writer.test.js +451 -0
  39. package/dist/src/lib/workflow/log-writer.test.js.map +1 -0
  40. package/dist/src/lib/workflow/run-log-schema.d.ts +261 -0
  41. package/dist/src/lib/workflow/run-log-schema.d.ts.map +1 -0
  42. package/dist/src/lib/workflow/run-log-schema.js +234 -0
  43. package/dist/src/lib/workflow/run-log-schema.js.map +1 -0
  44. package/dist/src/lib/workflow/run-log-schema.test.d.ts +2 -0
  45. package/dist/src/lib/workflow/run-log-schema.test.d.ts.map +1 -0
  46. package/dist/src/lib/workflow/run-log-schema.test.js +455 -0
  47. package/dist/src/lib/workflow/run-log-schema.test.js.map +1 -0
  48. package/package.json +4 -2
  49. package/templates/hooks/pre-tool.sh +14 -2
  50. package/templates/scripts/cleanup-worktree.sh +23 -1
  51. package/templates/skills/assess/SKILL.md +15 -0
  52. package/templates/skills/clean/SKILL.md +15 -0
  53. package/templates/skills/docs/SKILL.md +16 -0
  54. package/templates/skills/exec/SKILL.md +32 -0
  55. package/templates/skills/fullsolve/SKILL.md +42 -0
  56. package/templates/skills/loop/SKILL.md +14 -0
  57. package/templates/skills/qa/SKILL.md +67 -0
  58. package/templates/skills/reflect/SKILL.md +14 -0
  59. package/templates/skills/security-review/SKILL.md +15 -0
  60. package/templates/skills/solve/SKILL.md +44 -0
  61. package/templates/skills/spec/SKILL.md +59 -0
  62. package/templates/skills/test/SKILL.md +14 -0
  63. package/templates/skills/testgen/SKILL.md +15 -0
  64. package/templates/skills/verify/SKILL.md +15 -0
@@ -0,0 +1,451 @@
1
+ /**
2
+ * Unit tests for LogWriter
3
+ *
4
+ * Tests the structured logging system that writes JSON run logs to disk.
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
7
+ import * as fs from "fs";
8
+ import * as path from "path";
9
+ import * as os from "os";
10
+ import { LogWriter, createPhaseLogFromTiming } from "./log-writer.js";
11
+ // Mock fs module
12
+ vi.mock("fs", () => ({
13
+ existsSync: vi.fn(),
14
+ mkdirSync: vi.fn(),
15
+ writeFileSync: vi.fn(),
16
+ }));
17
+ // Mock crypto.randomUUID for deterministic tests
18
+ const mockUUID = "12345678-1234-1234-1234-123456789abc";
19
+ vi.stubGlobal("crypto", {
20
+ randomUUID: () => mockUUID,
21
+ });
22
+ describe("LogWriter", () => {
23
+ const mockConfig = {
24
+ phases: ["spec", "exec", "qa"],
25
+ sequential: false,
26
+ qualityLoop: true,
27
+ maxIterations: 3,
28
+ };
29
+ const mockPhaseLog = {
30
+ phase: "spec",
31
+ issueNumber: 123,
32
+ startTime: "2024-01-15T10:00:00.000Z",
33
+ endTime: "2024-01-15T10:01:30.000Z",
34
+ durationSeconds: 90,
35
+ status: "success",
36
+ };
37
+ beforeEach(() => {
38
+ vi.clearAllMocks();
39
+ vi.useFakeTimers();
40
+ vi.setSystemTime(new Date("2024-01-15T10:00:00.000Z"));
41
+ fs.existsSync.mockReturnValue(true);
42
+ });
43
+ afterEach(() => {
44
+ vi.useRealTimers();
45
+ });
46
+ describe("constructor", () => {
47
+ it("should use default options when none provided", () => {
48
+ const writer = new LogWriter();
49
+ // Can't directly test private fields, but we can verify behavior
50
+ expect(writer.getRunLog()).toBeNull();
51
+ expect(writer.getRunId()).toBeNull();
52
+ });
53
+ it("should accept custom log path", async () => {
54
+ const writer = new LogWriter({ logPath: "/custom/logs" });
55
+ fs.existsSync.mockReturnValue(false);
56
+ await writer.initialize(mockConfig);
57
+ expect(fs.mkdirSync).toHaveBeenCalledWith("/custom/logs", {
58
+ recursive: true,
59
+ });
60
+ });
61
+ it("should respect writeToUserLogs option", async () => {
62
+ const writer = new LogWriter({ writeToUserLogs: true });
63
+ fs.existsSync.mockReturnValue(false);
64
+ await writer.initialize(mockConfig);
65
+ // Should create both project and user log directories
66
+ const expectedUserPath = path.join(os.homedir(), ".sequant/logs");
67
+ expect(fs.mkdirSync).toHaveBeenCalledWith(expectedUserPath, {
68
+ recursive: true,
69
+ });
70
+ });
71
+ it("should respect verbose option", async () => {
72
+ const consoleSpy = vi.spyOn(console, "log").mockImplementation(() => { });
73
+ const writer = new LogWriter({ verbose: true });
74
+ await writer.initialize(mockConfig);
75
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("Log initialized"));
76
+ consoleSpy.mockRestore();
77
+ });
78
+ });
79
+ describe("initialize", () => {
80
+ it("should create a run log with correct structure", async () => {
81
+ const writer = new LogWriter();
82
+ await writer.initialize(mockConfig);
83
+ const runLog = writer.getRunLog();
84
+ expect(runLog).not.toBeNull();
85
+ expect(runLog.version).toBe(1);
86
+ expect(runLog.runId).toBe(mockUUID);
87
+ expect(runLog.config).toEqual(mockConfig);
88
+ expect(runLog.issues).toEqual([]);
89
+ expect(runLog.summary).toEqual({
90
+ totalIssues: 0,
91
+ passed: 0,
92
+ failed: 0,
93
+ totalDurationSeconds: 0,
94
+ });
95
+ });
96
+ it("should create log directory if it does not exist", async () => {
97
+ const writer = new LogWriter({ logPath: "/test/logs" });
98
+ fs.existsSync.mockReturnValue(false);
99
+ await writer.initialize(mockConfig);
100
+ expect(fs.mkdirSync).toHaveBeenCalledWith("/test/logs", {
101
+ recursive: true,
102
+ });
103
+ });
104
+ it("should not create directory if it already exists", async () => {
105
+ const writer = new LogWriter();
106
+ fs.existsSync.mockReturnValue(true);
107
+ await writer.initialize(mockConfig);
108
+ expect(fs.mkdirSync).not.toHaveBeenCalled();
109
+ });
110
+ it("should resolve ~ in paths to home directory", async () => {
111
+ const writer = new LogWriter({ logPath: "~/custom/logs" });
112
+ fs.existsSync.mockReturnValue(false);
113
+ await writer.initialize(mockConfig);
114
+ const expectedPath = path.join(os.homedir(), "custom/logs");
115
+ expect(fs.mkdirSync).toHaveBeenCalledWith(expectedPath, {
116
+ recursive: true,
117
+ });
118
+ });
119
+ });
120
+ describe("startIssue", () => {
121
+ it("should initialize a new issue", async () => {
122
+ const writer = new LogWriter();
123
+ await writer.initialize(mockConfig);
124
+ writer.startIssue(123, "Test Issue", ["bug", "priority"]);
125
+ // Issue is not added to runLog until completeIssue()
126
+ const runLog = writer.getRunLog();
127
+ expect(runLog.issues).toHaveLength(0);
128
+ });
129
+ it("should throw if not initialized", () => {
130
+ const writer = new LogWriter();
131
+ expect(() => {
132
+ writer.startIssue(123, "Test Issue", []);
133
+ }).toThrow("LogWriter not initialized");
134
+ });
135
+ it("should log to console in verbose mode", async () => {
136
+ const consoleSpy = vi.spyOn(console, "log").mockImplementation(() => { });
137
+ const writer = new LogWriter({ verbose: true });
138
+ await writer.initialize(mockConfig);
139
+ writer.startIssue(123, "Test Issue", []);
140
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("Started logging issue #123"));
141
+ consoleSpy.mockRestore();
142
+ });
143
+ });
144
+ describe("logPhase", () => {
145
+ it("should add phase to current issue", async () => {
146
+ const writer = new LogWriter();
147
+ await writer.initialize(mockConfig);
148
+ writer.startIssue(123, "Test Issue", []);
149
+ writer.logPhase(mockPhaseLog);
150
+ writer.completeIssue();
151
+ const runLog = writer.getRunLog();
152
+ expect(runLog.issues[0].phases).toHaveLength(1);
153
+ expect(runLog.issues[0].phases[0]).toEqual(mockPhaseLog);
154
+ });
155
+ it("should update issue status to failure when phase fails", async () => {
156
+ const writer = new LogWriter();
157
+ await writer.initialize(mockConfig);
158
+ writer.startIssue(123, "Test Issue", []);
159
+ const failedPhase = {
160
+ ...mockPhaseLog,
161
+ status: "failure",
162
+ error: "Something went wrong",
163
+ };
164
+ writer.logPhase(failedPhase);
165
+ writer.completeIssue();
166
+ const runLog = writer.getRunLog();
167
+ expect(runLog.issues[0].status).toBe("failure");
168
+ });
169
+ it("should update issue status to partial when phase times out", async () => {
170
+ const writer = new LogWriter();
171
+ await writer.initialize(mockConfig);
172
+ writer.startIssue(123, "Test Issue", []);
173
+ const timedOutPhase = {
174
+ ...mockPhaseLog,
175
+ status: "timeout",
176
+ };
177
+ writer.logPhase(timedOutPhase);
178
+ writer.completeIssue();
179
+ const runLog = writer.getRunLog();
180
+ expect(runLog.issues[0].status).toBe("partial");
181
+ });
182
+ it("should keep failure status even if subsequent phase times out", async () => {
183
+ const writer = new LogWriter();
184
+ await writer.initialize(mockConfig);
185
+ writer.startIssue(123, "Test Issue", []);
186
+ const failedPhase = { ...mockPhaseLog, status: "failure" };
187
+ const timedOutPhase = { ...mockPhaseLog, status: "timeout" };
188
+ writer.logPhase(failedPhase);
189
+ writer.logPhase(timedOutPhase);
190
+ writer.completeIssue();
191
+ const runLog = writer.getRunLog();
192
+ expect(runLog.issues[0].status).toBe("failure");
193
+ });
194
+ it("should throw if no current issue", async () => {
195
+ const writer = new LogWriter();
196
+ await writer.initialize(mockConfig);
197
+ expect(() => {
198
+ writer.logPhase(mockPhaseLog);
199
+ }).toThrow("No current issue");
200
+ });
201
+ it("should log to console in verbose mode", async () => {
202
+ const consoleSpy = vi.spyOn(console, "log").mockImplementation(() => { });
203
+ const writer = new LogWriter({ verbose: true });
204
+ await writer.initialize(mockConfig);
205
+ writer.startIssue(123, "Test Issue", []);
206
+ writer.logPhase(mockPhaseLog);
207
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("Logged phase: spec (success)"));
208
+ consoleSpy.mockRestore();
209
+ });
210
+ });
211
+ describe("completeIssue", () => {
212
+ it("should calculate total duration from phases", async () => {
213
+ const writer = new LogWriter();
214
+ await writer.initialize(mockConfig);
215
+ writer.startIssue(123, "Test Issue", []);
216
+ const phase1 = { ...mockPhaseLog, durationSeconds: 30 };
217
+ const phase2 = {
218
+ ...mockPhaseLog,
219
+ phase: "exec",
220
+ durationSeconds: 60,
221
+ };
222
+ const phase3 = {
223
+ ...mockPhaseLog,
224
+ phase: "qa",
225
+ durationSeconds: 45,
226
+ };
227
+ writer.logPhase(phase1);
228
+ writer.logPhase(phase2);
229
+ writer.logPhase(phase3);
230
+ writer.completeIssue();
231
+ const runLog = writer.getRunLog();
232
+ expect(runLog.issues[0].totalDurationSeconds).toBe(135);
233
+ });
234
+ it("should add issue to run log", async () => {
235
+ const writer = new LogWriter();
236
+ await writer.initialize(mockConfig);
237
+ writer.startIssue(123, "Test Issue", ["bug"]);
238
+ writer.logPhase(mockPhaseLog);
239
+ writer.completeIssue();
240
+ const runLog = writer.getRunLog();
241
+ expect(runLog.issues).toHaveLength(1);
242
+ expect(runLog.issues[0].issueNumber).toBe(123);
243
+ expect(runLog.issues[0].title).toBe("Test Issue");
244
+ expect(runLog.issues[0].labels).toEqual(["bug"]);
245
+ });
246
+ it("should allow starting a new issue after completing", async () => {
247
+ const writer = new LogWriter();
248
+ await writer.initialize(mockConfig);
249
+ writer.startIssue(123, "First Issue", []);
250
+ writer.logPhase(mockPhaseLog);
251
+ writer.completeIssue();
252
+ writer.startIssue(456, "Second Issue", []);
253
+ writer.logPhase({ ...mockPhaseLog, issueNumber: 456 });
254
+ writer.completeIssue();
255
+ const runLog = writer.getRunLog();
256
+ expect(runLog.issues).toHaveLength(2);
257
+ expect(runLog.issues[0].issueNumber).toBe(123);
258
+ expect(runLog.issues[1].issueNumber).toBe(456);
259
+ });
260
+ it("should throw if no current issue", async () => {
261
+ const writer = new LogWriter();
262
+ await writer.initialize(mockConfig);
263
+ expect(() => {
264
+ writer.completeIssue();
265
+ }).toThrow("No current issue to complete");
266
+ });
267
+ it("should throw if writer not initialized", () => {
268
+ const writer = new LogWriter();
269
+ expect(() => {
270
+ writer.completeIssue();
271
+ }).toThrow("No current issue to complete");
272
+ });
273
+ });
274
+ describe("finalize", () => {
275
+ it("should write log file to disk", async () => {
276
+ const writer = new LogWriter({ logPath: "/test/logs" });
277
+ await writer.initialize(mockConfig);
278
+ writer.startIssue(123, "Test Issue", []);
279
+ writer.logPhase(mockPhaseLog);
280
+ writer.completeIssue();
281
+ const logPath = await writer.finalize();
282
+ expect(fs.writeFileSync).toHaveBeenCalled();
283
+ expect(logPath).toContain("/test/logs/");
284
+ expect(logPath).toContain(".json");
285
+ });
286
+ it("should auto-complete pending issue before finalizing", async () => {
287
+ const writer = new LogWriter({ logPath: "/test/logs" });
288
+ await writer.initialize(mockConfig);
289
+ writer.startIssue(123, "Test Issue", []);
290
+ writer.logPhase(mockPhaseLog);
291
+ // Note: not calling completeIssue()
292
+ await writer.finalize();
293
+ const writeCall = fs.writeFileSync.mock
294
+ .calls[0];
295
+ const writtenLog = JSON.parse(writeCall[1]);
296
+ expect(writtenLog.issues).toHaveLength(1);
297
+ });
298
+ it("should write to user logs when option is enabled", async () => {
299
+ const writer = new LogWriter({
300
+ logPath: "/project/logs",
301
+ writeToUserLogs: true,
302
+ });
303
+ await writer.initialize(mockConfig);
304
+ writer.startIssue(123, "Test", []);
305
+ writer.logPhase(mockPhaseLog);
306
+ writer.completeIssue();
307
+ await writer.finalize();
308
+ // Should write to both project and user paths
309
+ expect(fs.writeFileSync).toHaveBeenCalledTimes(2);
310
+ });
311
+ it("should throw if not initialized", async () => {
312
+ const writer = new LogWriter();
313
+ await expect(writer.finalize()).rejects.toThrow("LogWriter not initialized");
314
+ });
315
+ it("should return correct log path", async () => {
316
+ const writer = new LogWriter({ logPath: "/test/logs" });
317
+ await writer.initialize(mockConfig);
318
+ const logPath = await writer.finalize();
319
+ expect(logPath).toMatch(/^\/test\/logs\/run-\d{4}-\d{2}-\d{2}T.*\.json$/);
320
+ });
321
+ it("should create directory if it does not exist when writing", async () => {
322
+ const writer = new LogWriter({ logPath: "/new/path" });
323
+ fs.existsSync.mockImplementation((p) => {
324
+ // Directory exists during initialize but not during write
325
+ return !p.includes("/new/path");
326
+ });
327
+ await writer.initialize(mockConfig);
328
+ await writer.finalize();
329
+ expect(fs.mkdirSync).toHaveBeenCalled();
330
+ });
331
+ it("should include summary statistics in finalized log", async () => {
332
+ const writer = new LogWriter({ logPath: "/test/logs" });
333
+ await writer.initialize(mockConfig);
334
+ // Add a successful issue
335
+ writer.startIssue(123, "Success", []);
336
+ writer.logPhase(mockPhaseLog);
337
+ writer.completeIssue();
338
+ // Add a failed issue
339
+ writer.startIssue(456, "Failure", []);
340
+ writer.logPhase({ ...mockPhaseLog, status: "failure" });
341
+ writer.completeIssue();
342
+ await writer.finalize();
343
+ const writeCall = fs.writeFileSync.mock
344
+ .calls[0];
345
+ const writtenLog = JSON.parse(writeCall[1]);
346
+ expect(writtenLog.summary.totalIssues).toBe(2);
347
+ expect(writtenLog.summary.passed).toBe(1);
348
+ expect(writtenLog.summary.failed).toBe(1);
349
+ });
350
+ it("should log to console in verbose mode", async () => {
351
+ const consoleSpy = vi.spyOn(console, "log").mockImplementation(() => { });
352
+ const writer = new LogWriter({ verbose: true, logPath: "/test/logs" });
353
+ await writer.initialize(mockConfig);
354
+ await writer.finalize();
355
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining("Log written:"));
356
+ consoleSpy.mockRestore();
357
+ });
358
+ });
359
+ describe("getRunLog", () => {
360
+ it("should return null before initialization", () => {
361
+ const writer = new LogWriter();
362
+ expect(writer.getRunLog()).toBeNull();
363
+ });
364
+ it("should return run log after initialization", async () => {
365
+ const writer = new LogWriter();
366
+ await writer.initialize(mockConfig);
367
+ const runLog = writer.getRunLog();
368
+ expect(runLog).not.toBeNull();
369
+ expect(runLog.config).toEqual(mockConfig);
370
+ });
371
+ });
372
+ describe("getRunId", () => {
373
+ it("should return null before initialization", () => {
374
+ const writer = new LogWriter();
375
+ expect(writer.getRunId()).toBeNull();
376
+ });
377
+ it("should return run ID after initialization", async () => {
378
+ const writer = new LogWriter();
379
+ await writer.initialize(mockConfig);
380
+ expect(writer.getRunId()).toBe(mockUUID);
381
+ });
382
+ });
383
+ });
384
+ describe("createPhaseLogFromTiming", () => {
385
+ it("should create phase log from start and end times", () => {
386
+ const startTime = new Date("2024-01-15T10:00:00.000Z");
387
+ const endTime = new Date("2024-01-15T10:02:30.000Z");
388
+ const log = createPhaseLogFromTiming("spec", 123, startTime, endTime, "success");
389
+ expect(log).toEqual({
390
+ phase: "spec",
391
+ issueNumber: 123,
392
+ startTime: "2024-01-15T10:00:00.000Z",
393
+ endTime: "2024-01-15T10:02:30.000Z",
394
+ durationSeconds: 150,
395
+ status: "success",
396
+ });
397
+ });
398
+ it("should include optional fields when provided", () => {
399
+ const startTime = new Date("2024-01-15T10:00:00.000Z");
400
+ const endTime = new Date("2024-01-15T10:01:00.000Z");
401
+ const log = createPhaseLogFromTiming("exec", 456, startTime, endTime, "failure", {
402
+ error: "Build failed",
403
+ filesModified: ["src/index.ts", "src/utils.ts"],
404
+ });
405
+ expect(log.error).toBe("Build failed");
406
+ expect(log.filesModified).toEqual(["src/index.ts", "src/utils.ts"]);
407
+ });
408
+ it("should calculate correct duration for sub-second intervals", () => {
409
+ const startTime = new Date("2024-01-15T10:00:00.000Z");
410
+ const endTime = new Date("2024-01-15T10:00:00.500Z");
411
+ const log = createPhaseLogFromTiming("qa", 789, startTime, endTime, "success");
412
+ expect(log.durationSeconds).toBe(0.5);
413
+ });
414
+ it("should support all phase types", () => {
415
+ const startTime = new Date("2024-01-15T10:00:00.000Z");
416
+ const endTime = new Date("2024-01-15T10:01:00.000Z");
417
+ const phases = ["spec", "testgen", "exec", "test", "qa", "loop"];
418
+ for (const phase of phases) {
419
+ const log = createPhaseLogFromTiming(phase, 123, startTime, endTime, "success");
420
+ expect(log.phase).toBe(phase);
421
+ }
422
+ });
423
+ it("should support all status types", () => {
424
+ const startTime = new Date("2024-01-15T10:00:00.000Z");
425
+ const endTime = new Date("2024-01-15T10:01:00.000Z");
426
+ const statuses = ["success", "failure", "timeout", "skipped"];
427
+ for (const status of statuses) {
428
+ const log = createPhaseLogFromTiming("spec", 123, startTime, endTime, status);
429
+ expect(log.status).toBe(status);
430
+ }
431
+ });
432
+ it("should include test metrics when provided", () => {
433
+ const startTime = new Date("2024-01-15T10:00:00.000Z");
434
+ const endTime = new Date("2024-01-15T10:05:00.000Z");
435
+ const log = createPhaseLogFromTiming("test", 123, startTime, endTime, "success", {
436
+ testsRun: 50,
437
+ testsPassed: 48,
438
+ });
439
+ expect(log.testsRun).toBe(50);
440
+ expect(log.testsPassed).toBe(48);
441
+ });
442
+ it("should include iteration count for loop phase", () => {
443
+ const startTime = new Date("2024-01-15T10:00:00.000Z");
444
+ const endTime = new Date("2024-01-15T10:10:00.000Z");
445
+ const log = createPhaseLogFromTiming("loop", 123, startTime, endTime, "success", {
446
+ iterations: 3,
447
+ });
448
+ expect(log.iterations).toBe(3);
449
+ });
450
+ });
451
+ //# sourceMappingURL=log-writer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-writer.test.js","sourceRoot":"","sources":["../../../../src/lib/workflow/log-writer.test.ts"],"names":[],"mappings":"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"}