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.
- package/dist/bin/cli.js +21 -3
- package/dist/bin/cli.js.map +1 -1
- package/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +1 -25
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/doctor.test.js +28 -97
- package/dist/src/commands/doctor.test.js.map +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +3 -27
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/init.test.js +32 -75
- package/dist/src/commands/init.test.js.map +1 -1
- package/dist/src/commands/logs.d.ts +18 -0
- package/dist/src/commands/logs.d.ts.map +1 -0
- package/dist/src/commands/logs.js +188 -0
- package/dist/src/commands/logs.js.map +1 -0
- package/dist/src/commands/run.d.ts +10 -1
- package/dist/src/commands/run.d.ts.map +1 -1
- package/dist/src/commands/run.js +429 -98
- package/dist/src/commands/run.js.map +1 -1
- package/dist/src/commands/update.d.ts.map +1 -1
- package/dist/src/commands/update.js +16 -0
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/lib/system.d.ts +16 -0
- package/dist/src/lib/system.d.ts.map +1 -0
- package/dist/src/lib/system.js +52 -0
- package/dist/src/lib/system.js.map +1 -0
- package/dist/src/lib/system.test.d.ts +2 -0
- package/dist/src/lib/system.test.d.ts.map +1 -0
- package/dist/src/lib/system.test.js +80 -0
- package/dist/src/lib/system.test.js.map +1 -0
- package/dist/src/lib/workflow/log-writer.d.ts +83 -0
- package/dist/src/lib/workflow/log-writer.d.ts.map +1 -0
- package/dist/src/lib/workflow/log-writer.js +193 -0
- package/dist/src/lib/workflow/log-writer.js.map +1 -0
- package/dist/src/lib/workflow/log-writer.test.d.ts +7 -0
- package/dist/src/lib/workflow/log-writer.test.d.ts.map +1 -0
- package/dist/src/lib/workflow/log-writer.test.js +451 -0
- package/dist/src/lib/workflow/log-writer.test.js.map +1 -0
- package/dist/src/lib/workflow/run-log-schema.d.ts +261 -0
- package/dist/src/lib/workflow/run-log-schema.d.ts.map +1 -0
- package/dist/src/lib/workflow/run-log-schema.js +234 -0
- package/dist/src/lib/workflow/run-log-schema.js.map +1 -0
- package/dist/src/lib/workflow/run-log-schema.test.d.ts +2 -0
- package/dist/src/lib/workflow/run-log-schema.test.d.ts.map +1 -0
- package/dist/src/lib/workflow/run-log-schema.test.js +455 -0
- package/dist/src/lib/workflow/run-log-schema.test.js.map +1 -0
- package/package.json +4 -2
- package/templates/hooks/pre-tool.sh +14 -2
- package/templates/scripts/cleanup-worktree.sh +23 -1
- package/templates/skills/assess/SKILL.md +15 -0
- package/templates/skills/clean/SKILL.md +15 -0
- package/templates/skills/docs/SKILL.md +16 -0
- package/templates/skills/exec/SKILL.md +32 -0
- package/templates/skills/fullsolve/SKILL.md +42 -0
- package/templates/skills/loop/SKILL.md +14 -0
- package/templates/skills/qa/SKILL.md +67 -0
- package/templates/skills/reflect/SKILL.md +14 -0
- package/templates/skills/security-review/SKILL.md +15 -0
- package/templates/skills/solve/SKILL.md +44 -0
- package/templates/skills/spec/SKILL.md +59 -0
- package/templates/skills/test/SKILL.md +14 -0
- package/templates/skills/testgen/SKILL.md +15 -0
- 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.
|
|
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
|
-
#
|
|
203
|
-
|
|
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
|
|
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.**
|