gsd-pi 2.59.0-dev.d77b3dd → 2.60.0-dev.2580e65
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 +7 -4
- package/dist/resources/extensions/gsd/auto/phases.js +15 -7
- package/dist/resources/extensions/gsd/auto-dashboard.js +21 -8
- package/dist/resources/extensions/gsd/auto-dispatch.js +6 -3
- package/dist/resources/extensions/gsd/auto-model-selection.js +58 -9
- package/dist/resources/extensions/gsd/auto-post-unit.js +3 -2
- package/dist/resources/extensions/gsd/auto-prompts.js +36 -20
- package/dist/resources/extensions/gsd/auto-recovery.js +37 -18
- package/dist/resources/extensions/gsd/auto-start.js +9 -5
- package/dist/resources/extensions/gsd/auto-timers.js +11 -5
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +5 -3
- package/dist/resources/extensions/gsd/auto-verification.js +3 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +120 -55
- package/dist/resources/extensions/gsd/auto.js +39 -17
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +6 -3
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +4 -10
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +2 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -10
- package/dist/resources/extensions/gsd/commands/catalog.js +2 -0
- package/dist/resources/extensions/gsd/commands-codebase.js +48 -21
- package/dist/resources/extensions/gsd/commands-inspect.js +2 -1
- package/dist/resources/extensions/gsd/commands-maintenance.js +32 -19
- package/dist/resources/extensions/gsd/complexity-classifier.js +8 -4
- package/dist/resources/extensions/gsd/custom-verification.js +3 -2
- package/dist/resources/extensions/gsd/gsd-db.js +33 -13
- package/dist/resources/extensions/gsd/guided-flow.js +19 -9
- package/dist/resources/extensions/gsd/init-wizard.js +12 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +11 -9
- package/dist/resources/extensions/gsd/md-importer.js +5 -4
- package/dist/resources/extensions/gsd/milestone-actions.js +3 -2
- package/dist/resources/extensions/gsd/milestone-ids.js +2 -1
- package/dist/resources/extensions/gsd/model-router.js +156 -121
- package/dist/resources/extensions/gsd/parallel-merge.js +5 -3
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +26 -14
- package/dist/resources/extensions/gsd/preferences-types.js +1 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +45 -0
- package/dist/resources/extensions/gsd/preferences.js +15 -3
- package/dist/resources/extensions/gsd/prompt-loader.js +3 -2
- package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/dist/resources/extensions/gsd/rule-registry.js +7 -6
- package/dist/resources/extensions/gsd/safe-fs.js +6 -8
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/plan-slice.js +3 -2
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -1
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +4 -4
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -1
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -1
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -1
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +2 -1
- package/dist/resources/extensions/gsd/triage-resolution.js +11 -4
- package/dist/resources/extensions/gsd/workflow-events.js +2 -1
- package/dist/resources/extensions/gsd/workflow-logger.js +37 -4
- package/dist/resources/extensions/gsd/workflow-migration.js +14 -12
- 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 +26 -14
- package/dist/resources/extensions/shared/interview-ui.js +3 -1
- 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 +5 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +16 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +26 -0
- 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 +6 -1
- 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/dist/core/lsp/lsp-legacy-alias.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js +47 -0
- package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js.map +1 -0
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +6 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +19 -0
- package/packages/pi-coding-agent/src/core/extensions/types.ts +26 -0
- package/packages/pi-coding-agent/src/core/lsp/config.ts +7 -1
- package/packages/pi-coding-agent/src/core/lsp/defaults.json +2 -2
- package/packages/pi-coding-agent/src/core/lsp/lsp-legacy-alias.test.ts +70 -0
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +7 -3
- package/src/resources/extensions/gsd/auto/phases.ts +17 -7
- package/src/resources/extensions/gsd/auto-dashboard.ts +22 -8
- package/src/resources/extensions/gsd/auto-dispatch.ts +7 -3
- package/src/resources/extensions/gsd/auto-model-selection.ts +77 -15
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -4
- package/src/resources/extensions/gsd/auto-prompts.ts +37 -20
- package/src/resources/extensions/gsd/auto-recovery.ts +38 -18
- package/src/resources/extensions/gsd/auto-start.ts +10 -9
- package/src/resources/extensions/gsd/auto-timers.ts +12 -5
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +6 -2
- package/src/resources/extensions/gsd/auto-verification.ts +3 -6
- package/src/resources/extensions/gsd/auto-worktree.ts +121 -55
- package/src/resources/extensions/gsd/auto.ts +40 -17
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +4 -3
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +4 -16
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +2 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +8 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -10
- package/src/resources/extensions/gsd/commands/catalog.ts +2 -0
- package/src/resources/extensions/gsd/commands-codebase.ts +52 -20
- package/src/resources/extensions/gsd/commands-inspect.ts +2 -1
- package/src/resources/extensions/gsd/commands-maintenance.ts +28 -19
- package/src/resources/extensions/gsd/complexity-classifier.ts +9 -4
- package/src/resources/extensions/gsd/custom-verification.ts +3 -2
- package/src/resources/extensions/gsd/gsd-db.ts +12 -14
- package/src/resources/extensions/gsd/guided-flow.ts +9 -8
- package/src/resources/extensions/gsd/init-wizard.ts +12 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -17
- package/src/resources/extensions/gsd/md-importer.ts +5 -4
- package/src/resources/extensions/gsd/milestone-actions.ts +3 -2
- package/src/resources/extensions/gsd/milestone-ids.ts +2 -1
- package/src/resources/extensions/gsd/model-router.ts +199 -173
- package/src/resources/extensions/gsd/parallel-merge.ts +5 -3
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +18 -14
- package/src/resources/extensions/gsd/preferences-types.ts +13 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +45 -0
- package/src/resources/extensions/gsd/preferences.ts +16 -3
- package/src/resources/extensions/gsd/prompt-loader.ts +3 -2
- package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/src/resources/extensions/gsd/rule-registry.ts +7 -6
- package/src/resources/extensions/gsd/safe-fs.ts +6 -5
- package/src/resources/extensions/gsd/tests/capability-router.test.ts +347 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +27 -2
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +1188 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +841 -0
- package/src/resources/extensions/gsd/tests/model-router.test.ts +403 -3
- package/src/resources/extensions/gsd/tests/preferences.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +284 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-audit.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +6 -6
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -6
- package/src/resources/extensions/gsd/tools/complete-slice.ts +3 -6
- package/src/resources/extensions/gsd/tools/complete-task.ts +3 -6
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +3 -6
- package/src/resources/extensions/gsd/tools/plan-slice.ts +3 -6
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -3
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +4 -6
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -3
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -3
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -3
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +2 -3
- package/src/resources/extensions/gsd/triage-resolution.ts +11 -4
- package/src/resources/extensions/gsd/types.ts +1 -0
- package/src/resources/extensions/gsd/workflow-events.ts +2 -1
- package/src/resources/extensions/gsd/workflow-logger.ts +52 -5
- package/src/resources/extensions/gsd/workflow-migration.ts +14 -12
- 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 +16 -14
- package/src/resources/extensions/shared/interview-ui.ts +3 -1
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +144 -0
- /package/dist/web/standalone/.next/static/{t_cBZAENjaOJIRST3dw08 → ogyMN7M-3bGGuRY08L5HR}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{t_cBZAENjaOJIRST3dw08 → ogyMN7M-3bGGuRY08L5HR}/_ssgManifest.js +0 -0
|
@@ -27,6 +27,7 @@ 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";
|
|
30
31
|
|
|
31
32
|
// ─── Preamble Cap ─────────────────────────────────────────────────────────────
|
|
32
33
|
|
|
@@ -49,7 +50,8 @@ function formatExecutorConstraints(): string {
|
|
|
49
50
|
try {
|
|
50
51
|
const prefs = loadEffectiveGSDPreferences();
|
|
51
52
|
windowTokens = resolveExecutorContextWindow(undefined, prefs?.preferences);
|
|
52
|
-
} catch {
|
|
53
|
+
} catch (e) {
|
|
54
|
+
logWarning("prompt", `resolveExecutorContextWindow failed: ${(e as Error).message}`);
|
|
53
55
|
windowTokens = 200_000; // safe default
|
|
54
56
|
}
|
|
55
57
|
const budgets = computeBudgets(windowTokens);
|
|
@@ -198,7 +200,9 @@ export async function inlineDependencySummaries(
|
|
|
198
200
|
}
|
|
199
201
|
// If slice not found in DB, fall through to file-based parsing
|
|
200
202
|
}
|
|
201
|
-
} catch {
|
|
203
|
+
} catch (err) {
|
|
204
|
+
logWarning("prompt", `inlineDependencySummaries DB lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
205
|
+
}
|
|
202
206
|
|
|
203
207
|
// If DB didn't provide depends, fall back to roadmap parsing
|
|
204
208
|
if (!depends) {
|
|
@@ -276,8 +280,8 @@ export async function inlineDecisionsFromDb(
|
|
|
276
280
|
return `### Decisions\nSource: \`.gsd/DECISIONS.md\`\n\n${formatted}`;
|
|
277
281
|
}
|
|
278
282
|
}
|
|
279
|
-
} catch {
|
|
280
|
-
|
|
283
|
+
} catch (err) {
|
|
284
|
+
logWarning("prompt", `inlineDecisionsFromDb failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
281
285
|
}
|
|
282
286
|
return inlineGsdRootFile(base, "decisions.md", "Decisions");
|
|
283
287
|
}
|
|
@@ -303,8 +307,8 @@ export async function inlineRequirementsFromDb(
|
|
|
303
307
|
return `### Requirements\nSource: \`.gsd/REQUIREMENTS.md\`\n\n${formatted}`;
|
|
304
308
|
}
|
|
305
309
|
}
|
|
306
|
-
} catch {
|
|
307
|
-
|
|
310
|
+
} catch (err) {
|
|
311
|
+
logWarning("prompt", `inlineRequirementsFromDb failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
308
312
|
}
|
|
309
313
|
return inlineGsdRootFile(base, "requirements.md", "Requirements");
|
|
310
314
|
}
|
|
@@ -325,8 +329,8 @@ export async function inlineProjectFromDb(
|
|
|
325
329
|
return `### Project\nSource: \`.gsd/PROJECT.md\`\n\n${content}`;
|
|
326
330
|
}
|
|
327
331
|
}
|
|
328
|
-
} catch {
|
|
329
|
-
|
|
332
|
+
} catch (err) {
|
|
333
|
+
logWarning("prompt", `inlineProjectFromDb failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
330
334
|
}
|
|
331
335
|
return inlineGsdRootFile(base, "project.md", "Project");
|
|
332
336
|
}
|
|
@@ -486,8 +490,8 @@ export function buildSkillActivationBlock(params: {
|
|
|
486
490
|
for (const skillName of taskPlan.frontmatter.skills_used) {
|
|
487
491
|
matched.add(normalizeSkillReference(skillName));
|
|
488
492
|
}
|
|
489
|
-
} catch {
|
|
490
|
-
|
|
493
|
+
} catch (err) {
|
|
494
|
+
logWarning("prompt", `parseTaskPlanFile failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
491
495
|
}
|
|
492
496
|
}
|
|
493
497
|
|
|
@@ -736,7 +740,9 @@ export async function checkNeedsReassessment(
|
|
|
736
740
|
return { sliceId: lastCompleted };
|
|
737
741
|
}
|
|
738
742
|
}
|
|
739
|
-
} catch {
|
|
743
|
+
} catch (err) {
|
|
744
|
+
logWarning("prompt", `checkNeedsReassessment DB lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
745
|
+
}
|
|
740
746
|
|
|
741
747
|
// File-based fallback using roadmap checkboxes
|
|
742
748
|
const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
|
|
@@ -802,7 +808,9 @@ export async function checkNeedsRunUat(
|
|
|
802
808
|
return { sliceId: sid, uatType };
|
|
803
809
|
}
|
|
804
810
|
}
|
|
805
|
-
} catch {
|
|
811
|
+
} catch (err) {
|
|
812
|
+
logWarning("prompt", `checkNeedsRunUat DB lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
813
|
+
}
|
|
806
814
|
|
|
807
815
|
// File-based fallback using roadmap checkboxes
|
|
808
816
|
if (!prefs?.uat_dispatch) return null;
|
|
@@ -1312,7 +1320,9 @@ export async function buildCompleteMilestonePrompt(
|
|
|
1312
1320
|
if (isDbAvailable()) {
|
|
1313
1321
|
sliceIds = getMilestoneSlices(mid).map(s => s.id);
|
|
1314
1322
|
}
|
|
1315
|
-
} catch {
|
|
1323
|
+
} catch (err) {
|
|
1324
|
+
logWarning("prompt", `buildCompleteMilestonePrompt DB lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1325
|
+
}
|
|
1316
1326
|
// File-based fallback: parse roadmap for slice IDs when DB has no data
|
|
1317
1327
|
if (sliceIds.length === 0 && roadmapPath) {
|
|
1318
1328
|
const roadmapContent = await loadFile(roadmapPath);
|
|
@@ -1393,7 +1403,9 @@ export async function buildValidateMilestonePrompt(
|
|
|
1393
1403
|
}
|
|
1394
1404
|
}
|
|
1395
1405
|
}
|
|
1396
|
-
} catch {
|
|
1406
|
+
} catch (err) {
|
|
1407
|
+
logWarning("prompt", `buildValidateMilestonePrompt verification classes lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1408
|
+
}
|
|
1397
1409
|
|
|
1398
1410
|
// Inline all slice summaries and UAT results
|
|
1399
1411
|
let valSliceIds: string[] = [];
|
|
@@ -1402,7 +1414,9 @@ export async function buildValidateMilestonePrompt(
|
|
|
1402
1414
|
if (isDbAvailable()) {
|
|
1403
1415
|
valSliceIds = getMilestoneSlices(mid).map(s => s.id);
|
|
1404
1416
|
}
|
|
1405
|
-
} catch {
|
|
1417
|
+
} catch (err) {
|
|
1418
|
+
logWarning("prompt", `buildValidateMilestonePrompt slice IDs lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1419
|
+
}
|
|
1406
1420
|
// File-based fallback: parse roadmap for slice IDs when DB has no data
|
|
1407
1421
|
if (valSliceIds.length === 0 && roadmapPath) {
|
|
1408
1422
|
const roadmapContent = await loadFile(roadmapPath);
|
|
@@ -1541,8 +1555,8 @@ export async function buildReplanSlicePrompt(
|
|
|
1541
1555
|
`- **${c.id}**: "${c.text}" — ${c.rationale ?? "no rationale"}`
|
|
1542
1556
|
).join("\n");
|
|
1543
1557
|
}
|
|
1544
|
-
} catch {
|
|
1545
|
-
|
|
1558
|
+
} catch (err) {
|
|
1559
|
+
logWarning("prompt", `loadReplanCaptures failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1546
1560
|
}
|
|
1547
1561
|
|
|
1548
1562
|
return loadPrompt("replan-slice", {
|
|
@@ -1642,8 +1656,8 @@ export async function buildReassessRoadmapPrompt(
|
|
|
1642
1656
|
`- **${c.id}**: "${c.text}" — ${c.rationale ?? "deferred during triage"}`
|
|
1643
1657
|
).join("\n");
|
|
1644
1658
|
}
|
|
1645
|
-
} catch {
|
|
1646
|
-
|
|
1659
|
+
} catch (err) {
|
|
1660
|
+
logWarning("prompt", `loadDeferredCaptures failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1647
1661
|
}
|
|
1648
1662
|
|
|
1649
1663
|
const reassessCommitInstruction = "Do not commit — .gsd/ planning docs are managed externally and not tracked in git.";
|
|
@@ -1859,7 +1873,9 @@ export async function buildRewriteDocsPrompt(
|
|
|
1859
1873
|
.filter(t => t.status !== "complete" && t.status !== "done")
|
|
1860
1874
|
.map(t => ({ id: t.id }));
|
|
1861
1875
|
}
|
|
1862
|
-
} catch {
|
|
1876
|
+
} catch (err) {
|
|
1877
|
+
logWarning("prompt", `buildRewriteDocsPrompt DB task lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1878
|
+
}
|
|
1863
1879
|
|
|
1864
1880
|
if (!incompleteTasks) {
|
|
1865
1881
|
// DB unavailable — no task data to inline
|
|
@@ -1911,3 +1927,4 @@ export async function buildRewriteDocsPrompt(
|
|
|
1911
1927
|
overridesPath: relGsdRootFile("OVERRIDES"),
|
|
1912
1928
|
});
|
|
1913
1929
|
}
|
|
1930
|
+
|
|
@@ -15,6 +15,7 @@ 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";
|
|
18
19
|
import {
|
|
19
20
|
nativeConflictFiles,
|
|
20
21
|
nativeCommit,
|
|
@@ -72,7 +73,8 @@ export function hasImplementationArtifacts(basePath: string): boolean {
|
|
|
72
73
|
stdio: ["ignore", "pipe", "pipe"],
|
|
73
74
|
encoding: "utf-8",
|
|
74
75
|
});
|
|
75
|
-
} catch {
|
|
76
|
+
} catch (e) {
|
|
77
|
+
logWarning("recovery", `git rev-parse check failed: ${(e as Error).message}`);
|
|
76
78
|
return true;
|
|
77
79
|
}
|
|
78
80
|
|
|
@@ -92,8 +94,9 @@ export function hasImplementationArtifacts(basePath: string): boolean {
|
|
|
92
94
|
// implementation code (#1703).
|
|
93
95
|
const implFiles = changedFiles.filter(f => !f.startsWith(".gsd/") && !f.startsWith(".gsd\\"));
|
|
94
96
|
return implFiles.length > 0;
|
|
95
|
-
} catch {
|
|
97
|
+
} catch (e) {
|
|
96
98
|
// Non-fatal — if git operations fail, don't block the pipeline
|
|
99
|
+
logWarning("recovery", `implementation artifact check failed: ${(e as Error).message}`);
|
|
97
100
|
return true;
|
|
98
101
|
}
|
|
99
102
|
}
|
|
@@ -109,8 +112,9 @@ function detectMainBranch(basePath: string): string {
|
|
|
109
112
|
encoding: "utf-8",
|
|
110
113
|
});
|
|
111
114
|
if (result.trim()) return "main";
|
|
112
|
-
} catch {
|
|
113
|
-
// main doesn't exist
|
|
115
|
+
} catch (_) {
|
|
116
|
+
// Expected — main doesn't exist, try master next
|
|
117
|
+
void _;
|
|
114
118
|
}
|
|
115
119
|
try {
|
|
116
120
|
const result = execFileSync("git", ["rev-parse", "--verify", "master"], {
|
|
@@ -119,10 +123,13 @@ function detectMainBranch(basePath: string): string {
|
|
|
119
123
|
encoding: "utf-8",
|
|
120
124
|
});
|
|
121
125
|
if (result.trim()) return "master";
|
|
122
|
-
} catch {
|
|
123
|
-
// master doesn't exist either
|
|
126
|
+
} catch (_) {
|
|
127
|
+
// Expected — master doesn't exist either
|
|
128
|
+
void _;
|
|
124
129
|
}
|
|
125
|
-
|
|
130
|
+
// Neither main nor master found — warn and fall back
|
|
131
|
+
logWarning("recovery", "neither main nor master branch found, defaulting to main");
|
|
132
|
+
return "main";
|
|
126
133
|
}
|
|
127
134
|
|
|
128
135
|
/**
|
|
@@ -144,8 +151,9 @@ function getChangedFilesSinceBranch(basePath: string, targetBranch: string): str
|
|
|
144
151
|
).trim();
|
|
145
152
|
return result ? result.split("\n").filter(Boolean) : [];
|
|
146
153
|
}
|
|
147
|
-
} catch {
|
|
154
|
+
} catch (err) {
|
|
148
155
|
// merge-base failed — fall back
|
|
156
|
+
logWarning("recovery", `merge-base detection failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
149
157
|
}
|
|
150
158
|
|
|
151
159
|
// Fallback: check last 20 commits
|
|
@@ -155,7 +163,8 @@ function getChangedFilesSinceBranch(basePath: string, targetBranch: string): str
|
|
|
155
163
|
{ cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
|
|
156
164
|
).trim();
|
|
157
165
|
return result ? [...new Set(result.split("\n").filter(Boolean))] : [];
|
|
158
|
-
} catch {
|
|
166
|
+
} catch (e) {
|
|
167
|
+
logWarning("recovery", `git log fallback failed: ${(e as Error).message}`);
|
|
159
168
|
return [];
|
|
160
169
|
}
|
|
161
170
|
}
|
|
@@ -246,8 +255,9 @@ export function verifyExpectedArtifact(
|
|
|
246
255
|
for (const gid of gateIds) {
|
|
247
256
|
if (pendingIds.has(gid)) return false;
|
|
248
257
|
}
|
|
249
|
-
} catch {
|
|
258
|
+
} catch (err) {
|
|
250
259
|
// DB unavailable — treat as verified to avoid blocking
|
|
260
|
+
logWarning("recovery", `gate-evaluate DB check failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
251
261
|
}
|
|
252
262
|
return true;
|
|
253
263
|
}
|
|
@@ -335,8 +345,9 @@ export function verifyExpectedArtifact(
|
|
|
335
345
|
}
|
|
336
346
|
}
|
|
337
347
|
}
|
|
338
|
-
} catch {
|
|
348
|
+
} catch (err) {
|
|
339
349
|
// 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)}`);
|
|
340
351
|
}
|
|
341
352
|
}
|
|
342
353
|
}
|
|
@@ -366,7 +377,8 @@ export function verifyExpectedArtifact(
|
|
|
366
377
|
const roadmap = parseLegacyRoadmap(roadmapContent);
|
|
367
378
|
const slice = roadmap.slices.find((s) => s.id === sid);
|
|
368
379
|
if (slice && !slice.done) return false;
|
|
369
|
-
} catch {
|
|
380
|
+
} catch (e) {
|
|
381
|
+
logWarning("recovery", `roadmap parse failed: ${(e as Error).message}`);
|
|
370
382
|
return false;
|
|
371
383
|
}
|
|
372
384
|
}
|
|
@@ -418,7 +430,9 @@ export function writeBlockerPlaceholder(
|
|
|
418
430
|
if (unitType === "execute-task" && isDbAvailable()) {
|
|
419
431
|
const { milestone: mid, slice: sid, task: tid } = parseUnitId(unitId);
|
|
420
432
|
if (mid && sid && tid) {
|
|
421
|
-
try { updateTaskStatus(mid, sid, tid, "complete", new Date().toISOString()); } catch { /* non-fatal */
|
|
433
|
+
try { updateTaskStatus(mid, sid, tid, "complete", new Date().toISOString()); } catch (err) { /* non-fatal */
|
|
434
|
+
logError("recovery", `DB status update failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
435
|
+
}
|
|
422
436
|
}
|
|
423
437
|
}
|
|
424
438
|
|
|
@@ -439,20 +453,23 @@ function abortAndResetMerge(
|
|
|
439
453
|
if (hasMergeHead) {
|
|
440
454
|
try {
|
|
441
455
|
nativeMergeAbort(basePath);
|
|
442
|
-
} catch {
|
|
456
|
+
} catch (err) {
|
|
443
457
|
/* best-effort */
|
|
458
|
+
logWarning("recovery", `git merge-abort failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
444
459
|
}
|
|
445
460
|
} else if (squashMsgPath) {
|
|
446
461
|
try {
|
|
447
462
|
unlinkSync(squashMsgPath);
|
|
448
|
-
} catch {
|
|
463
|
+
} catch (err) {
|
|
449
464
|
/* best-effort */
|
|
465
|
+
logWarning("recovery", `file unlink failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
450
466
|
}
|
|
451
467
|
}
|
|
452
468
|
try {
|
|
453
469
|
nativeResetHard(basePath);
|
|
454
|
-
} catch {
|
|
470
|
+
} catch (err) {
|
|
455
471
|
/* best-effort */
|
|
472
|
+
logError("recovery", `git reset failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
456
473
|
}
|
|
457
474
|
}
|
|
458
475
|
|
|
@@ -500,7 +517,8 @@ export function reconcileMergeState(
|
|
|
500
517
|
try {
|
|
501
518
|
nativeCheckoutTheirs(basePath, gsdConflicts);
|
|
502
519
|
nativeAddPaths(basePath, gsdConflicts);
|
|
503
|
-
} catch {
|
|
520
|
+
} catch (e) {
|
|
521
|
+
logError("recovery", `auto-resolve .gsd/ conflicts failed: ${(e as Error).message}`);
|
|
504
522
|
resolved = false;
|
|
505
523
|
}
|
|
506
524
|
if (resolved) {
|
|
@@ -513,7 +531,8 @@ export function reconcileMergeState(
|
|
|
513
531
|
`Auto-resolved ${gsdConflicts.length} .gsd/ state file conflict(s) from prior merge.`,
|
|
514
532
|
"info",
|
|
515
533
|
);
|
|
516
|
-
} catch {
|
|
534
|
+
} catch (e) {
|
|
535
|
+
logError("recovery", `auto-commit .gsd/ conflict resolution failed: ${(e as Error).message}`);
|
|
517
536
|
resolved = false;
|
|
518
537
|
}
|
|
519
538
|
}
|
|
@@ -592,3 +611,4 @@ export function buildLoopRemediationSteps(
|
|
|
592
611
|
}
|
|
593
612
|
return null;
|
|
594
613
|
}
|
|
614
|
+
|
|
@@ -66,6 +66,7 @@ import {
|
|
|
66
66
|
isDebugEnabled,
|
|
67
67
|
getDebugLogPath,
|
|
68
68
|
} from "./debug-logger.js";
|
|
69
|
+
import { logWarning, logError } from "./workflow-logger.js";
|
|
69
70
|
import { parseUnitId } from "./unit-id.js";
|
|
70
71
|
import type { AutoSession } from "./auto/session.js";
|
|
71
72
|
import {
|
|
@@ -112,8 +113,9 @@ async function openProjectDbIfPresent(basePath: string): Promise<void> {
|
|
|
112
113
|
try {
|
|
113
114
|
const { openDatabase } = await import("./gsd-db.js");
|
|
114
115
|
openDatabase(gsdDbPath);
|
|
115
|
-
} catch {
|
|
116
|
+
} catch (err) {
|
|
116
117
|
/* non-fatal — DB lifecycle block below will retry */
|
|
118
|
+
logWarning("engine", `DB open failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
117
119
|
}
|
|
118
120
|
}
|
|
119
121
|
|
|
@@ -213,8 +215,9 @@ export async function bootstrapAutoSession(
|
|
|
213
215
|
try {
|
|
214
216
|
nativeAddAll(base);
|
|
215
217
|
nativeCommit(base, "chore: init gsd");
|
|
216
|
-
} catch {
|
|
218
|
+
} catch (err) {
|
|
217
219
|
/* nothing to commit */
|
|
220
|
+
logWarning("engine", `mkdir failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
218
221
|
}
|
|
219
222
|
}
|
|
220
223
|
|
|
@@ -575,9 +578,7 @@ export async function bootstrapAutoSession(
|
|
|
575
578
|
migrateFromMarkdown(s.basePath);
|
|
576
579
|
}
|
|
577
580
|
} catch (err) {
|
|
578
|
-
|
|
579
|
-
`gsd-migrate: auto-migration failed: ${(err as Error).message}\n`,
|
|
580
|
-
);
|
|
581
|
+
logError("engine", `auto-migration failed: ${(err as Error).message}`);
|
|
581
582
|
}
|
|
582
583
|
}
|
|
583
584
|
if (existsSync(gsdDbPath) && !isDbAvailable()) {
|
|
@@ -585,9 +586,7 @@ export async function bootstrapAutoSession(
|
|
|
585
586
|
const { openDatabase: openDb } = await import("./gsd-db.js");
|
|
586
587
|
openDb(gsdDbPath);
|
|
587
588
|
} catch (err) {
|
|
588
|
-
|
|
589
|
-
`gsd-db: failed to open existing database: ${(err as Error).message}\n`,
|
|
590
|
-
);
|
|
589
|
+
logError("engine", `failed to open existing database: ${(err as Error).message}`);
|
|
591
590
|
}
|
|
592
591
|
}
|
|
593
592
|
|
|
@@ -724,8 +723,9 @@ export async function bootstrapAutoSession(
|
|
|
724
723
|
}
|
|
725
724
|
}
|
|
726
725
|
}
|
|
727
|
-
} catch {
|
|
726
|
+
} catch (err) {
|
|
728
727
|
/* non-fatal */
|
|
728
|
+
logWarning("engine", `preflight validation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
729
729
|
}
|
|
730
730
|
|
|
731
731
|
return true;
|
|
@@ -735,3 +735,4 @@ export async function bootstrapAutoSession(
|
|
|
735
735
|
throw err;
|
|
736
736
|
}
|
|
737
737
|
}
|
|
738
|
+
|
|
@@ -24,6 +24,7 @@ import { saveActivityLog } from "./activity-log.js";
|
|
|
24
24
|
import { recoverTimedOutUnit, type RecoveryContext } from "./auto-timeout-recovery.js";
|
|
25
25
|
import { resolveAgentEndCancelled } from "./auto/resolve.js";
|
|
26
26
|
import type { AutoSession } from "./auto/session.js";
|
|
27
|
+
import { logWarning, logError } from "./workflow-logger.js";
|
|
27
28
|
|
|
28
29
|
export interface SupervisionContext {
|
|
29
30
|
s: AutoSession;
|
|
@@ -99,8 +100,9 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
|
|
|
99
100
|
}
|
|
100
101
|
}
|
|
101
102
|
}
|
|
102
|
-
} catch {
|
|
103
|
+
} catch (err) {
|
|
103
104
|
// Non-fatal — fall through with no estimate
|
|
105
|
+
logWarning("timer", `operation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
104
106
|
}
|
|
105
107
|
}
|
|
106
108
|
const estimateMinutes = taskEstimate ? parseEstimateMinutes(taskEstimate) : null;
|
|
@@ -214,12 +216,14 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
|
|
|
214
216
|
await pauseAuto(ctx, pi);
|
|
215
217
|
} catch (err) {
|
|
216
218
|
const message = err instanceof Error ? err.message : String(err);
|
|
217
|
-
|
|
219
|
+
logError("timer", `[idle-watchdog] Unhandled error: ${message}`);
|
|
218
220
|
// Unblock any pending unit promise so the auto-loop is not orphaned.
|
|
219
221
|
resolveAgentEndCancelled({ message: `Idle watchdog error: ${message}`, category: "idle", isTransient: true });
|
|
220
222
|
try {
|
|
221
223
|
ctx.ui.notify(`Idle watchdog error: ${message}`, "warning");
|
|
222
|
-
} catch { /* best effort */
|
|
224
|
+
} catch (err) { /* best effort */
|
|
225
|
+
logWarning("timer", `notification failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
226
|
+
}
|
|
223
227
|
}
|
|
224
228
|
}, 15000);
|
|
225
229
|
|
|
@@ -248,12 +252,14 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
|
|
|
248
252
|
await pauseAuto(ctx, pi);
|
|
249
253
|
} catch (err) {
|
|
250
254
|
const message = err instanceof Error ? err.message : String(err);
|
|
251
|
-
|
|
255
|
+
logError("timer", `[hard-timeout] Unhandled error: ${message}`);
|
|
252
256
|
// Unblock any pending unit promise so the auto-loop is not orphaned.
|
|
253
257
|
resolveAgentEndCancelled({ message: `Hard timeout error: ${message}`, category: "timeout", isTransient: true });
|
|
254
258
|
try {
|
|
255
259
|
ctx.ui.notify(`Hard timeout error: ${message}`, "warning");
|
|
256
|
-
} catch { /* best effort */
|
|
260
|
+
} catch (err) { /* best effort */
|
|
261
|
+
logWarning("timer", `notification failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
262
|
+
}
|
|
257
263
|
}
|
|
258
264
|
}, hardTimeoutMs);
|
|
259
265
|
|
|
@@ -311,3 +317,4 @@ export function startUnitSupervision(sctx: SupervisionContext): void {
|
|
|
311
317
|
}
|
|
312
318
|
}, 15_000);
|
|
313
319
|
}
|
|
320
|
+
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import type { ExtensionContext } from "@gsd/pi-coding-agent";
|
|
8
8
|
import { snapshotUnitMetrics } from "./metrics.js";
|
|
9
9
|
import { saveActivityLog } from "./activity-log.js";
|
|
10
|
+
import { logWarning } from "./workflow-logger.js";
|
|
10
11
|
|
|
11
12
|
export interface CloseoutOptions {
|
|
12
13
|
promptCharCount?: number;
|
|
@@ -38,11 +39,14 @@ export async function closeoutUnit(
|
|
|
38
39
|
const llmCallFn = buildMemoryLLMCall(ctx);
|
|
39
40
|
if (llmCallFn) {
|
|
40
41
|
extractMemoriesFromUnit(activityFile, unitType, unitId, llmCallFn).catch((err) => {
|
|
41
|
-
|
|
42
|
+
logWarning("engine", `memory extraction failed for ${unitType}/${unitId}: ${(err as Error).message}`);
|
|
42
43
|
});
|
|
43
44
|
}
|
|
44
|
-
} catch { /* non-fatal */
|
|
45
|
+
} catch (err) { /* non-fatal */
|
|
46
|
+
logWarning("engine", `operation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
47
|
+
}
|
|
45
48
|
}
|
|
46
49
|
|
|
47
50
|
return activityFile ?? undefined;
|
|
48
51
|
}
|
|
52
|
+
|
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
runDependencyAudit,
|
|
23
23
|
} from "./verification-gate.js";
|
|
24
24
|
import { writeVerificationJSON } from "./verification-evidence.js";
|
|
25
|
+
import { logWarning } from "./workflow-logger.js";
|
|
25
26
|
import type { AutoSession } from "./auto/session.js";
|
|
26
27
|
import { join } from "node:path";
|
|
27
28
|
|
|
@@ -159,9 +160,7 @@ export async function runPostUnitVerification(
|
|
|
159
160
|
}
|
|
160
161
|
}
|
|
161
162
|
} catch (evidenceErr) {
|
|
162
|
-
|
|
163
|
-
`verification-evidence: write error — ${(evidenceErr as Error).message}\n`,
|
|
164
|
-
);
|
|
163
|
+
logWarning("engine", `verification-evidence write error: ${(evidenceErr as Error).message}`);
|
|
165
164
|
}
|
|
166
165
|
}
|
|
167
166
|
|
|
@@ -217,9 +216,7 @@ export async function runPostUnitVerification(
|
|
|
217
216
|
}
|
|
218
217
|
} catch (err) {
|
|
219
218
|
// Gate errors are non-fatal
|
|
220
|
-
|
|
221
|
-
`verification-gate: error — ${(err as Error).message}\n`,
|
|
222
|
-
);
|
|
219
|
+
logWarning("engine", `verification-gate error: ${(err as Error).message}`);
|
|
223
220
|
return "continue";
|
|
224
221
|
}
|
|
225
222
|
}
|