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,455 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import { PhaseSchema, PhaseStatusSchema, IssueStatusSchema, PhaseLogSchema, IssueLogSchema, RunConfigSchema, RunLogSchema, LOG_PATHS, generateLogFilename, createEmptyRunLog, createPhaseLog, completePhaseLog, finalizeRunLog, } from "./run-log-schema.js";
3
+ describe("Zod Schemas", () => {
4
+ describe("PhaseSchema", () => {
5
+ it("accepts valid phases", () => {
6
+ const validPhases = ["spec", "testgen", "exec", "test", "qa", "loop"];
7
+ for (const phase of validPhases) {
8
+ expect(() => PhaseSchema.parse(phase)).not.toThrow();
9
+ }
10
+ });
11
+ it("rejects invalid phases", () => {
12
+ expect(() => PhaseSchema.parse("invalid")).toThrow();
13
+ expect(() => PhaseSchema.parse("")).toThrow();
14
+ expect(() => PhaseSchema.parse(123)).toThrow();
15
+ });
16
+ });
17
+ describe("PhaseStatusSchema", () => {
18
+ it("accepts valid statuses", () => {
19
+ const validStatuses = ["success", "failure", "timeout", "skipped"];
20
+ for (const status of validStatuses) {
21
+ expect(() => PhaseStatusSchema.parse(status)).not.toThrow();
22
+ }
23
+ });
24
+ it("rejects invalid statuses", () => {
25
+ expect(() => PhaseStatusSchema.parse("pending")).toThrow();
26
+ expect(() => PhaseStatusSchema.parse("error")).toThrow();
27
+ });
28
+ });
29
+ describe("IssueStatusSchema", () => {
30
+ it("accepts valid statuses", () => {
31
+ const validStatuses = ["success", "failure", "partial"];
32
+ for (const status of validStatuses) {
33
+ expect(() => IssueStatusSchema.parse(status)).not.toThrow();
34
+ }
35
+ });
36
+ it("rejects invalid statuses", () => {
37
+ expect(() => IssueStatusSchema.parse("pending")).toThrow();
38
+ });
39
+ });
40
+ describe("PhaseLogSchema", () => {
41
+ const validPhaseLog = {
42
+ phase: "spec",
43
+ issueNumber: 123,
44
+ startTime: "2024-01-01T10:00:00.000Z",
45
+ endTime: "2024-01-01T10:05:00.000Z",
46
+ durationSeconds: 300,
47
+ status: "success",
48
+ };
49
+ it("accepts valid phase log", () => {
50
+ expect(() => PhaseLogSchema.parse(validPhaseLog)).not.toThrow();
51
+ });
52
+ it("accepts phase log with optional fields", () => {
53
+ const withOptionals = {
54
+ ...validPhaseLog,
55
+ error: "Something went wrong",
56
+ iterations: 3,
57
+ filesModified: ["file1.ts", "file2.ts"],
58
+ testsRun: 10,
59
+ testsPassed: 8,
60
+ };
61
+ expect(() => PhaseLogSchema.parse(withOptionals)).not.toThrow();
62
+ });
63
+ it("rejects negative issue number", () => {
64
+ expect(() => PhaseLogSchema.parse({ ...validPhaseLog, issueNumber: -1 })).toThrow();
65
+ });
66
+ it("rejects zero issue number", () => {
67
+ expect(() => PhaseLogSchema.parse({ ...validPhaseLog, issueNumber: 0 })).toThrow();
68
+ });
69
+ it("rejects non-integer issue number", () => {
70
+ expect(() => PhaseLogSchema.parse({ ...validPhaseLog, issueNumber: 1.5 })).toThrow();
71
+ });
72
+ it("rejects negative duration", () => {
73
+ expect(() => PhaseLogSchema.parse({ ...validPhaseLog, durationSeconds: -1 })).toThrow();
74
+ });
75
+ it("accepts zero duration", () => {
76
+ expect(() => PhaseLogSchema.parse({ ...validPhaseLog, durationSeconds: 0 })).not.toThrow();
77
+ });
78
+ it("rejects invalid datetime format", () => {
79
+ expect(() => PhaseLogSchema.parse({ ...validPhaseLog, startTime: "invalid" })).toThrow();
80
+ });
81
+ });
82
+ describe("IssueLogSchema", () => {
83
+ const validPhaseLog = {
84
+ phase: "spec",
85
+ issueNumber: 123,
86
+ startTime: "2024-01-01T10:00:00.000Z",
87
+ endTime: "2024-01-01T10:05:00.000Z",
88
+ durationSeconds: 300,
89
+ status: "success",
90
+ };
91
+ const validIssueLog = {
92
+ issueNumber: 123,
93
+ title: "Test Issue",
94
+ labels: ["bug", "priority-high"],
95
+ status: "success",
96
+ phases: [validPhaseLog],
97
+ totalDurationSeconds: 300,
98
+ };
99
+ it("accepts valid issue log", () => {
100
+ expect(() => IssueLogSchema.parse(validIssueLog)).not.toThrow();
101
+ });
102
+ it("accepts empty labels array", () => {
103
+ expect(() => IssueLogSchema.parse({ ...validIssueLog, labels: [] })).not.toThrow();
104
+ });
105
+ it("accepts empty phases array", () => {
106
+ expect(() => IssueLogSchema.parse({ ...validIssueLog, phases: [] })).not.toThrow();
107
+ });
108
+ it("rejects missing required fields", () => {
109
+ const { title, ...withoutTitle } = validIssueLog;
110
+ expect(() => IssueLogSchema.parse(withoutTitle)).toThrow();
111
+ });
112
+ });
113
+ describe("RunConfigSchema", () => {
114
+ const validConfig = {
115
+ phases: ["spec", "exec", "qa"],
116
+ sequential: false,
117
+ qualityLoop: true,
118
+ maxIterations: 3,
119
+ };
120
+ it("accepts valid config", () => {
121
+ expect(() => RunConfigSchema.parse(validConfig)).not.toThrow();
122
+ });
123
+ it("accepts empty phases array", () => {
124
+ expect(() => RunConfigSchema.parse({ ...validConfig, phases: [] })).not.toThrow();
125
+ });
126
+ it("rejects zero maxIterations", () => {
127
+ expect(() => RunConfigSchema.parse({ ...validConfig, maxIterations: 0 })).toThrow();
128
+ });
129
+ it("rejects negative maxIterations", () => {
130
+ expect(() => RunConfigSchema.parse({ ...validConfig, maxIterations: -1 })).toThrow();
131
+ });
132
+ });
133
+ describe("RunLogSchema", () => {
134
+ const validRunLog = {
135
+ version: 1,
136
+ runId: "550e8400-e29b-41d4-a716-446655440000",
137
+ startTime: "2024-01-01T10:00:00.000Z",
138
+ endTime: "2024-01-01T10:30:00.000Z",
139
+ config: {
140
+ phases: ["spec", "exec", "qa"],
141
+ sequential: false,
142
+ qualityLoop: false,
143
+ maxIterations: 3,
144
+ },
145
+ issues: [],
146
+ summary: {
147
+ totalIssues: 0,
148
+ passed: 0,
149
+ failed: 0,
150
+ totalDurationSeconds: 1800,
151
+ },
152
+ };
153
+ it("accepts valid run log", () => {
154
+ expect(() => RunLogSchema.parse(validRunLog)).not.toThrow();
155
+ });
156
+ it("rejects invalid version", () => {
157
+ expect(() => RunLogSchema.parse({ ...validRunLog, version: 2 })).toThrow();
158
+ });
159
+ it("rejects invalid UUID", () => {
160
+ expect(() => RunLogSchema.parse({ ...validRunLog, runId: "not-a-uuid" })).toThrow();
161
+ });
162
+ it("validates nested issue logs", () => {
163
+ const withIssues = {
164
+ ...validRunLog,
165
+ issues: [
166
+ {
167
+ issueNumber: 123,
168
+ title: "Test",
169
+ labels: [],
170
+ status: "success",
171
+ phases: [],
172
+ totalDurationSeconds: 100,
173
+ },
174
+ ],
175
+ summary: { ...validRunLog.summary, totalIssues: 1, passed: 1 },
176
+ };
177
+ expect(() => RunLogSchema.parse(withIssues)).not.toThrow();
178
+ });
179
+ });
180
+ });
181
+ describe("LOG_PATHS", () => {
182
+ it("has user path with home directory placeholder", () => {
183
+ expect(LOG_PATHS.user).toBe("~/.sequant/logs");
184
+ });
185
+ it("has project-relative path", () => {
186
+ expect(LOG_PATHS.project).toBe(".sequant/logs");
187
+ });
188
+ });
189
+ describe("generateLogFilename", () => {
190
+ it("generates filename with timestamp and runId", () => {
191
+ const runId = "550e8400-e29b-41d4-a716-446655440000";
192
+ const startTime = new Date("2024-01-15T14:30:45.123Z");
193
+ const filename = generateLogFilename(runId, startTime);
194
+ expect(filename).toBe(`run-2024-01-15T14-30-45-${runId}.json`);
195
+ });
196
+ it("replaces colons and dots in timestamp", () => {
197
+ const runId = "test-uuid";
198
+ const startTime = new Date("2024-12-31T23:59:59.999Z");
199
+ const filename = generateLogFilename(runId, startTime);
200
+ expect(filename).not.toContain(":");
201
+ expect(filename).toMatch(/^run-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}/);
202
+ });
203
+ it("ends with .json extension", () => {
204
+ const filename = generateLogFilename("id", new Date());
205
+ expect(filename).toMatch(/\.json$/);
206
+ });
207
+ });
208
+ describe("createEmptyRunLog", () => {
209
+ const config = {
210
+ phases: ["spec", "exec", "qa"],
211
+ sequential: false,
212
+ qualityLoop: true,
213
+ maxIterations: 3,
214
+ };
215
+ it("creates log with provided config", () => {
216
+ const log = createEmptyRunLog(config);
217
+ expect(log.config).toEqual(config);
218
+ });
219
+ it("generates valid UUID for runId", () => {
220
+ const log = createEmptyRunLog(config);
221
+ // UUID v4 format
222
+ expect(log.runId).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i);
223
+ });
224
+ it("sets version to 1", () => {
225
+ const log = createEmptyRunLog(config);
226
+ expect(log.version).toBe(1);
227
+ });
228
+ it("sets startTime to current time", () => {
229
+ const before = new Date();
230
+ const log = createEmptyRunLog(config);
231
+ const after = new Date();
232
+ const startTime = new Date(log.startTime);
233
+ expect(startTime.getTime()).toBeGreaterThanOrEqual(before.getTime());
234
+ expect(startTime.getTime()).toBeLessThanOrEqual(after.getTime());
235
+ });
236
+ it("initializes empty issues array", () => {
237
+ const log = createEmptyRunLog(config);
238
+ expect(log.issues).toEqual([]);
239
+ });
240
+ it("initializes summary with zeros", () => {
241
+ const log = createEmptyRunLog(config);
242
+ expect(log.summary).toEqual({
243
+ totalIssues: 0,
244
+ passed: 0,
245
+ failed: 0,
246
+ totalDurationSeconds: 0,
247
+ });
248
+ });
249
+ it("does not include endTime", () => {
250
+ const log = createEmptyRunLog(config);
251
+ expect(log).not.toHaveProperty("endTime");
252
+ });
253
+ });
254
+ describe("createPhaseLog", () => {
255
+ it("creates log with provided phase and issue number", () => {
256
+ const log = createPhaseLog("exec", 456);
257
+ expect(log.phase).toBe("exec");
258
+ expect(log.issueNumber).toBe(456);
259
+ });
260
+ it("sets startTime to current time", () => {
261
+ const before = new Date();
262
+ const log = createPhaseLog("spec", 123);
263
+ const after = new Date();
264
+ const startTime = new Date(log.startTime);
265
+ expect(startTime.getTime()).toBeGreaterThanOrEqual(before.getTime());
266
+ expect(startTime.getTime()).toBeLessThanOrEqual(after.getTime());
267
+ });
268
+ it("does not include endTime, durationSeconds, or status", () => {
269
+ const log = createPhaseLog("qa", 789);
270
+ expect(log).not.toHaveProperty("endTime");
271
+ expect(log).not.toHaveProperty("durationSeconds");
272
+ expect(log).not.toHaveProperty("status");
273
+ });
274
+ });
275
+ describe("completePhaseLog", () => {
276
+ let partialLog;
277
+ beforeEach(() => {
278
+ // Create a phase log with a known start time
279
+ vi.useFakeTimers();
280
+ vi.setSystemTime(new Date("2024-01-01T10:00:00.000Z"));
281
+ partialLog = createPhaseLog("exec", 123);
282
+ });
283
+ afterEach(() => {
284
+ vi.useRealTimers();
285
+ });
286
+ it("adds endTime, durationSeconds, and status", () => {
287
+ vi.setSystemTime(new Date("2024-01-01T10:05:00.000Z"));
288
+ const completed = completePhaseLog(partialLog, "success");
289
+ expect(completed.endTime).toBe("2024-01-01T10:05:00.000Z");
290
+ expect(completed.durationSeconds).toBe(300); // 5 minutes
291
+ expect(completed.status).toBe("success");
292
+ });
293
+ it("calculates duration correctly", () => {
294
+ vi.setSystemTime(new Date("2024-01-01T10:00:30.500Z"));
295
+ const completed = completePhaseLog(partialLog, "success");
296
+ expect(completed.durationSeconds).toBe(30.5);
297
+ });
298
+ it("preserves original fields", () => {
299
+ vi.setSystemTime(new Date("2024-01-01T10:01:00.000Z"));
300
+ const completed = completePhaseLog(partialLog, "failure");
301
+ expect(completed.phase).toBe("exec");
302
+ expect(completed.issueNumber).toBe(123);
303
+ expect(completed.startTime).toBe("2024-01-01T10:00:00.000Z");
304
+ });
305
+ it("adds optional error field", () => {
306
+ vi.setSystemTime(new Date("2024-01-01T10:01:00.000Z"));
307
+ const completed = completePhaseLog(partialLog, "failure", {
308
+ error: "Build failed",
309
+ });
310
+ expect(completed.error).toBe("Build failed");
311
+ });
312
+ it("adds optional iterations field", () => {
313
+ vi.setSystemTime(new Date("2024-01-01T10:01:00.000Z"));
314
+ const completed = completePhaseLog(partialLog, "success", {
315
+ iterations: 3,
316
+ });
317
+ expect(completed.iterations).toBe(3);
318
+ });
319
+ it("adds optional filesModified field", () => {
320
+ vi.setSystemTime(new Date("2024-01-01T10:01:00.000Z"));
321
+ const completed = completePhaseLog(partialLog, "success", {
322
+ filesModified: ["src/index.ts", "src/utils.ts"],
323
+ });
324
+ expect(completed.filesModified).toEqual(["src/index.ts", "src/utils.ts"]);
325
+ });
326
+ it("adds optional test count fields", () => {
327
+ vi.setSystemTime(new Date("2024-01-01T10:01:00.000Z"));
328
+ const completed = completePhaseLog(partialLog, "success", {
329
+ testsRun: 50,
330
+ testsPassed: 48,
331
+ });
332
+ expect(completed.testsRun).toBe(50);
333
+ expect(completed.testsPassed).toBe(48);
334
+ });
335
+ it("handles all optional fields together", () => {
336
+ vi.setSystemTime(new Date("2024-01-01T10:01:00.000Z"));
337
+ const completed = completePhaseLog(partialLog, "failure", {
338
+ error: "2 tests failed",
339
+ iterations: 2,
340
+ filesModified: ["test.ts"],
341
+ testsRun: 10,
342
+ testsPassed: 8,
343
+ });
344
+ expect(completed.error).toBe("2 tests failed");
345
+ expect(completed.iterations).toBe(2);
346
+ expect(completed.filesModified).toEqual(["test.ts"]);
347
+ expect(completed.testsRun).toBe(10);
348
+ expect(completed.testsPassed).toBe(8);
349
+ });
350
+ });
351
+ describe("finalizeRunLog", () => {
352
+ const config = {
353
+ phases: ["spec", "exec", "qa"],
354
+ sequential: false,
355
+ qualityLoop: false,
356
+ maxIterations: 3,
357
+ };
358
+ let partialRunLog;
359
+ beforeEach(() => {
360
+ vi.useFakeTimers();
361
+ vi.setSystemTime(new Date("2024-01-01T10:00:00.000Z"));
362
+ const emptyLog = createEmptyRunLog(config);
363
+ partialRunLog = {
364
+ ...emptyLog,
365
+ issues: [],
366
+ };
367
+ });
368
+ afterEach(() => {
369
+ vi.useRealTimers();
370
+ });
371
+ it("adds endTime", () => {
372
+ vi.setSystemTime(new Date("2024-01-01T10:30:00.000Z"));
373
+ const finalized = finalizeRunLog(partialRunLog);
374
+ expect(finalized.endTime).toBe("2024-01-01T10:30:00.000Z");
375
+ });
376
+ it("calculates totalDurationSeconds", () => {
377
+ vi.setSystemTime(new Date("2024-01-01T10:30:00.000Z"));
378
+ const finalized = finalizeRunLog(partialRunLog);
379
+ expect(finalized.summary.totalDurationSeconds).toBe(1800); // 30 minutes
380
+ });
381
+ it("counts passed issues correctly", () => {
382
+ partialRunLog.issues = [
383
+ createMockIssueLog(1, "success"),
384
+ createMockIssueLog(2, "success"),
385
+ createMockIssueLog(3, "failure"),
386
+ ];
387
+ vi.setSystemTime(new Date("2024-01-01T10:30:00.000Z"));
388
+ const finalized = finalizeRunLog(partialRunLog);
389
+ expect(finalized.summary.passed).toBe(2);
390
+ });
391
+ it("counts failed issues correctly", () => {
392
+ partialRunLog.issues = [
393
+ createMockIssueLog(1, "success"),
394
+ createMockIssueLog(2, "failure"),
395
+ createMockIssueLog(3, "failure"),
396
+ ];
397
+ vi.setSystemTime(new Date("2024-01-01T10:30:00.000Z"));
398
+ const finalized = finalizeRunLog(partialRunLog);
399
+ expect(finalized.summary.failed).toBe(2);
400
+ });
401
+ it("counts partial status as neither passed nor failed", () => {
402
+ partialRunLog.issues = [
403
+ createMockIssueLog(1, "success"),
404
+ createMockIssueLog(2, "partial"),
405
+ createMockIssueLog(3, "failure"),
406
+ ];
407
+ vi.setSystemTime(new Date("2024-01-01T10:30:00.000Z"));
408
+ const finalized = finalizeRunLog(partialRunLog);
409
+ expect(finalized.summary.passed).toBe(1);
410
+ expect(finalized.summary.failed).toBe(1);
411
+ expect(finalized.summary.totalIssues).toBe(3);
412
+ });
413
+ it("sets totalIssues from issues array length", () => {
414
+ partialRunLog.issues = [
415
+ createMockIssueLog(1, "success"),
416
+ createMockIssueLog(2, "success"),
417
+ ];
418
+ vi.setSystemTime(new Date("2024-01-01T10:30:00.000Z"));
419
+ const finalized = finalizeRunLog(partialRunLog);
420
+ expect(finalized.summary.totalIssues).toBe(2);
421
+ });
422
+ it("handles empty issues array", () => {
423
+ vi.setSystemTime(new Date("2024-01-01T10:30:00.000Z"));
424
+ const finalized = finalizeRunLog(partialRunLog);
425
+ expect(finalized.summary.totalIssues).toBe(0);
426
+ expect(finalized.summary.passed).toBe(0);
427
+ expect(finalized.summary.failed).toBe(0);
428
+ });
429
+ it("preserves original fields", () => {
430
+ vi.setSystemTime(new Date("2024-01-01T10:30:00.000Z"));
431
+ const finalized = finalizeRunLog(partialRunLog);
432
+ expect(finalized.version).toBe(1);
433
+ expect(finalized.runId).toBe(partialRunLog.runId);
434
+ expect(finalized.startTime).toBe(partialRunLog.startTime);
435
+ expect(finalized.config).toEqual(config);
436
+ });
437
+ it("produces valid RunLog according to schema", () => {
438
+ partialRunLog.issues = [createMockIssueLog(1, "success")];
439
+ vi.setSystemTime(new Date("2024-01-01T10:30:00.000Z"));
440
+ const finalized = finalizeRunLog(partialRunLog);
441
+ expect(() => RunLogSchema.parse(finalized)).not.toThrow();
442
+ });
443
+ });
444
+ // Helper function for tests
445
+ function createMockIssueLog(issueNumber, status) {
446
+ return {
447
+ issueNumber,
448
+ title: `Issue #${issueNumber}`,
449
+ labels: [],
450
+ status,
451
+ phases: [],
452
+ totalDurationSeconds: 100,
453
+ };
454
+ }
455
+ //# sourceMappingURL=run-log-schema.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-log-schema.test.js","sourceRoot":"","sources":["../../../../src/lib/workflow/run-log-schema.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sequant",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "description": "Quantize your development workflow - Sequential AI phases with quality gates",
5
5
  "type": "module",
6
6
  "bin": {
@@ -53,11 +53,13 @@
53
53
  "node": ">=18.0.0"
54
54
  },
55
55
  "dependencies": {
56
+ "@anthropic-ai/claude-agent-sdk": "^0.2.1",
56
57
  "chalk": "^5.3.0",
57
58
  "commander": "^12.1.0",
58
59
  "diff": "^7.0.0",
59
60
  "inquirer": "^12.3.2",
60
- "yaml": "^2.7.0"
61
+ "yaml": "^2.7.0",
62
+ "zod": "^4.3.5"
61
63
  },
62
64
  "devDependencies": {
63
65
  "@types/diff": "^7.0.0",
@@ -199,8 +199,20 @@ fi
199
199
  # Skips for --amend since amending doesn't require new changes
200
200
  if [[ "$TOOL_NAME" == "Bash" ]] && echo "$TOOL_INPUT" | grep -qE 'git commit'; then
201
201
  if ! echo "$TOOL_INPUT" | grep -qE -- '--amend|--allow-empty'; then
202
- # Check for changes (staged or unstaged)
203
- CHANGES=$(git status --porcelain 2>/dev/null | wc -l | tr -d ' ')
202
+ # Extract target directory from cd command if present (for worktree commits)
203
+ # Handles: "cd /path && git commit" or "cd /path; git commit"
204
+ TARGET_DIR=""
205
+ if echo "$TOOL_INPUT" | grep -qE '^cd [^;&|]+'; then
206
+ TARGET_DIR=$(echo "$TOOL_INPUT" | grep -oE '^cd [^;&|]+' | head -1 | sed 's/^cd //' | tr -d ' ')
207
+ fi
208
+
209
+ # Check for changes in the target directory (or current if no cd)
210
+ if [[ -n "$TARGET_DIR" && -d "$TARGET_DIR" ]]; then
211
+ CHANGES=$(cd "$TARGET_DIR" && git status --porcelain 2>/dev/null | wc -l | tr -d ' ')
212
+ else
213
+ CHANGES=$(git status --porcelain 2>/dev/null | wc -l | tr -d ' ')
214
+ fi
215
+
204
216
  if [[ "$CHANGES" -eq 0 ]]; then
205
217
  echo "HOOK_BLOCKED: No changes to commit. Stage files with 'git add' first." | tee -a /tmp/claude-hook.log >&2
206
218
  exit 2
@@ -68,11 +68,33 @@ git push origin --delete "$BRANCH_NAME" 2>/dev/null || true
68
68
  # Update main
69
69
  echo -e "${BLUE}📥 Updating main branch...${NC}"
70
70
  git checkout main
71
- git pull origin main
71
+ git fetch origin main
72
+
73
+ # Handle divergent branches gracefully
74
+ if ! git merge-base --is-ancestor HEAD origin/main 2>/dev/null; then
75
+ # Local is behind or diverged - fast-forward or rebase
76
+ if git merge-base --is-ancestor origin/main HEAD 2>/dev/null; then
77
+ # Local is ahead - nothing to do
78
+ echo -e "${BLUE} Local main is ahead of origin${NC}"
79
+ else
80
+ # Diverged or behind - try fast-forward first
81
+ if ! git pull --ff-only origin main 2>/dev/null; then
82
+ echo -e "${YELLOW} Divergent branches detected, rebasing...${NC}"
83
+ git rebase origin/main
84
+ fi
85
+ fi
86
+ else
87
+ git pull --ff-only origin main 2>/dev/null || true
88
+ fi
72
89
 
73
90
  echo ""
74
91
  echo -e "${GREEN}✅ Cleanup complete!${NC}"
75
92
  echo ""
93
+
94
+ # Reminder for new dependencies
95
+ echo -e "${YELLOW}💡 Tip: If new dependencies were added, run: npm install${NC}"
96
+ echo ""
97
+
76
98
  echo -e "${BLUE}🗂️ Remaining worktrees:${NC}"
77
99
  git worktree list
78
100
  echo ""
@@ -426,3 +426,18 @@ After providing the assessment, briefly note:
426
426
  - Keep the assessment concise - aim for clarity, not exhaustiveness
427
427
  - When in doubt about phase, say so - better to acknowledge uncertainty
428
428
  - Use this to orient yourself, then proceed with the appropriate workflow command
429
+
430
+ ---
431
+
432
+ ## Output Verification
433
+
434
+ **Before responding, verify your output includes ALL of these:**
435
+
436
+ - [ ] **Issue Summary** - Issue number, title, status, last activity, phase
437
+ - [ ] **AC Coverage** - Each AC marked MET/IN_PROGRESS/NOT_STARTED/UNCLEAR
438
+ - [ ] **Artifacts Found** - Planning, implementation, and QA artifacts listed
439
+ - [ ] **Blockers & Issues** - Any blockers or staleness identified
440
+ - [ ] **Recommendation** - Specific next command to run with rationale
441
+ - [ ] **Confidence Level** - High/Medium/Low with information gaps noted
442
+
443
+ **DO NOT respond until all items are verified.**
@@ -194,3 +194,18 @@ Next cleanup recommended: [date + 30 days]
194
194
  ## BEGIN EXECUTION
195
195
 
196
196
  Execute the cleanup following the steps above. Be thorough but safe - when in doubt, skip a file rather than risk breaking something.
197
+
198
+ ---
199
+
200
+ ## Output Verification
201
+
202
+ **Before responding, verify your output includes ALL of these:**
203
+
204
+ - [ ] **Pre-flight Results** - Branch check, build verification passed
205
+ - [ ] **Cleanup Manifest** - List of files to be archived/removed
206
+ - [ ] **Archive Summary** - Count of files archived by category
207
+ - [ ] **Build Verification** - Post-cleanup build/lint passed
208
+ - [ ] **Commit Details** - Commit hash and push confirmation
209
+ - [ ] **Next Cleanup Date** - Recommended date for next cleanup
210
+
211
+ **DO NOT respond until all items are verified.**
@@ -319,3 +319,19 @@ For Issue #180 (City Configuration UI):
319
319
 
320
320
  *Generated for Issue #180 on 2025-11-25*
321
321
  ```
322
+
323
+ ---
324
+
325
+ ## Output Verification
326
+
327
+ **Before responding, verify your output includes ALL of these:**
328
+
329
+ - [ ] **Documentation File** - Created in correct directory (docs/admin/ or docs/features/)
330
+ - [ ] **Quick Start Section** - 1-2 sentence summary
331
+ - [ ] **Access Section** - URL, menu path, permissions
332
+ - [ ] **Usage Section** - Step-by-step workflows
333
+ - [ ] **Options Table** - Settings with descriptions and defaults
334
+ - [ ] **Troubleshooting** - At least 1-2 common issues
335
+ - [ ] **GitHub Comment** - Summary posted to issue
336
+
337
+ **DO NOT respond until all items are verified.**