sequant 1.1.1 → 1.1.3
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 +11 -4
- package/dist/bin/cli.js.map +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +38 -2
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/init.test.js +37 -1
- package/dist/src/commands/init.test.js.map +1 -1
- 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 +549 -102
- 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 +66 -2
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/lib/config.d.ts +19 -0
- package/dist/src/lib/config.d.ts.map +1 -0
- package/dist/src/lib/config.js +31 -0
- package/dist/src/lib/config.js.map +1 -0
- package/dist/src/lib/settings.d.ts +69 -0
- package/dist/src/lib/settings.d.ts.map +1 -0
- package/dist/src/lib/settings.js +79 -0
- package/dist/src/lib/settings.js.map +1 -0
- package/dist/src/lib/stacks.d.ts +1 -0
- package/dist/src/lib/stacks.d.ts.map +1 -1
- package/dist/src/lib/stacks.js +6 -0
- package/dist/src/lib/stacks.js.map +1 -1
- package/dist/src/lib/templates.d.ts +5 -1
- package/dist/src/lib/templates.d.ts.map +1 -1
- package/dist/src/lib/templates.js +3 -2
- package/dist/src/lib/templates.js.map +1 -1
- 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.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/dist/src/lib/workflow/types.d.ts +2 -0
- package/dist/src/lib/workflow/types.d.ts.map +1 -1
- package/package.json +2 -1
- package/templates/hooks/pre-tool.sh +14 -2
- package/templates/scripts/cleanup-worktree.sh +23 -1
- package/templates/skills/exec/SKILL.md +18 -0
- package/templates/skills/fullsolve/SKILL.md +26 -0
- package/templates/skills/solve/SKILL.md +27 -11
- package/templates/skills/spec/SKILL.md +30 -2
|
@@ -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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"}
|
|
@@ -46,6 +46,8 @@ export interface PhaseResult {
|
|
|
46
46
|
success: boolean;
|
|
47
47
|
durationSeconds?: number;
|
|
48
48
|
error?: string;
|
|
49
|
+
/** Captured output from the phase (used for parsing spec recommendations) */
|
|
50
|
+
output?: string;
|
|
49
51
|
}
|
|
50
52
|
/**
|
|
51
53
|
* Result of executing all phases for an issue
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/lib/workflow/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,EAA2B,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wBAAwB;IACxB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,8BAA8B;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,4CAA4C;IAC5C,aAAa,EAAE,OAAO,CAAC;IACvB,qBAAqB;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,mCAAmC;IACnC,YAAY,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,eAW5B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/lib/workflow/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,EAA2B,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wBAAwB;IACxB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,8BAA8B;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,4CAA4C;IAC5C,aAAa,EAAE,OAAO,CAAC;IACvB,qBAAqB;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,mCAAmC;IACnC,YAAY,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,eAW5B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;CAClB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sequant",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.3",
|
|
4
4
|
"description": "Quantize your development workflow - Sequential AI phases with quality gates",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -53,6 +53,7 @@
|
|
|
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",
|
|
@@ -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 ""
|
|
@@ -65,6 +65,24 @@ Invocation:
|
|
|
65
65
|
- `/exec <freeform description>`:
|
|
66
66
|
- Treat the text as a lightweight description + AC if no issue context is available.
|
|
67
67
|
|
|
68
|
+
### 0. Pre-flight Check (After Context Restoration)
|
|
69
|
+
|
|
70
|
+
**CRITICAL:** If continuing from a restored/summarized conversation, verify git state first:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
# Check current state - are we in a worktree or main repo?
|
|
74
|
+
pwd
|
|
75
|
+
git log --oneline -3 --stat
|
|
76
|
+
|
|
77
|
+
# Check for existing PRs or branches for this issue
|
|
78
|
+
gh pr list --search "<issue-number>"
|
|
79
|
+
git branch -a | grep -i "<issue-number>"
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Why this matters:** After context restoration, PRs may have merged, branches may have changed, or work may already be complete. Always verify before creating duplicate work.
|
|
83
|
+
|
|
84
|
+
**If PR already merged:** The issue may be complete - verify and close if so.
|
|
85
|
+
|
|
68
86
|
### 1. Check Implementation Readiness
|
|
69
87
|
|
|
70
88
|
**FIRST STEP:** Review the issue readiness and proceed with implementation.
|
|
@@ -90,6 +90,32 @@ When invoked as `/fullsolve <issue-number>`, execute the complete issue resoluti
|
|
|
90
90
|
/fullsolve 218 --max-iterations 5 # Override max fix iterations
|
|
91
91
|
```
|
|
92
92
|
|
|
93
|
+
## Phase 0: Pre-flight Checks
|
|
94
|
+
|
|
95
|
+
**CRITICAL after context restoration:** Before starting any work, verify the current git state to avoid duplicate work.
|
|
96
|
+
|
|
97
|
+
### 0.1 Git State Verification
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# Check current branch and recent commits
|
|
101
|
+
git log --oneline -5 --stat
|
|
102
|
+
|
|
103
|
+
# Check for any existing work on this issue
|
|
104
|
+
git branch -a | grep -i "<issue-number>"
|
|
105
|
+
gh pr list --search "<issue-number>"
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**Why this matters:** After context restoration from a summarized conversation, the git state may have changed (PRs merged, rebases, etc.). Always verify what's already been done before creating files or making changes.
|
|
109
|
+
|
|
110
|
+
### 0.2 Existing Work Detection
|
|
111
|
+
|
|
112
|
+
Before creating any files, check if they already exist:
|
|
113
|
+
- Look for test files: `ls -la src/**/*.test.ts`
|
|
114
|
+
- Check recent commits for relevant changes
|
|
115
|
+
- Verify PR status if one was mentioned in context
|
|
116
|
+
|
|
117
|
+
**If work already exists:** Skip to the appropriate phase (e.g., if implementation is done, go to Phase 3 or 4).
|
|
118
|
+
|
|
93
119
|
## Phase 1: Planning (SPEC)
|
|
94
120
|
|
|
95
121
|
Execute the planning phase inline (not as separate command):
|