gsd-pi 2.60.0-dev.2580e65 → 2.60.0-dev.d9052f5
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/resources/extensions/ask-user-questions.js +4 -7
- package/dist/resources/extensions/gsd/auto/phases.js +7 -15
- package/dist/resources/extensions/gsd/auto-dashboard.js +8 -21
- package/dist/resources/extensions/gsd/auto-dispatch.js +3 -6
- package/dist/resources/extensions/gsd/auto-model-selection.js +9 -58
- package/dist/resources/extensions/gsd/auto-post-unit.js +2 -3
- package/dist/resources/extensions/gsd/auto-prompts.js +20 -36
- package/dist/resources/extensions/gsd/auto-recovery.js +18 -37
- package/dist/resources/extensions/gsd/auto-start.js +5 -9
- package/dist/resources/extensions/gsd/auto-timers.js +5 -11
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +3 -5
- package/dist/resources/extensions/gsd/auto-verification.js +2 -3
- package/dist/resources/extensions/gsd/auto-worktree.js +55 -120
- package/dist/resources/extensions/gsd/auto.js +17 -39
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -6
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +10 -4
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +1 -2
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +0 -7
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +10 -11
- package/dist/resources/extensions/gsd/commands/catalog.js +0 -2
- package/dist/resources/extensions/gsd/commands-codebase.js +21 -48
- package/dist/resources/extensions/gsd/commands-inspect.js +1 -2
- package/dist/resources/extensions/gsd/commands-maintenance.js +19 -32
- package/dist/resources/extensions/gsd/complexity-classifier.js +4 -8
- package/dist/resources/extensions/gsd/custom-verification.js +2 -3
- package/dist/resources/extensions/gsd/gsd-db.js +13 -33
- package/dist/resources/extensions/gsd/guided-flow.js +9 -19
- package/dist/resources/extensions/gsd/init-wizard.js +0 -12
- package/dist/resources/extensions/gsd/markdown-renderer.js +9 -11
- package/dist/resources/extensions/gsd/md-importer.js +4 -5
- package/dist/resources/extensions/gsd/milestone-actions.js +2 -3
- package/dist/resources/extensions/gsd/milestone-ids.js +1 -2
- package/dist/resources/extensions/gsd/model-router.js +121 -156
- package/dist/resources/extensions/gsd/parallel-merge.js +3 -5
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +14 -26
- package/dist/resources/extensions/gsd/preferences-types.js +0 -1
- package/dist/resources/extensions/gsd/preferences-validation.js +0 -45
- package/dist/resources/extensions/gsd/preferences.js +3 -15
- package/dist/resources/extensions/gsd/prompt-loader.js +2 -3
- package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/dist/resources/extensions/gsd/rule-registry.js +6 -7
- package/dist/resources/extensions/gsd/safe-fs.js +8 -6
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +2 -3
- package/dist/resources/extensions/gsd/tools/complete-slice.js +2 -3
- package/dist/resources/extensions/gsd/tools/complete-task.js +2 -3
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +2 -3
- package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -3
- package/dist/resources/extensions/gsd/tools/plan-task.js +1 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +4 -4
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +1 -2
- package/dist/resources/extensions/gsd/tools/reopen-task.js +1 -2
- package/dist/resources/extensions/gsd/tools/replan-slice.js +1 -2
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +1 -2
- package/dist/resources/extensions/gsd/triage-resolution.js +4 -11
- package/dist/resources/extensions/gsd/workflow-events.js +1 -2
- package/dist/resources/extensions/gsd/workflow-logger.js +4 -37
- package/dist/resources/extensions/gsd/workflow-migration.js +12 -14
- package/dist/resources/extensions/gsd/workflow-projections.js +2 -2
- package/dist/resources/extensions/gsd/workflow-reconcile.js +2 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +14 -26
- package/dist/resources/extensions/shared/interview-ui.js +1 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +19 -19
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +19 -19
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +0 -5
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +1 -2
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +0 -16
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +0 -26
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/config.js +1 -6
- package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/defaults.json +2 -2
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +0 -6
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +0 -19
- package/packages/pi-coding-agent/src/core/extensions/types.ts +0 -26
- package/packages/pi-coding-agent/src/core/lsp/config.ts +1 -7
- package/packages/pi-coding-agent/src/core/lsp/defaults.json +2 -2
- package/src/resources/extensions/ask-user-questions.ts +3 -7
- package/src/resources/extensions/gsd/auto/phases.ts +7 -17
- package/src/resources/extensions/gsd/auto-dashboard.ts +8 -22
- package/src/resources/extensions/gsd/auto-dispatch.ts +3 -7
- package/src/resources/extensions/gsd/auto-model-selection.ts +15 -77
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -4
- package/src/resources/extensions/gsd/auto-prompts.ts +20 -37
- package/src/resources/extensions/gsd/auto-recovery.ts +18 -38
- package/src/resources/extensions/gsd/auto-start.ts +9 -10
- package/src/resources/extensions/gsd/auto-timers.ts +5 -12
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +2 -6
- package/src/resources/extensions/gsd/auto-verification.ts +6 -3
- package/src/resources/extensions/gsd/auto-worktree.ts +55 -121
- package/src/resources/extensions/gsd/auto.ts +17 -40
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -4
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +16 -4
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +1 -2
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +0 -8
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +10 -11
- package/src/resources/extensions/gsd/commands/catalog.ts +0 -2
- package/src/resources/extensions/gsd/commands-codebase.ts +20 -52
- package/src/resources/extensions/gsd/commands-inspect.ts +1 -2
- package/src/resources/extensions/gsd/commands-maintenance.ts +19 -28
- package/src/resources/extensions/gsd/complexity-classifier.ts +4 -9
- package/src/resources/extensions/gsd/custom-verification.ts +2 -3
- package/src/resources/extensions/gsd/gsd-db.ts +14 -12
- package/src/resources/extensions/gsd/guided-flow.ts +8 -9
- package/src/resources/extensions/gsd/init-wizard.ts +0 -12
- package/src/resources/extensions/gsd/markdown-renderer.ts +17 -11
- package/src/resources/extensions/gsd/md-importer.ts +4 -5
- package/src/resources/extensions/gsd/milestone-actions.ts +2 -3
- package/src/resources/extensions/gsd/milestone-ids.ts +1 -2
- package/src/resources/extensions/gsd/model-router.ts +173 -199
- package/src/resources/extensions/gsd/parallel-merge.ts +3 -5
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +14 -18
- package/src/resources/extensions/gsd/preferences-types.ts +0 -13
- package/src/resources/extensions/gsd/preferences-validation.ts +0 -45
- package/src/resources/extensions/gsd/preferences.ts +3 -16
- package/src/resources/extensions/gsd/prompt-loader.ts +2 -3
- package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/src/resources/extensions/gsd/rule-registry.ts +6 -7
- package/src/resources/extensions/gsd/safe-fs.ts +5 -6
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +0 -63
- package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +2 -27
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/model-router.test.ts +3 -403
- package/src/resources/extensions/gsd/tests/preferences.test.ts +0 -62
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +0 -21
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +6 -6
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +6 -3
- package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -3
- package/src/resources/extensions/gsd/tools/complete-task.ts +6 -3
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +6 -3
- package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -3
- package/src/resources/extensions/gsd/tools/plan-task.ts +3 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +6 -4
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +3 -2
- package/src/resources/extensions/gsd/tools/reopen-task.ts +3 -2
- package/src/resources/extensions/gsd/tools/replan-slice.ts +3 -2
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +3 -2
- package/src/resources/extensions/gsd/triage-resolution.ts +4 -11
- package/src/resources/extensions/gsd/types.ts +0 -1
- package/src/resources/extensions/gsd/workflow-events.ts +1 -2
- package/src/resources/extensions/gsd/workflow-logger.ts +5 -52
- package/src/resources/extensions/gsd/workflow-migration.ts +12 -14
- package/src/resources/extensions/gsd/workflow-projections.ts +2 -2
- package/src/resources/extensions/gsd/workflow-reconcile.ts +2 -2
- package/src/resources/extensions/gsd/worktree-manager.ts +14 -16
- package/src/resources/extensions/shared/interview-ui.ts +1 -3
- package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js +0 -47
- package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js.map +0 -1
- package/packages/pi-coding-agent/src/core/lsp/lsp-legacy-alias.test.ts +0 -70
- package/src/resources/extensions/gsd/tests/capability-router.test.ts +0 -347
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +0 -1188
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +0 -841
- package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +0 -284
- package/src/resources/extensions/gsd/tests/workflow-logger-audit.test.ts +0 -120
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +0 -144
- /package/dist/web/standalone/.next/static/{ogyMN7M-3bGGuRY08L5HR → JVkoVYumy0cDhOQISEYdG}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{ogyMN7M-3bGGuRY08L5HR → JVkoVYumy0cDhOQISEYdG}/_ssgManifest.js +0 -0
|
@@ -721,8 +721,6 @@ export async function runGuards(
|
|
|
721
721
|
// ── Stop/Backtrack directive guard (#3487) ──
|
|
722
722
|
// Check for unexecuted stop or backtrack captures BEFORE dispatching any unit.
|
|
723
723
|
// This ensures user "halt" directives are honored immediately.
|
|
724
|
-
// IMPORTANT: Fail-closed — any exception during stop handling still breaks the loop
|
|
725
|
-
// to ensure user halt intent is never silently dropped.
|
|
726
724
|
try {
|
|
727
725
|
const { loadStopCaptures, markCaptureExecuted } = await import("../captures.js");
|
|
728
726
|
const stopCaptures = loadStopCaptures(s.basePath);
|
|
@@ -739,10 +737,12 @@ export async function runGuards(
|
|
|
739
737
|
basename(s.originalBasePath || s.basePath),
|
|
740
738
|
);
|
|
741
739
|
|
|
742
|
-
//
|
|
743
|
-
|
|
740
|
+
// Mark all stop/backtrack captures as executed so they don't re-fire
|
|
741
|
+
for (const cap of stopCaptures) {
|
|
742
|
+
markCaptureExecuted(s.basePath, cap.id);
|
|
743
|
+
}
|
|
744
744
|
|
|
745
|
-
// For backtrack captures, write the backtrack trigger
|
|
745
|
+
// For backtrack captures, write the backtrack trigger before pausing
|
|
746
746
|
if (isBacktrack) {
|
|
747
747
|
try {
|
|
748
748
|
const { executeBacktrack } = await import("../triage-resolution.js");
|
|
@@ -752,19 +752,12 @@ export async function runGuards(
|
|
|
752
752
|
}
|
|
753
753
|
}
|
|
754
754
|
|
|
755
|
-
|
|
756
|
-
for (const cap of stopCaptures) {
|
|
757
|
-
markCaptureExecuted(s.basePath, cap.id);
|
|
758
|
-
}
|
|
759
|
-
|
|
755
|
+
await deps.pauseAuto(ctx, pi);
|
|
760
756
|
debugLog("autoLoop", { phase: "exit", reason: isBacktrack ? "user-backtrack" : "user-stop" });
|
|
761
757
|
return { action: "break", reason: isBacktrack ? "user-backtrack" : "user-stop" };
|
|
762
758
|
}
|
|
763
759
|
} catch (e) {
|
|
764
|
-
// Fail-closed: if anything in the stop guard throws, break the loop
|
|
765
|
-
// rather than silently continuing and dropping user halt intent
|
|
766
760
|
debugLog("guards", { phase: "stop-guard-error", error: String(e) });
|
|
767
|
-
return { action: "break", reason: "stop-guard-error" };
|
|
768
761
|
}
|
|
769
762
|
|
|
770
763
|
// Budget ceiling guard
|
|
@@ -1268,9 +1261,7 @@ export async function runUnitPhase(
|
|
|
1268
1261
|
blockers: [],
|
|
1269
1262
|
nextSteps: [],
|
|
1270
1263
|
});
|
|
1271
|
-
} catch
|
|
1272
|
-
logWarning("engine", `phase anchor failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1273
|
-
}
|
|
1264
|
+
} catch { /* non-fatal — anchor is advisory */ }
|
|
1274
1265
|
}
|
|
1275
1266
|
|
|
1276
1267
|
deps.emitJournalEvent({ ts: new Date().toISOString(), flowId: ic.flowId, seq: ic.nextSeq(), eventType: "unit-end", data: { unitType, unitId, status: unitResult.status, artifactVerified, ...(unitResult.errorContext ? { errorContext: unitResult.errorContext } : {}) }, causedBy: { flowId: ic.flowId, seq: unitStartSeq } });
|
|
@@ -1393,4 +1384,3 @@ export async function runFinalize(
|
|
|
1393
1384
|
|
|
1394
1385
|
return { action: "next", data: undefined as void };
|
|
1395
1386
|
}
|
|
1396
|
-
|
|
@@ -31,7 +31,6 @@ import {
|
|
|
31
31
|
getRtkSessionSavings,
|
|
32
32
|
type RtkSessionSavings,
|
|
33
33
|
} from "../shared/rtk-session-stats.js";
|
|
34
|
-
import { logWarning } from "./workflow-logger.js";
|
|
35
34
|
|
|
36
35
|
// ─── UAT Slice Extraction ─────────────────────────────────────────────────────
|
|
37
36
|
|
|
@@ -286,9 +285,8 @@ export function updateSliceProgressCache(base: string, mid: string, activeSid?:
|
|
|
286
285
|
taskDetails = dbTasks.map(t => ({ id: t.id, title: t.title, done: t.status === "complete" || t.status === "done" }));
|
|
287
286
|
}
|
|
288
287
|
}
|
|
289
|
-
} catch
|
|
288
|
+
} catch {
|
|
290
289
|
// Non-fatal — just omit task count
|
|
291
|
-
logWarning("dashboard", `operation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
292
290
|
}
|
|
293
291
|
}
|
|
294
292
|
|
|
@@ -299,9 +297,8 @@ export function updateSliceProgressCache(base: string, mid: string, activeSid?:
|
|
|
299
297
|
activeSliceTasks,
|
|
300
298
|
taskDetails,
|
|
301
299
|
};
|
|
302
|
-
} catch
|
|
300
|
+
} catch {
|
|
303
301
|
// Non-fatal — widget just won't show progress bar
|
|
304
|
-
logWarning("dashboard", `operation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
305
302
|
}
|
|
306
303
|
}
|
|
307
304
|
|
|
@@ -335,9 +332,8 @@ function refreshLastCommit(basePath: string): void {
|
|
|
335
332
|
};
|
|
336
333
|
}
|
|
337
334
|
lastCommitFetchedAt = Date.now();
|
|
338
|
-
} catch
|
|
335
|
+
} catch {
|
|
339
336
|
// Non-fatal — just skip last commit display
|
|
340
|
-
logWarning("dashboard", `operation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
341
337
|
}
|
|
342
338
|
}
|
|
343
339
|
|
|
@@ -380,9 +376,7 @@ function ensureWidgetModeLoaded(): void {
|
|
|
380
376
|
if (saved && WIDGET_MODES.includes(saved as WidgetMode)) {
|
|
381
377
|
widgetMode = saved as WidgetMode;
|
|
382
378
|
}
|
|
383
|
-
} catch
|
|
384
|
-
logWarning("dashboard", `operation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
385
|
-
}
|
|
379
|
+
} catch { /* non-fatal — use default */ }
|
|
386
380
|
}
|
|
387
381
|
|
|
388
382
|
/** Persist widget mode to global preferences YAML. */
|
|
@@ -401,9 +395,7 @@ function persistWidgetMode(mode: WidgetMode): void {
|
|
|
401
395
|
content = content.trimEnd() + "\n" + line + "\n";
|
|
402
396
|
}
|
|
403
397
|
writeFileSync(prefsPath, content, "utf-8");
|
|
404
|
-
} catch
|
|
405
|
-
logWarning("dashboard", `file write failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
406
|
-
}
|
|
398
|
+
} catch { /* non-fatal — mode still set in memory */ }
|
|
407
399
|
}
|
|
408
400
|
|
|
409
401
|
/** Cycle to the next widget mode. Returns the new mode. */
|
|
@@ -466,9 +458,7 @@ export function updateProgressWidget(
|
|
|
466
458
|
|
|
467
459
|
// Cache git branch at widget creation time (not per render)
|
|
468
460
|
let cachedBranch: string | null = null;
|
|
469
|
-
try { cachedBranch = getCurrentBranch(accessors.getBasePath()); } catch
|
|
470
|
-
logWarning("dashboard", `git branch detection failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
471
|
-
}
|
|
461
|
+
try { cachedBranch = getCurrentBranch(accessors.getBasePath()); } catch { /* not in git repo */ }
|
|
472
462
|
|
|
473
463
|
// Cache short pwd (last 2 path segments only) + worktree/branch info
|
|
474
464
|
let widgetPwd: string;
|
|
@@ -505,8 +495,7 @@ export function updateProgressWidget(
|
|
|
505
495
|
const sessionId = ctx.sessionManager.getSessionId();
|
|
506
496
|
const savings = sessionId ? getRtkSessionSavings(accessors.getBasePath(), sessionId) : null;
|
|
507
497
|
cachedRtkLabel = formatRtkSavingsLabel(savings);
|
|
508
|
-
} catch
|
|
509
|
-
logWarning("dashboard", `RTK savings lookup failed: ${err instanceof Error ? (err as Error).message : String(err)}`);
|
|
498
|
+
} catch {
|
|
510
499
|
cachedRtkLabel = null;
|
|
511
500
|
}
|
|
512
501
|
};
|
|
@@ -530,9 +519,7 @@ export function updateProgressWidget(
|
|
|
530
519
|
}
|
|
531
520
|
refreshRtkLabel();
|
|
532
521
|
cachedLines = undefined;
|
|
533
|
-
} catch
|
|
534
|
-
logWarning("dashboard", `DB status update failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
535
|
-
}
|
|
522
|
+
} catch { /* non-fatal */ }
|
|
536
523
|
}, 15_000);
|
|
537
524
|
|
|
538
525
|
return {
|
|
@@ -891,4 +878,3 @@ function padToWidth(s: string, colWidth: number): string {
|
|
|
891
878
|
if (vis >= colWidth) return truncateToWidth(s, colWidth, "…");
|
|
892
879
|
return s + " ".repeat(colWidth - vis);
|
|
893
880
|
}
|
|
894
|
-
|
|
@@ -28,7 +28,7 @@ import {
|
|
|
28
28
|
buildSliceFileName,
|
|
29
29
|
} from "./paths.js";
|
|
30
30
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
31
|
-
import {
|
|
31
|
+
import { logError } from "./workflow-logger.js";
|
|
32
32
|
import { join } from "node:path";
|
|
33
33
|
import { hasImplementationArtifacts } from "./auto-recovery.js";
|
|
34
34
|
import {
|
|
@@ -712,9 +712,7 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
712
712
|
}
|
|
713
713
|
}
|
|
714
714
|
}
|
|
715
|
-
} catch
|
|
716
|
-
logWarning("dispatch", `verification class check failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
717
|
-
}
|
|
715
|
+
} catch { /* fall through — don't block on DB errors */ }
|
|
718
716
|
|
|
719
717
|
return {
|
|
720
718
|
action: "dispatch",
|
|
@@ -756,9 +754,8 @@ export async function resolveDispatch(
|
|
|
756
754
|
try {
|
|
757
755
|
const registry = getRegistry();
|
|
758
756
|
return await registry.evaluateDispatch(ctx);
|
|
759
|
-
} catch
|
|
757
|
+
} catch {
|
|
760
758
|
// Registry not initialized — fall back to inline loop
|
|
761
|
-
logWarning("dispatch", `registry dispatch failed, falling back to inline rules: ${err instanceof Error ? err.message : String(err)}`);
|
|
762
759
|
}
|
|
763
760
|
|
|
764
761
|
for (const rule of DISPATCH_RULES) {
|
|
@@ -782,4 +779,3 @@ export async function resolveDispatch(
|
|
|
782
779
|
export function getDispatchRuleNames(): string[] {
|
|
783
780
|
return DISPATCH_RULES.map((r) => r.name);
|
|
784
781
|
}
|
|
785
|
-
|
|
@@ -9,8 +9,8 @@ import type { ExtensionAPI, ExtensionContext } from "@gsd/pi-coding-agent";
|
|
|
9
9
|
import type { GSDPreferences } from "./preferences.js";
|
|
10
10
|
import { resolveModelWithFallbacksForUnit, resolveDynamicRoutingConfig } from "./preferences.js";
|
|
11
11
|
import type { ComplexityTier } from "./complexity-classifier.js";
|
|
12
|
-
import { classifyUnitComplexity, tierLabel } from "./complexity-classifier.js";
|
|
13
|
-
import { resolveModelForComplexity, escalateTier
|
|
12
|
+
import { classifyUnitComplexity, tierLabel, extractTaskMetadata } from "./complexity-classifier.js";
|
|
13
|
+
import { resolveModelForComplexity, escalateTier } from "./model-router.js";
|
|
14
14
|
import { getLedger, getProjectTotals } from "./metrics.js";
|
|
15
15
|
import { unitPhaseLabel } from "./auto-dashboard.js";
|
|
16
16
|
|
|
@@ -107,65 +107,15 @@ export async function selectAndApplyModel(
|
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
//
|
|
111
|
-
const
|
|
112
|
-
(
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
// Fire before_model_select hook (ADR-004, D-03)
|
|
116
|
-
// Hook can override model selection entirely by returning { modelId }
|
|
117
|
-
let hookOverride: string | undefined;
|
|
118
|
-
if (routingConfig.hooks !== false) {
|
|
119
|
-
const eligible = getEligibleModels(
|
|
120
|
-
classification.tier,
|
|
121
|
-
availableModelIds,
|
|
122
|
-
routingConfig,
|
|
123
|
-
);
|
|
124
|
-
const hookResult = await pi.emitBeforeModelSelect({
|
|
125
|
-
unitType,
|
|
126
|
-
unitId,
|
|
127
|
-
classification: {
|
|
128
|
-
tier: classification.tier,
|
|
129
|
-
reason: classification.reason,
|
|
130
|
-
downgraded: classification.downgraded,
|
|
131
|
-
},
|
|
132
|
-
taskMetadata: classification.taskMetadata as Record<string, unknown> | undefined,
|
|
133
|
-
eligibleModels: eligible,
|
|
134
|
-
phaseConfig: modelConfig ? {
|
|
135
|
-
primary: modelConfig.primary,
|
|
136
|
-
fallbacks: modelConfig.fallbacks ?? [],
|
|
137
|
-
} : undefined,
|
|
138
|
-
});
|
|
139
|
-
if (hookResult?.modelId) {
|
|
140
|
-
hookOverride = hookResult.modelId;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
110
|
+
// Extract task metadata for capability scoring
|
|
111
|
+
const taskMeta = unitType === "execute-task"
|
|
112
|
+
? extractTaskMetadata(unitId, basePath)
|
|
113
|
+
: undefined;
|
|
143
114
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
modelId: hookOverride,
|
|
149
|
-
fallbacks: [
|
|
150
|
-
...(modelConfig?.fallbacks ?? []).filter(f => f !== hookOverride),
|
|
151
|
-
...(modelConfig?.primary && modelConfig.primary !== hookOverride ? [modelConfig.primary] : []),
|
|
152
|
-
],
|
|
153
|
-
tier: classification.tier,
|
|
154
|
-
wasDowngraded: hookOverride !== modelConfig?.primary,
|
|
155
|
-
reason: `hook override: ${hookOverride}`,
|
|
156
|
-
selectionMethod: "tier-only",
|
|
157
|
-
};
|
|
158
|
-
} else {
|
|
159
|
-
routingResult = resolveModelForComplexity(
|
|
160
|
-
classification,
|
|
161
|
-
modelConfig,
|
|
162
|
-
routingConfig,
|
|
163
|
-
availableModelIds,
|
|
164
|
-
unitType,
|
|
165
|
-
classification.taskMetadata,
|
|
166
|
-
capabilityOverrides,
|
|
167
|
-
);
|
|
168
|
-
}
|
|
115
|
+
const routingResult = resolveModelForComplexity(
|
|
116
|
+
classification, modelConfig, routingConfig, availableModelIds,
|
|
117
|
+
unitType, taskMeta,
|
|
118
|
+
);
|
|
169
119
|
|
|
170
120
|
if (routingResult.wasDowngraded) {
|
|
171
121
|
effectiveModelConfig = {
|
|
@@ -173,23 +123,11 @@ export async function selectAndApplyModel(
|
|
|
173
123
|
fallbacks: routingResult.fallbacks,
|
|
174
124
|
};
|
|
175
125
|
if (verbose) {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
.map(([id, score]) => `${id}: ${score.toFixed(1)}`)
|
|
182
|
-
.join(", ");
|
|
183
|
-
ctx.ui.notify(
|
|
184
|
-
`Dynamic routing [${tierLbl}]: ${routingResult.modelId} (capability-scored) — ${scores}`,
|
|
185
|
-
"info",
|
|
186
|
-
);
|
|
187
|
-
} else {
|
|
188
|
-
ctx.ui.notify(
|
|
189
|
-
`Dynamic routing [${tierLabel(classification.tier)}]: ${routingResult.modelId} (${classification.reason})`,
|
|
190
|
-
"info",
|
|
191
|
-
);
|
|
192
|
-
}
|
|
126
|
+
const method = routingResult.selectionMethod === "capability-scored" ? "capability-scored" : "tier-only";
|
|
127
|
+
ctx.ui.notify(
|
|
128
|
+
`Dynamic routing [${tierLabel(classification.tier)}]: ${routingResult.modelId} (${method} — ${classification.reason})`,
|
|
129
|
+
"info",
|
|
130
|
+
);
|
|
193
131
|
}
|
|
194
132
|
}
|
|
195
133
|
routingTierLabel = ` [${tierLabel(classification.tier)}]`;
|
|
@@ -279,9 +279,8 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
279
279
|
try {
|
|
280
280
|
const { getTaskIssueNumberForCommit } = await import("../github-sync/sync.js");
|
|
281
281
|
ghIssueNumber = getTaskIssueNumberForCommit(s.basePath, mid, sid, tid) ?? undefined;
|
|
282
|
-
} catch
|
|
282
|
+
} catch {
|
|
283
283
|
// GitHub sync not available — skip
|
|
284
|
-
logWarning("engine", `GitHub issue lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
285
284
|
}
|
|
286
285
|
|
|
287
286
|
taskContext = {
|
|
@@ -559,7 +558,9 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
559
558
|
} catch (dbErr) {
|
|
560
559
|
// DB unavailable — fail explicitly rather than silently reverting to markdown mutation.
|
|
561
560
|
// Use 'gsd recover' to rebuild DB state from disk if needed.
|
|
562
|
-
|
|
561
|
+
process.stderr.write(
|
|
562
|
+
`gsd: retry state-reset failed (DB unavailable): ${(dbErr as Error).message}. Run 'gsd recover' to reconcile.\n`,
|
|
563
|
+
);
|
|
563
564
|
}
|
|
564
565
|
}
|
|
565
566
|
|
|
@@ -731,4 +732,3 @@ export async function postUnitPostVerification(pctx: PostUnitContext): Promise<"
|
|
|
731
732
|
|
|
732
733
|
return "continue";
|
|
733
734
|
}
|
|
734
|
-
|
|
@@ -27,7 +27,6 @@ import { computeBudgets, resolveExecutorContextWindow, truncateAtSectionBoundary
|
|
|
27
27
|
import { getPendingGates } from "./gsd-db.js";
|
|
28
28
|
import { formatDecisionsCompact, formatRequirementsCompact } from "./structured-data-formatter.js";
|
|
29
29
|
import { readPhaseAnchor, formatAnchorForPrompt } from "./phase-anchor.js";
|
|
30
|
-
import { logWarning } from "./workflow-logger.js";
|
|
31
30
|
|
|
32
31
|
// ─── Preamble Cap ─────────────────────────────────────────────────────────────
|
|
33
32
|
|
|
@@ -50,8 +49,7 @@ function formatExecutorConstraints(): string {
|
|
|
50
49
|
try {
|
|
51
50
|
const prefs = loadEffectiveGSDPreferences();
|
|
52
51
|
windowTokens = resolveExecutorContextWindow(undefined, prefs?.preferences);
|
|
53
|
-
} catch
|
|
54
|
-
logWarning("prompt", `resolveExecutorContextWindow failed: ${(e as Error).message}`);
|
|
52
|
+
} catch {
|
|
55
53
|
windowTokens = 200_000; // safe default
|
|
56
54
|
}
|
|
57
55
|
const budgets = computeBudgets(windowTokens);
|
|
@@ -200,9 +198,7 @@ export async function inlineDependencySummaries(
|
|
|
200
198
|
}
|
|
201
199
|
// If slice not found in DB, fall through to file-based parsing
|
|
202
200
|
}
|
|
203
|
-
} catch
|
|
204
|
-
logWarning("prompt", `inlineDependencySummaries DB lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
205
|
-
}
|
|
201
|
+
} catch { /* fall through */ }
|
|
206
202
|
|
|
207
203
|
// If DB didn't provide depends, fall back to roadmap parsing
|
|
208
204
|
if (!depends) {
|
|
@@ -280,8 +276,8 @@ export async function inlineDecisionsFromDb(
|
|
|
280
276
|
return `### Decisions\nSource: \`.gsd/DECISIONS.md\`\n\n${formatted}`;
|
|
281
277
|
}
|
|
282
278
|
}
|
|
283
|
-
} catch
|
|
284
|
-
|
|
279
|
+
} catch {
|
|
280
|
+
// DB not available — fall through to filesystem
|
|
285
281
|
}
|
|
286
282
|
return inlineGsdRootFile(base, "decisions.md", "Decisions");
|
|
287
283
|
}
|
|
@@ -307,8 +303,8 @@ export async function inlineRequirementsFromDb(
|
|
|
307
303
|
return `### Requirements\nSource: \`.gsd/REQUIREMENTS.md\`\n\n${formatted}`;
|
|
308
304
|
}
|
|
309
305
|
}
|
|
310
|
-
} catch
|
|
311
|
-
|
|
306
|
+
} catch {
|
|
307
|
+
// DB not available — fall through to filesystem
|
|
312
308
|
}
|
|
313
309
|
return inlineGsdRootFile(base, "requirements.md", "Requirements");
|
|
314
310
|
}
|
|
@@ -329,8 +325,8 @@ export async function inlineProjectFromDb(
|
|
|
329
325
|
return `### Project\nSource: \`.gsd/PROJECT.md\`\n\n${content}`;
|
|
330
326
|
}
|
|
331
327
|
}
|
|
332
|
-
} catch
|
|
333
|
-
|
|
328
|
+
} catch {
|
|
329
|
+
// DB not available — fall through to filesystem
|
|
334
330
|
}
|
|
335
331
|
return inlineGsdRootFile(base, "project.md", "Project");
|
|
336
332
|
}
|
|
@@ -490,8 +486,8 @@ export function buildSkillActivationBlock(params: {
|
|
|
490
486
|
for (const skillName of taskPlan.frontmatter.skills_used) {
|
|
491
487
|
matched.add(normalizeSkillReference(skillName));
|
|
492
488
|
}
|
|
493
|
-
} catch
|
|
494
|
-
|
|
489
|
+
} catch {
|
|
490
|
+
// Non-fatal — malformed task plan should not break prompt construction
|
|
495
491
|
}
|
|
496
492
|
}
|
|
497
493
|
|
|
@@ -740,9 +736,7 @@ export async function checkNeedsReassessment(
|
|
|
740
736
|
return { sliceId: lastCompleted };
|
|
741
737
|
}
|
|
742
738
|
}
|
|
743
|
-
} catch
|
|
744
|
-
logWarning("prompt", `checkNeedsReassessment DB lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
745
|
-
}
|
|
739
|
+
} catch { /* fall through */ }
|
|
746
740
|
|
|
747
741
|
// File-based fallback using roadmap checkboxes
|
|
748
742
|
const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
|
|
@@ -808,9 +802,7 @@ export async function checkNeedsRunUat(
|
|
|
808
802
|
return { sliceId: sid, uatType };
|
|
809
803
|
}
|
|
810
804
|
}
|
|
811
|
-
} catch
|
|
812
|
-
logWarning("prompt", `checkNeedsRunUat DB lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
813
|
-
}
|
|
805
|
+
} catch { /* fall through */ }
|
|
814
806
|
|
|
815
807
|
// File-based fallback using roadmap checkboxes
|
|
816
808
|
if (!prefs?.uat_dispatch) return null;
|
|
@@ -1320,9 +1312,7 @@ export async function buildCompleteMilestonePrompt(
|
|
|
1320
1312
|
if (isDbAvailable()) {
|
|
1321
1313
|
sliceIds = getMilestoneSlices(mid).map(s => s.id);
|
|
1322
1314
|
}
|
|
1323
|
-
} catch
|
|
1324
|
-
logWarning("prompt", `buildCompleteMilestonePrompt DB lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1325
|
-
}
|
|
1315
|
+
} catch { /* fall through */ }
|
|
1326
1316
|
// File-based fallback: parse roadmap for slice IDs when DB has no data
|
|
1327
1317
|
if (sliceIds.length === 0 && roadmapPath) {
|
|
1328
1318
|
const roadmapContent = await loadFile(roadmapPath);
|
|
@@ -1403,9 +1393,7 @@ export async function buildValidateMilestonePrompt(
|
|
|
1403
1393
|
}
|
|
1404
1394
|
}
|
|
1405
1395
|
}
|
|
1406
|
-
} catch
|
|
1407
|
-
logWarning("prompt", `buildValidateMilestonePrompt verification classes lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1408
|
-
}
|
|
1396
|
+
} catch { /* fall through */ }
|
|
1409
1397
|
|
|
1410
1398
|
// Inline all slice summaries and UAT results
|
|
1411
1399
|
let valSliceIds: string[] = [];
|
|
@@ -1414,9 +1402,7 @@ export async function buildValidateMilestonePrompt(
|
|
|
1414
1402
|
if (isDbAvailable()) {
|
|
1415
1403
|
valSliceIds = getMilestoneSlices(mid).map(s => s.id);
|
|
1416
1404
|
}
|
|
1417
|
-
} catch
|
|
1418
|
-
logWarning("prompt", `buildValidateMilestonePrompt slice IDs lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1419
|
-
}
|
|
1405
|
+
} catch { /* fall through */ }
|
|
1420
1406
|
// File-based fallback: parse roadmap for slice IDs when DB has no data
|
|
1421
1407
|
if (valSliceIds.length === 0 && roadmapPath) {
|
|
1422
1408
|
const roadmapContent = await loadFile(roadmapPath);
|
|
@@ -1555,8 +1541,8 @@ export async function buildReplanSlicePrompt(
|
|
|
1555
1541
|
`- **${c.id}**: "${c.text}" — ${c.rationale ?? "no rationale"}`
|
|
1556
1542
|
).join("\n");
|
|
1557
1543
|
}
|
|
1558
|
-
} catch
|
|
1559
|
-
|
|
1544
|
+
} catch {
|
|
1545
|
+
// Non-fatal — captures module may not be available
|
|
1560
1546
|
}
|
|
1561
1547
|
|
|
1562
1548
|
return loadPrompt("replan-slice", {
|
|
@@ -1656,8 +1642,8 @@ export async function buildReassessRoadmapPrompt(
|
|
|
1656
1642
|
`- **${c.id}**: "${c.text}" — ${c.rationale ?? "deferred during triage"}`
|
|
1657
1643
|
).join("\n");
|
|
1658
1644
|
}
|
|
1659
|
-
} catch
|
|
1660
|
-
|
|
1645
|
+
} catch {
|
|
1646
|
+
// Non-fatal — captures module may not be available
|
|
1661
1647
|
}
|
|
1662
1648
|
|
|
1663
1649
|
const reassessCommitInstruction = "Do not commit — .gsd/ planning docs are managed externally and not tracked in git.";
|
|
@@ -1873,9 +1859,7 @@ export async function buildRewriteDocsPrompt(
|
|
|
1873
1859
|
.filter(t => t.status !== "complete" && t.status !== "done")
|
|
1874
1860
|
.map(t => ({ id: t.id }));
|
|
1875
1861
|
}
|
|
1876
|
-
} catch
|
|
1877
|
-
logWarning("prompt", `buildRewriteDocsPrompt DB task lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1878
|
-
}
|
|
1862
|
+
} catch { /* fall through */ }
|
|
1879
1863
|
|
|
1880
1864
|
if (!incompleteTasks) {
|
|
1881
1865
|
// DB unavailable — no task data to inline
|
|
@@ -1927,4 +1911,3 @@ export async function buildRewriteDocsPrompt(
|
|
|
1927
1911
|
overridesPath: relGsdRootFile("OVERRIDES"),
|
|
1928
1912
|
});
|
|
1929
1913
|
}
|
|
1930
|
-
|
|
@@ -15,7 +15,6 @@ import { parseRoadmap as parseLegacyRoadmap, parsePlan as parseLegacyPlan } from
|
|
|
15
15
|
import { isDbAvailable, getTask, getSlice, getSliceTasks, updateTaskStatus } from "./gsd-db.js";
|
|
16
16
|
import { isValidationTerminal } from "./state.js";
|
|
17
17
|
import { getErrorMessage } from "./error-utils.js";
|
|
18
|
-
import { logWarning, logError } from "./workflow-logger.js";
|
|
19
18
|
import {
|
|
20
19
|
nativeConflictFiles,
|
|
21
20
|
nativeCommit,
|
|
@@ -73,8 +72,7 @@ export function hasImplementationArtifacts(basePath: string): boolean {
|
|
|
73
72
|
stdio: ["ignore", "pipe", "pipe"],
|
|
74
73
|
encoding: "utf-8",
|
|
75
74
|
});
|
|
76
|
-
} catch
|
|
77
|
-
logWarning("recovery", `git rev-parse check failed: ${(e as Error).message}`);
|
|
75
|
+
} catch {
|
|
78
76
|
return true;
|
|
79
77
|
}
|
|
80
78
|
|
|
@@ -94,9 +92,8 @@ export function hasImplementationArtifacts(basePath: string): boolean {
|
|
|
94
92
|
// implementation code (#1703).
|
|
95
93
|
const implFiles = changedFiles.filter(f => !f.startsWith(".gsd/") && !f.startsWith(".gsd\\"));
|
|
96
94
|
return implFiles.length > 0;
|
|
97
|
-
} catch
|
|
95
|
+
} catch {
|
|
98
96
|
// Non-fatal — if git operations fail, don't block the pipeline
|
|
99
|
-
logWarning("recovery", `implementation artifact check failed: ${(e as Error).message}`);
|
|
100
97
|
return true;
|
|
101
98
|
}
|
|
102
99
|
}
|
|
@@ -112,9 +109,8 @@ function detectMainBranch(basePath: string): string {
|
|
|
112
109
|
encoding: "utf-8",
|
|
113
110
|
});
|
|
114
111
|
if (result.trim()) return "main";
|
|
115
|
-
} catch
|
|
116
|
-
//
|
|
117
|
-
void _;
|
|
112
|
+
} catch {
|
|
113
|
+
// main doesn't exist
|
|
118
114
|
}
|
|
119
115
|
try {
|
|
120
116
|
const result = execFileSync("git", ["rev-parse", "--verify", "master"], {
|
|
@@ -123,13 +119,10 @@ function detectMainBranch(basePath: string): string {
|
|
|
123
119
|
encoding: "utf-8",
|
|
124
120
|
});
|
|
125
121
|
if (result.trim()) return "master";
|
|
126
|
-
} catch
|
|
127
|
-
//
|
|
128
|
-
void _;
|
|
122
|
+
} catch {
|
|
123
|
+
// master doesn't exist either
|
|
129
124
|
}
|
|
130
|
-
|
|
131
|
-
logWarning("recovery", "neither main nor master branch found, defaulting to main");
|
|
132
|
-
return "main";
|
|
125
|
+
return "main"; // default fallback
|
|
133
126
|
}
|
|
134
127
|
|
|
135
128
|
/**
|
|
@@ -151,9 +144,8 @@ function getChangedFilesSinceBranch(basePath: string, targetBranch: string): str
|
|
|
151
144
|
).trim();
|
|
152
145
|
return result ? result.split("\n").filter(Boolean) : [];
|
|
153
146
|
}
|
|
154
|
-
} catch
|
|
147
|
+
} catch {
|
|
155
148
|
// merge-base failed — fall back
|
|
156
|
-
logWarning("recovery", `merge-base detection failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
157
149
|
}
|
|
158
150
|
|
|
159
151
|
// Fallback: check last 20 commits
|
|
@@ -163,8 +155,7 @@ function getChangedFilesSinceBranch(basePath: string, targetBranch: string): str
|
|
|
163
155
|
{ cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
|
|
164
156
|
).trim();
|
|
165
157
|
return result ? [...new Set(result.split("\n").filter(Boolean))] : [];
|
|
166
|
-
} catch
|
|
167
|
-
logWarning("recovery", `git log fallback failed: ${(e as Error).message}`);
|
|
158
|
+
} catch {
|
|
168
159
|
return [];
|
|
169
160
|
}
|
|
170
161
|
}
|
|
@@ -255,9 +246,8 @@ export function verifyExpectedArtifact(
|
|
|
255
246
|
for (const gid of gateIds) {
|
|
256
247
|
if (pendingIds.has(gid)) return false;
|
|
257
248
|
}
|
|
258
|
-
} catch
|
|
249
|
+
} catch {
|
|
259
250
|
// DB unavailable — treat as verified to avoid blocking
|
|
260
|
-
logWarning("recovery", `gate-evaluate DB check failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
261
251
|
}
|
|
262
252
|
return true;
|
|
263
253
|
}
|
|
@@ -345,9 +335,8 @@ export function verifyExpectedArtifact(
|
|
|
345
335
|
}
|
|
346
336
|
}
|
|
347
337
|
}
|
|
348
|
-
} catch
|
|
338
|
+
} catch {
|
|
349
339
|
// Parse failure — don't block; slice plan may have non-standard format
|
|
350
|
-
logWarning("recovery", `plan-slice task plan verification failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
351
340
|
}
|
|
352
341
|
}
|
|
353
342
|
}
|
|
@@ -377,8 +366,7 @@ export function verifyExpectedArtifact(
|
|
|
377
366
|
const roadmap = parseLegacyRoadmap(roadmapContent);
|
|
378
367
|
const slice = roadmap.slices.find((s) => s.id === sid);
|
|
379
368
|
if (slice && !slice.done) return false;
|
|
380
|
-
} catch
|
|
381
|
-
logWarning("recovery", `roadmap parse failed: ${(e as Error).message}`);
|
|
369
|
+
} catch {
|
|
382
370
|
return false;
|
|
383
371
|
}
|
|
384
372
|
}
|
|
@@ -430,9 +418,7 @@ export function writeBlockerPlaceholder(
|
|
|
430
418
|
if (unitType === "execute-task" && isDbAvailable()) {
|
|
431
419
|
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
|
|
432
420
|
if (mid && sid && tid) {
|
|
433
|
-
try { updateTaskStatus(mid, sid, tid, "complete", new Date().toISOString()); } catch
|
|
434
|
-
logError("recovery", `DB status update failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
435
|
-
}
|
|
421
|
+
try { updateTaskStatus(mid, sid, tid, "complete", new Date().toISOString()); } catch { /* non-fatal */ }
|
|
436
422
|
}
|
|
437
423
|
}
|
|
438
424
|
|
|
@@ -453,23 +439,20 @@ function abortAndResetMerge(
|
|
|
453
439
|
if (hasMergeHead) {
|
|
454
440
|
try {
|
|
455
441
|
nativeMergeAbort(basePath);
|
|
456
|
-
} catch
|
|
442
|
+
} catch {
|
|
457
443
|
/* best-effort */
|
|
458
|
-
logWarning("recovery", `git merge-abort failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
459
444
|
}
|
|
460
445
|
} else if (squashMsgPath) {
|
|
461
446
|
try {
|
|
462
447
|
unlinkSync(squashMsgPath);
|
|
463
|
-
} catch
|
|
448
|
+
} catch {
|
|
464
449
|
/* best-effort */
|
|
465
|
-
logWarning("recovery", `file unlink failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
466
450
|
}
|
|
467
451
|
}
|
|
468
452
|
try {
|
|
469
453
|
nativeResetHard(basePath);
|
|
470
|
-
} catch
|
|
454
|
+
} catch {
|
|
471
455
|
/* best-effort */
|
|
472
|
-
logError("recovery", `git reset failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
473
456
|
}
|
|
474
457
|
}
|
|
475
458
|
|
|
@@ -517,8 +500,7 @@ export function reconcileMergeState(
|
|
|
517
500
|
try {
|
|
518
501
|
nativeCheckoutTheirs(basePath, gsdConflicts);
|
|
519
502
|
nativeAddPaths(basePath, gsdConflicts);
|
|
520
|
-
} catch
|
|
521
|
-
logError("recovery", `auto-resolve .gsd/ conflicts failed: ${(e as Error).message}`);
|
|
503
|
+
} catch {
|
|
522
504
|
resolved = false;
|
|
523
505
|
}
|
|
524
506
|
if (resolved) {
|
|
@@ -531,8 +513,7 @@ export function reconcileMergeState(
|
|
|
531
513
|
`Auto-resolved ${gsdConflicts.length} .gsd/ state file conflict(s) from prior merge.`,
|
|
532
514
|
"info",
|
|
533
515
|
);
|
|
534
|
-
} catch
|
|
535
|
-
logError("recovery", `auto-commit .gsd/ conflict resolution failed: ${(e as Error).message}`);
|
|
516
|
+
} catch {
|
|
536
517
|
resolved = false;
|
|
537
518
|
}
|
|
538
519
|
}
|
|
@@ -611,4 +592,3 @@ export function buildLoopRemediationSteps(
|
|
|
611
592
|
}
|
|
612
593
|
return null;
|
|
613
594
|
}
|
|
614
|
-
|