sequant 1.1.1 → 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.
@@ -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.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,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
- # 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 ""
@@ -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):