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
|
@@ -16,7 +16,6 @@ export interface ClassificationResult {
|
|
|
16
16
|
tier: ComplexityTier;
|
|
17
17
|
reason: string;
|
|
18
18
|
downgraded: boolean; // true if budget pressure lowered the tier
|
|
19
|
-
taskMetadata?: TaskMetadata;
|
|
20
19
|
}
|
|
21
20
|
|
|
22
21
|
export interface TaskMetadata {
|
|
@@ -72,20 +71,17 @@ export function classifyUnitComplexity(
|
|
|
72
71
|
): ClassificationResult {
|
|
73
72
|
// Hook units default to light
|
|
74
73
|
if (unitType.startsWith("hook/")) {
|
|
75
|
-
const result: ClassificationResult = { tier: "light", reason: "hook unit", downgraded: false
|
|
74
|
+
const result: ClassificationResult = { tier: "light", reason: "hook unit", downgraded: false };
|
|
76
75
|
return applyBudgetPressure(result, budgetPct);
|
|
77
76
|
}
|
|
78
77
|
|
|
79
78
|
// Start with the default tier for this unit type
|
|
80
79
|
let tier = UNIT_TYPE_TIERS[unitType] ?? "standard";
|
|
81
80
|
let reason = `unit type: ${unitType}`;
|
|
82
|
-
let taskMeta: TaskMetadata | undefined;
|
|
83
81
|
|
|
84
82
|
// For execute-task, analyze task metadata for complexity signals
|
|
85
83
|
if (unitType === "execute-task") {
|
|
86
|
-
|
|
87
|
-
taskMeta = metadata ?? extractTaskMetadata(unitId, basePath);
|
|
88
|
-
const taskAnalysis = analyzeTaskComplexity(unitId, basePath, taskMeta);
|
|
84
|
+
const taskAnalysis = analyzeTaskComplexity(unitId, basePath, metadata);
|
|
89
85
|
tier = taskAnalysis.tier;
|
|
90
86
|
reason = taskAnalysis.reason;
|
|
91
87
|
}
|
|
@@ -100,15 +96,14 @@ export function classifyUnitComplexity(
|
|
|
100
96
|
}
|
|
101
97
|
|
|
102
98
|
// Adaptive learning: check if history suggests bumping the tier
|
|
103
|
-
|
|
104
|
-
const tags = taskMeta?.tags ?? metadata?.tags;
|
|
99
|
+
const tags = metadata?.tags ?? extractTaskMetadata(unitId, basePath).tags;
|
|
105
100
|
const adaptiveAdjustment = getAdaptiveTierAdjustment(unitType, tier, tags);
|
|
106
101
|
if (adaptiveAdjustment && tierOrdinal(adaptiveAdjustment) > tierOrdinal(tier)) {
|
|
107
102
|
reason = `${reason} (adaptive: high failure rate at ${tier})`;
|
|
108
103
|
tier = adaptiveAdjustment;
|
|
109
104
|
}
|
|
110
105
|
|
|
111
|
-
const result: ClassificationResult = { tier, reason, downgraded: false
|
|
106
|
+
const result: ClassificationResult = { tier, reason, downgraded: false };
|
|
112
107
|
return applyBudgetPressure(result, budgetPct);
|
|
113
108
|
}
|
|
114
109
|
|
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
* - The frozen DEFINITION.yaml on disk is the single source of truth for step policies.
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
|
-
import { logWarning } from "./workflow-logger.js";
|
|
21
20
|
import { readFileSync, existsSync, statSync } from "node:fs";
|
|
22
21
|
import { join, resolve, sep } from "node:path";
|
|
23
22
|
import { spawnSync } from "node:child_process";
|
|
@@ -131,8 +130,8 @@ function handleContentHeuristic(
|
|
|
131
130
|
if (!new RegExp(verify.pattern).test(content)) {
|
|
132
131
|
return "pause";
|
|
133
132
|
}
|
|
134
|
-
} catch
|
|
135
|
-
|
|
133
|
+
} catch {
|
|
134
|
+
// Invalid regex at runtime — treat as verification failure
|
|
136
135
|
return "pause";
|
|
137
136
|
}
|
|
138
137
|
}
|
|
@@ -10,7 +10,7 @@ import { existsSync, copyFileSync, mkdirSync, realpathSync } from "node:fs";
|
|
|
10
10
|
import { dirname } from "node:path";
|
|
11
11
|
import type { Decision, Requirement, GateRow, GateId, GateScope, GateStatus, GateVerdict } from "./types.js";
|
|
12
12
|
import { GSDError, GSD_STALE_STATE } from "./errors.js";
|
|
13
|
-
import { logError
|
|
13
|
+
import { logError } from "./workflow-logger.js";
|
|
14
14
|
|
|
15
15
|
const _require = createRequire(import.meta.url);
|
|
16
16
|
|
|
@@ -787,11 +787,11 @@ export function openDatabase(path: string): boolean {
|
|
|
787
787
|
initSchema(adapter, fileBacked);
|
|
788
788
|
process.stderr.write("gsd-db: recovered corrupt database via VACUUM\n");
|
|
789
789
|
} catch (retryErr) {
|
|
790
|
-
try { adapter.close(); } catch
|
|
790
|
+
try { adapter.close(); } catch { /* swallow */ }
|
|
791
791
|
throw retryErr;
|
|
792
792
|
}
|
|
793
793
|
} else {
|
|
794
|
-
try { adapter.close(); } catch
|
|
794
|
+
try { adapter.close(); } catch { /* swallow */ }
|
|
795
795
|
throw err;
|
|
796
796
|
}
|
|
797
797
|
}
|
|
@@ -802,7 +802,7 @@ export function openDatabase(path: string): boolean {
|
|
|
802
802
|
|
|
803
803
|
if (!_exitHandlerRegistered) {
|
|
804
804
|
_exitHandlerRegistered = true;
|
|
805
|
-
process.on("exit", () => { try { closeDatabase(); } catch
|
|
805
|
+
process.on("exit", () => { try { closeDatabase(); } catch {} });
|
|
806
806
|
}
|
|
807
807
|
|
|
808
808
|
return true;
|
|
@@ -812,14 +812,16 @@ export function closeDatabase(): void {
|
|
|
812
812
|
if (currentDb) {
|
|
813
813
|
try {
|
|
814
814
|
currentDb.exec('PRAGMA wal_checkpoint(TRUNCATE)');
|
|
815
|
-
} catch
|
|
815
|
+
} catch { /* non-fatal — best effort before close */ }
|
|
816
816
|
try {
|
|
817
817
|
// Incremental vacuum to reclaim space without blocking
|
|
818
818
|
currentDb.exec('PRAGMA incremental_vacuum(64)');
|
|
819
|
-
} catch
|
|
819
|
+
} catch { /* non-fatal */ }
|
|
820
820
|
try {
|
|
821
821
|
currentDb.close();
|
|
822
|
-
} catch
|
|
822
|
+
} catch {
|
|
823
|
+
// swallow close errors
|
|
824
|
+
}
|
|
823
825
|
currentDb = null;
|
|
824
826
|
currentPath = null;
|
|
825
827
|
currentPid = 0;
|
|
@@ -831,7 +833,7 @@ export function vacuumDatabase(): void {
|
|
|
831
833
|
if (!currentDb) return;
|
|
832
834
|
try {
|
|
833
835
|
currentDb.exec('VACUUM');
|
|
834
|
-
} catch
|
|
836
|
+
} catch { /* non-fatal */ }
|
|
835
837
|
}
|
|
836
838
|
|
|
837
839
|
let _txDepth = 0;
|
|
@@ -1036,7 +1038,7 @@ export function upsertRequirement(r: Requirement): void {
|
|
|
1036
1038
|
|
|
1037
1039
|
export function clearArtifacts(): void {
|
|
1038
1040
|
if (!currentDb) return;
|
|
1039
|
-
try { currentDb.exec("DELETE FROM artifacts"); } catch
|
|
1041
|
+
try { currentDb.exec("DELETE FROM artifacts"); } catch { /* cache clear is best effort */ }
|
|
1040
1042
|
}
|
|
1041
1043
|
|
|
1042
1044
|
export function insertArtifact(a: {
|
|
@@ -1799,7 +1801,7 @@ export function reconcileWorktreeDb(
|
|
|
1799
1801
|
// ATTACHing a WAL-mode DB to itself corrupts the WAL (#2823).
|
|
1800
1802
|
try {
|
|
1801
1803
|
if (realpathSync(mainDbPath) === realpathSync(worktreeDbPath)) return zero;
|
|
1802
|
-
} catch
|
|
1804
|
+
} catch { /* path resolution failed — fall through to existing checks */ }
|
|
1803
1805
|
// Sanitize path: reject any characters that could break ATTACH syntax.
|
|
1804
1806
|
// ATTACH DATABASE doesn't support parameterized paths in all providers,
|
|
1805
1807
|
// so we use strict allowlist validation instead.
|
|
@@ -1936,12 +1938,12 @@ export function reconcileWorktreeDb(
|
|
|
1936
1938
|
|
|
1937
1939
|
adapter.exec("COMMIT");
|
|
1938
1940
|
} catch (txErr) {
|
|
1939
|
-
try { adapter.exec("ROLLBACK"); } catch
|
|
1941
|
+
try { adapter.exec("ROLLBACK"); } catch { /* best effort */ }
|
|
1940
1942
|
throw txErr;
|
|
1941
1943
|
}
|
|
1942
1944
|
return { ...merged, conflicts };
|
|
1943
1945
|
} finally {
|
|
1944
|
-
try { adapter.exec("DETACH DATABASE wt"); } catch
|
|
1946
|
+
try { adapter.exec("DETACH DATABASE wt"); } catch { /* best effort */ }
|
|
1945
1947
|
}
|
|
1946
1948
|
} catch (err) {
|
|
1947
1949
|
logError("db", "worktree DB reconciliation failed", { error: (err as Error).message });
|
|
@@ -52,7 +52,6 @@ export {
|
|
|
52
52
|
buildExistingMilestonesContext,
|
|
53
53
|
} from "./guided-flow-queue.js";
|
|
54
54
|
import { getErrorMessage } from "./error-utils.js";
|
|
55
|
-
import { logWarning } from "./workflow-logger.js";
|
|
56
55
|
|
|
57
56
|
// ─── ID Generation with Reservation ─────────────────────────────────────────
|
|
58
57
|
|
|
@@ -181,7 +180,7 @@ export function checkAutoStartAfterDiscuss(): boolean {
|
|
|
181
180
|
);
|
|
182
181
|
}
|
|
183
182
|
}
|
|
184
|
-
} catch
|
|
183
|
+
} catch { /* non-fatal — PROJECT.md parsing failure shouldn't block auto-start */ }
|
|
185
184
|
}
|
|
186
185
|
|
|
187
186
|
// Gate 4: Discussion manifest process verification (multi-milestone only)
|
|
@@ -213,7 +212,7 @@ export function checkAutoStartAfterDiscuss(): boolean {
|
|
|
213
212
|
);
|
|
214
213
|
}
|
|
215
214
|
}
|
|
216
|
-
} catch
|
|
215
|
+
} catch { /* malformed manifest — warn but don't block */ }
|
|
217
216
|
}
|
|
218
217
|
|
|
219
218
|
// Draft promotion cleanup: if a CONTEXT-DRAFT.md exists alongside the new
|
|
@@ -221,16 +220,16 @@ export function checkAutoStartAfterDiscuss(): boolean {
|
|
|
221
220
|
try {
|
|
222
221
|
const draftFile = resolveMilestoneFile(basePath, milestoneId, "CONTEXT-DRAFT");
|
|
223
222
|
if (draftFile) unlinkSync(draftFile);
|
|
224
|
-
} catch
|
|
223
|
+
} catch { /* non-fatal — stale draft doesn't break anything, CONTEXT.md wins */ }
|
|
225
224
|
|
|
226
225
|
// Cleanup: remove discussion manifest after auto-start (only needed during discussion)
|
|
227
|
-
try { unlinkSync(manifestPath); } catch
|
|
226
|
+
try { unlinkSync(manifestPath); } catch { /* may not exist for single-milestone */ }
|
|
228
227
|
|
|
229
228
|
pendingAutoStartMap.delete(basePath);
|
|
230
229
|
ctx.ui.notify(`Milestone ${milestoneId} ready.`, "info");
|
|
231
230
|
startAuto(ctx, pi, basePath, false, { step }).catch((err) => {
|
|
232
231
|
ctx.ui.notify(`Auto-start failed: ${getErrorMessage(err)}`, "error");
|
|
233
|
-
|
|
232
|
+
if (process.env.GSD_DEBUG) console.error('[gsd] auto start error:', err);
|
|
234
233
|
debugLog("auto-start-failed", { error: getErrorMessage(err) });
|
|
235
234
|
});
|
|
236
235
|
return true;
|
|
@@ -896,8 +895,8 @@ function selfHealRuntimeRecords(basePath: string, ctx: ExtensionContext): { clea
|
|
|
896
895
|
ctx.ui.notify(`Self-heal: cleared ${cleared} stale runtime record(s) from a previous session.`, "info");
|
|
897
896
|
}
|
|
898
897
|
return { cleared };
|
|
899
|
-
} catch
|
|
900
|
-
|
|
898
|
+
} catch {
|
|
899
|
+
// Non-fatal — self-heal should never block the wizard
|
|
901
900
|
return { cleared: 0 };
|
|
902
901
|
}
|
|
903
902
|
}
|
|
@@ -1143,7 +1142,7 @@ export async function showSmartEntry(
|
|
|
1143
1142
|
);
|
|
1144
1143
|
return;
|
|
1145
1144
|
}
|
|
1146
|
-
} catch
|
|
1145
|
+
} catch { /* directory exists but unreadable — fall through to normal flow */ }
|
|
1147
1146
|
}
|
|
1148
1147
|
}
|
|
1149
1148
|
|
|
@@ -16,7 +16,6 @@ import { gsdRoot } from "./paths.js";
|
|
|
16
16
|
import { assertSafeDirectory } from "./validate-directory.js";
|
|
17
17
|
import type { ProjectDetection, ProjectSignals } from "./detection.js";
|
|
18
18
|
import { runSkillInstallStep } from "./skill-catalog.js";
|
|
19
|
-
import { generateCodebaseMap, writeCodebaseMap } from "./codebase-generator.js";
|
|
20
19
|
|
|
21
20
|
// ─── Types ──────────────────────────────────────────────────────────────────────
|
|
22
21
|
|
|
@@ -239,17 +238,6 @@ export async function showProjectInit(
|
|
|
239
238
|
ensureGitignore(basePath);
|
|
240
239
|
untrackRuntimeFiles(basePath);
|
|
241
240
|
|
|
242
|
-
// Auto-generate codebase map for instant agent orientation
|
|
243
|
-
try {
|
|
244
|
-
const result = generateCodebaseMap(basePath);
|
|
245
|
-
if (result.fileCount > 0) {
|
|
246
|
-
writeCodebaseMap(basePath, result.content);
|
|
247
|
-
ctx.ui.notify(`Codebase map generated: ${result.fileCount} files`, "info");
|
|
248
|
-
}
|
|
249
|
-
} catch {
|
|
250
|
-
// Non-fatal — codebase map generation failure should never block project init
|
|
251
|
-
}
|
|
252
|
-
|
|
253
241
|
ctx.ui.notify("GSD initialized. Starting your first milestone...", "info");
|
|
254
242
|
|
|
255
243
|
return { completed: true, bootstrapped: true };
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
// parseRoadmap(), parsePlan(), parseSummary() in files.ts.
|
|
10
10
|
|
|
11
11
|
import { readFileSync, existsSync, mkdirSync } from "node:fs";
|
|
12
|
-
import { logWarning } from "./workflow-logger.js";
|
|
13
12
|
import { isClosedStatus } from "./status-guards.js";
|
|
14
13
|
import { join, relative } from "node:path";
|
|
15
14
|
import { createRequire } from "node:module";
|
|
@@ -94,7 +93,9 @@ function loadArtifactContent(
|
|
|
94
93
|
try {
|
|
95
94
|
content = readFileSync(absPath, "utf-8");
|
|
96
95
|
} catch {
|
|
97
|
-
|
|
96
|
+
process.stderr.write(
|
|
97
|
+
`markdown-renderer: cannot read file from disk: ${absPath}\n`,
|
|
98
|
+
);
|
|
98
99
|
return null;
|
|
99
100
|
}
|
|
100
101
|
|
|
@@ -110,7 +111,9 @@ function loadArtifactContent(
|
|
|
110
111
|
});
|
|
111
112
|
} catch {
|
|
112
113
|
// Non-fatal: we have the content, DB storage is best-effort
|
|
113
|
-
|
|
114
|
+
process.stderr.write(
|
|
115
|
+
`markdown-renderer: warning — failed to store disk fallback in DB: ${artifactPath}\n`,
|
|
116
|
+
);
|
|
114
117
|
}
|
|
115
118
|
|
|
116
119
|
return content;
|
|
@@ -143,7 +146,9 @@ async function writeAndStore(
|
|
|
143
146
|
});
|
|
144
147
|
} catch {
|
|
145
148
|
// Non-fatal: file is on disk, DB is best-effort
|
|
146
|
-
|
|
149
|
+
process.stderr.write(
|
|
150
|
+
`markdown-renderer: warning — failed to update artifact in DB: ${artifactPath}\n`,
|
|
151
|
+
);
|
|
147
152
|
}
|
|
148
153
|
|
|
149
154
|
invalidateCaches();
|
|
@@ -801,8 +806,7 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
|
|
|
801
806
|
try {
|
|
802
807
|
const m = _require("./parsers-legacy.ts");
|
|
803
808
|
parseRoadmap = m.parseRoadmap; parsePlan = m.parsePlan;
|
|
804
|
-
} catch
|
|
805
|
-
logWarning("renderer", `parsers-legacy.ts require failed, falling back to .js: ${(e as Error).message}`);
|
|
809
|
+
} catch {
|
|
806
810
|
const m = _require("./parsers-legacy.js");
|
|
807
811
|
parseRoadmap = m.parseRoadmap; parsePlan = m.parsePlan;
|
|
808
812
|
}
|
|
@@ -837,8 +841,8 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
|
|
|
837
841
|
});
|
|
838
842
|
}
|
|
839
843
|
}
|
|
840
|
-
} catch
|
|
841
|
-
|
|
844
|
+
} catch {
|
|
845
|
+
// Can't parse roadmap — skip silently
|
|
842
846
|
}
|
|
843
847
|
}
|
|
844
848
|
|
|
@@ -870,8 +874,8 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
|
|
|
870
874
|
});
|
|
871
875
|
}
|
|
872
876
|
}
|
|
873
|
-
} catch
|
|
874
|
-
|
|
877
|
+
} catch {
|
|
878
|
+
// Can't parse plan — skip silently
|
|
875
879
|
}
|
|
876
880
|
}
|
|
877
881
|
|
|
@@ -1021,7 +1025,9 @@ export async function repairStaleRenders(basePath: string): Promise<number> {
|
|
|
1021
1025
|
}
|
|
1022
1026
|
}
|
|
1023
1027
|
} catch (err) {
|
|
1024
|
-
|
|
1028
|
+
process.stderr.write(
|
|
1029
|
+
`markdown-renderer: repair failed for ${entry.path}: ${(err as Error).message}\n`,
|
|
1030
|
+
);
|
|
1025
1031
|
}
|
|
1026
1032
|
}
|
|
1027
1033
|
|
|
@@ -31,7 +31,6 @@ import {
|
|
|
31
31
|
import { findMilestoneIds } from './guided-flow.js';
|
|
32
32
|
import { parseRoadmap, parsePlan } from './parsers-legacy.js';
|
|
33
33
|
import { parseContextDependsOn } from './files.js';
|
|
34
|
-
import { logWarning } from './workflow-logger.js';
|
|
35
34
|
|
|
36
35
|
// ─── DECISIONS.md Parser ───────────────────────────────────────────────────
|
|
37
36
|
|
|
@@ -713,25 +712,25 @@ export function migrateFromMarkdown(gsdDir: string): {
|
|
|
713
712
|
try {
|
|
714
713
|
decisions = importDecisions(gsdDir);
|
|
715
714
|
} catch (err) {
|
|
716
|
-
|
|
715
|
+
process.stderr.write(`gsd-migrate: skipping decisions import: ${(err as Error).message}\n`);
|
|
717
716
|
}
|
|
718
717
|
|
|
719
718
|
try {
|
|
720
719
|
requirements = importRequirements(gsdDir);
|
|
721
720
|
} catch (err) {
|
|
722
|
-
|
|
721
|
+
process.stderr.write(`gsd-migrate: skipping requirements import: ${(err as Error).message}\n`);
|
|
723
722
|
}
|
|
724
723
|
|
|
725
724
|
try {
|
|
726
725
|
artifacts = importHierarchyArtifacts(gsdDir);
|
|
727
726
|
} catch (err) {
|
|
728
|
-
|
|
727
|
+
process.stderr.write(`gsd-migrate: skipping artifacts import: ${(err as Error).message}\n`);
|
|
729
728
|
}
|
|
730
729
|
|
|
731
730
|
try {
|
|
732
731
|
hierarchy = migrateHierarchyToDb(gsdDir);
|
|
733
732
|
} catch (err) {
|
|
734
|
-
|
|
733
|
+
process.stderr.write(`gsd-migrate: skipping hierarchy migration: ${(err as Error).message}\n`);
|
|
735
734
|
}
|
|
736
735
|
});
|
|
737
736
|
|
|
@@ -21,7 +21,6 @@ import {
|
|
|
21
21
|
import { invalidateAllCaches } from "./cache.js";
|
|
22
22
|
import { loadQueueOrder, saveQueueOrder } from "./queue-order.js";
|
|
23
23
|
import { isDbAvailable, updateMilestoneStatus } from "./gsd-db.js";
|
|
24
|
-
import { logWarning } from "./workflow-logger.js";
|
|
25
24
|
|
|
26
25
|
// ─── Park ──────────────────────────────────────────────────────────────────
|
|
27
26
|
|
|
@@ -59,7 +58,7 @@ export function parkMilestone(basePath: string, milestoneId: string, reason: str
|
|
|
59
58
|
try {
|
|
60
59
|
updateMilestoneStatus(milestoneId, "parked");
|
|
61
60
|
} catch (err) {
|
|
62
|
-
|
|
61
|
+
process.stderr.write(`gsd: parkMilestone DB sync failed for ${milestoneId}: ${(err as Error).message}\n`);
|
|
63
62
|
}
|
|
64
63
|
}
|
|
65
64
|
invalidateAllCaches();
|
|
@@ -85,7 +84,7 @@ export function unparkMilestone(basePath: string, milestoneId: string): boolean
|
|
|
85
84
|
try {
|
|
86
85
|
updateMilestoneStatus(milestoneId, "active");
|
|
87
86
|
} catch (err) {
|
|
88
|
-
|
|
87
|
+
process.stderr.write(`gsd: unparkMilestone DB sync failed for ${milestoneId}: ${(err as Error).message}\n`);
|
|
89
88
|
}
|
|
90
89
|
}
|
|
91
90
|
invalidateAllCaches();
|
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { randomInt } from "node:crypto";
|
|
9
|
-
import { logWarning } from "./workflow-logger.js";
|
|
10
9
|
import { readdirSync, existsSync } from "node:fs";
|
|
11
10
|
import { milestonesDir } from "./paths.js";
|
|
12
11
|
import { loadQueueOrder, sortByQueueOrder } from "./queue-order.js";
|
|
@@ -129,7 +128,7 @@ export function findMilestoneIds(basePath: string): string[] {
|
|
|
129
128
|
} catch (err) {
|
|
130
129
|
// Log why milestone scanning failed — silent [] here causes infinite loops (#456)
|
|
131
130
|
if (existsSync(dir)) {
|
|
132
|
-
|
|
131
|
+
console.error(`[gsd] findMilestoneIds: .gsd/milestones/ exists but readdirSync failed — ${getErrorMessage(err)}`);
|
|
133
132
|
}
|
|
134
133
|
return [];
|
|
135
134
|
}
|