gsd-pi 2.60.0-dev.d9052f5 → 2.61.0-dev.7aed0bf

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.
Files changed (198) hide show
  1. package/dist/resources/extensions/ask-user-questions.js +7 -4
  2. package/dist/resources/extensions/gsd/auto/phases.js +15 -7
  3. package/dist/resources/extensions/gsd/auto-dashboard.js +21 -8
  4. package/dist/resources/extensions/gsd/auto-dispatch.js +6 -3
  5. package/dist/resources/extensions/gsd/auto-model-selection.js +58 -9
  6. package/dist/resources/extensions/gsd/auto-post-unit.js +3 -2
  7. package/dist/resources/extensions/gsd/auto-prompts.js +36 -20
  8. package/dist/resources/extensions/gsd/auto-recovery.js +37 -18
  9. package/dist/resources/extensions/gsd/auto-start.js +9 -5
  10. package/dist/resources/extensions/gsd/auto-timers.js +11 -5
  11. package/dist/resources/extensions/gsd/auto-unit-closeout.js +5 -3
  12. package/dist/resources/extensions/gsd/auto-verification.js +3 -2
  13. package/dist/resources/extensions/gsd/auto-worktree.js +120 -55
  14. package/dist/resources/extensions/gsd/auto.js +39 -17
  15. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +6 -3
  16. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +2 -2
  17. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +4 -10
  18. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +2 -1
  19. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -0
  20. package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -10
  21. package/dist/resources/extensions/gsd/commands/catalog.js +2 -0
  22. package/dist/resources/extensions/gsd/commands-codebase.js +48 -21
  23. package/dist/resources/extensions/gsd/commands-inspect.js +2 -1
  24. package/dist/resources/extensions/gsd/commands-maintenance.js +32 -19
  25. package/dist/resources/extensions/gsd/complexity-classifier.js +8 -4
  26. package/dist/resources/extensions/gsd/custom-verification.js +3 -2
  27. package/dist/resources/extensions/gsd/gsd-db.js +33 -13
  28. package/dist/resources/extensions/gsd/guided-flow.js +19 -9
  29. package/dist/resources/extensions/gsd/init-wizard.js +12 -0
  30. package/dist/resources/extensions/gsd/markdown-renderer.js +11 -9
  31. package/dist/resources/extensions/gsd/md-importer.js +5 -4
  32. package/dist/resources/extensions/gsd/milestone-actions.js +3 -2
  33. package/dist/resources/extensions/gsd/milestone-ids.js +2 -1
  34. package/dist/resources/extensions/gsd/model-router.js +156 -121
  35. package/dist/resources/extensions/gsd/parallel-merge.js +5 -3
  36. package/dist/resources/extensions/gsd/parallel-orchestrator.js +26 -14
  37. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  38. package/dist/resources/extensions/gsd/preferences-validation.js +45 -0
  39. package/dist/resources/extensions/gsd/preferences.js +15 -3
  40. package/dist/resources/extensions/gsd/prompt-loader.js +3 -2
  41. package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
  42. package/dist/resources/extensions/gsd/rule-registry.js +7 -6
  43. package/dist/resources/extensions/gsd/safe-fs.js +6 -8
  44. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  45. package/dist/resources/extensions/gsd/tools/complete-slice.js +3 -2
  46. package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
  47. package/dist/resources/extensions/gsd/tools/plan-milestone.js +3 -2
  48. package/dist/resources/extensions/gsd/tools/plan-slice.js +3 -2
  49. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -1
  50. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +4 -4
  51. package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -1
  52. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -1
  53. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -1
  54. package/dist/resources/extensions/gsd/tools/validate-milestone.js +2 -1
  55. package/dist/resources/extensions/gsd/triage-resolution.js +11 -4
  56. package/dist/resources/extensions/gsd/workflow-events.js +2 -1
  57. package/dist/resources/extensions/gsd/workflow-logger.js +37 -4
  58. package/dist/resources/extensions/gsd/workflow-migration.js +14 -12
  59. package/dist/resources/extensions/gsd/workflow-projections.js +2 -2
  60. package/dist/resources/extensions/gsd/workflow-reconcile.js +2 -2
  61. package/dist/resources/extensions/gsd/worktree-manager.js +26 -14
  62. package/dist/resources/extensions/shared/interview-ui.js +3 -1
  63. package/dist/web/standalone/.next/BUILD_ID +1 -1
  64. package/dist/web/standalone/.next/app-path-routes-manifest.json +19 -19
  65. package/dist/web/standalone/.next/build-manifest.json +2 -2
  66. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  67. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  68. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  69. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  70. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  71. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  72. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  74. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  75. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  76. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  77. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  78. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  79. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  80. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  81. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  82. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  83. package/dist/web/standalone/.next/server/app/index.html +1 -1
  84. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  88. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  89. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  90. package/dist/web/standalone/.next/server/app-paths-manifest.json +19 -19
  91. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  92. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  93. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  94. package/package.json +1 -1
  95. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  96. package/packages/pi-coding-agent/dist/core/extensions/loader.js +5 -0
  97. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  98. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -1
  99. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  100. package/packages/pi-coding-agent/dist/core/extensions/runner.js +16 -0
  101. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  102. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +26 -0
  103. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  104. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  105. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -1
  106. package/packages/pi-coding-agent/dist/core/lsp/config.js +6 -1
  107. package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -1
  108. package/packages/pi-coding-agent/dist/core/lsp/defaults.json +2 -2
  109. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.d.ts +2 -0
  110. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.d.ts.map +1 -0
  111. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js +47 -0
  112. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js.map +1 -0
  113. package/packages/pi-coding-agent/package.json +1 -1
  114. package/packages/pi-coding-agent/src/core/extensions/loader.ts +6 -0
  115. package/packages/pi-coding-agent/src/core/extensions/runner.ts +19 -0
  116. package/packages/pi-coding-agent/src/core/extensions/types.ts +26 -0
  117. package/packages/pi-coding-agent/src/core/lsp/config.ts +7 -1
  118. package/packages/pi-coding-agent/src/core/lsp/defaults.json +2 -2
  119. package/packages/pi-coding-agent/src/core/lsp/lsp-legacy-alias.test.ts +70 -0
  120. package/pkg/package.json +1 -1
  121. package/src/resources/extensions/ask-user-questions.ts +7 -3
  122. package/src/resources/extensions/gsd/auto/phases.ts +17 -7
  123. package/src/resources/extensions/gsd/auto-dashboard.ts +22 -8
  124. package/src/resources/extensions/gsd/auto-dispatch.ts +7 -3
  125. package/src/resources/extensions/gsd/auto-model-selection.ts +77 -15
  126. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -4
  127. package/src/resources/extensions/gsd/auto-prompts.ts +37 -20
  128. package/src/resources/extensions/gsd/auto-recovery.ts +38 -18
  129. package/src/resources/extensions/gsd/auto-start.ts +10 -9
  130. package/src/resources/extensions/gsd/auto-timers.ts +12 -5
  131. package/src/resources/extensions/gsd/auto-unit-closeout.ts +6 -2
  132. package/src/resources/extensions/gsd/auto-verification.ts +3 -6
  133. package/src/resources/extensions/gsd/auto-worktree.ts +121 -55
  134. package/src/resources/extensions/gsd/auto.ts +40 -17
  135. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +4 -3
  136. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +2 -2
  137. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +4 -16
  138. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +2 -1
  139. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +8 -0
  140. package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -10
  141. package/src/resources/extensions/gsd/commands/catalog.ts +2 -0
  142. package/src/resources/extensions/gsd/commands-codebase.ts +52 -20
  143. package/src/resources/extensions/gsd/commands-inspect.ts +2 -1
  144. package/src/resources/extensions/gsd/commands-maintenance.ts +28 -19
  145. package/src/resources/extensions/gsd/complexity-classifier.ts +9 -4
  146. package/src/resources/extensions/gsd/custom-verification.ts +3 -2
  147. package/src/resources/extensions/gsd/gsd-db.ts +12 -14
  148. package/src/resources/extensions/gsd/guided-flow.ts +9 -8
  149. package/src/resources/extensions/gsd/init-wizard.ts +12 -0
  150. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -17
  151. package/src/resources/extensions/gsd/md-importer.ts +5 -4
  152. package/src/resources/extensions/gsd/milestone-actions.ts +3 -2
  153. package/src/resources/extensions/gsd/milestone-ids.ts +2 -1
  154. package/src/resources/extensions/gsd/model-router.ts +199 -173
  155. package/src/resources/extensions/gsd/parallel-merge.ts +5 -3
  156. package/src/resources/extensions/gsd/parallel-orchestrator.ts +18 -14
  157. package/src/resources/extensions/gsd/preferences-types.ts +13 -0
  158. package/src/resources/extensions/gsd/preferences-validation.ts +45 -0
  159. package/src/resources/extensions/gsd/preferences.ts +16 -3
  160. package/src/resources/extensions/gsd/prompt-loader.ts +3 -2
  161. package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
  162. package/src/resources/extensions/gsd/rule-registry.ts +7 -6
  163. package/src/resources/extensions/gsd/safe-fs.ts +6 -5
  164. package/src/resources/extensions/gsd/tests/capability-router.test.ts +347 -0
  165. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +63 -0
  166. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +27 -2
  167. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +4 -4
  168. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +1188 -0
  169. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +841 -0
  170. package/src/resources/extensions/gsd/tests/model-router.test.ts +403 -3
  171. package/src/resources/extensions/gsd/tests/preferences.test.ts +62 -0
  172. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +21 -0
  173. package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +284 -0
  174. package/src/resources/extensions/gsd/tests/workflow-logger-audit.test.ts +120 -0
  175. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +6 -6
  176. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -6
  177. package/src/resources/extensions/gsd/tools/complete-slice.ts +3 -6
  178. package/src/resources/extensions/gsd/tools/complete-task.ts +3 -6
  179. package/src/resources/extensions/gsd/tools/plan-milestone.ts +3 -6
  180. package/src/resources/extensions/gsd/tools/plan-slice.ts +3 -6
  181. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -3
  182. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +4 -6
  183. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -3
  184. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -3
  185. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -3
  186. package/src/resources/extensions/gsd/tools/validate-milestone.ts +2 -3
  187. package/src/resources/extensions/gsd/triage-resolution.ts +11 -4
  188. package/src/resources/extensions/gsd/types.ts +1 -0
  189. package/src/resources/extensions/gsd/workflow-events.ts +2 -1
  190. package/src/resources/extensions/gsd/workflow-logger.ts +52 -5
  191. package/src/resources/extensions/gsd/workflow-migration.ts +14 -12
  192. package/src/resources/extensions/gsd/workflow-projections.ts +2 -2
  193. package/src/resources/extensions/gsd/workflow-reconcile.ts +2 -2
  194. package/src/resources/extensions/gsd/worktree-manager.ts +16 -14
  195. package/src/resources/extensions/shared/interview-ui.ts +3 -1
  196. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +144 -0
  197. /package/dist/web/standalone/.next/static/{JVkoVYumy0cDhOQISEYdG → b7FOoMHaUb3FPoLNbxar4}/_buildManifest.js +0 -0
  198. /package/dist/web/standalone/.next/static/{JVkoVYumy0cDhOQISEYdG → b7FOoMHaUb3FPoLNbxar4}/_ssgManifest.js +0 -0
@@ -16,6 +16,7 @@ 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;
19
20
  }
20
21
 
21
22
  export interface TaskMetadata {
@@ -71,17 +72,20 @@ export function classifyUnitComplexity(
71
72
  ): ClassificationResult {
72
73
  // Hook units default to light
73
74
  if (unitType.startsWith("hook/")) {
74
- const result: ClassificationResult = { tier: "light", reason: "hook unit", downgraded: false };
75
+ const result: ClassificationResult = { tier: "light", reason: "hook unit", downgraded: false, taskMetadata: undefined };
75
76
  return applyBudgetPressure(result, budgetPct);
76
77
  }
77
78
 
78
79
  // Start with the default tier for this unit type
79
80
  let tier = UNIT_TYPE_TIERS[unitType] ?? "standard";
80
81
  let reason = `unit type: ${unitType}`;
82
+ let taskMeta: TaskMetadata | undefined;
81
83
 
82
84
  // For execute-task, analyze task metadata for complexity signals
83
85
  if (unitType === "execute-task") {
84
- const taskAnalysis = analyzeTaskComplexity(unitId, basePath, metadata);
86
+ // Extract metadata once and reuse throughout to avoid double-extraction
87
+ taskMeta = metadata ?? extractTaskMetadata(unitId, basePath);
88
+ const taskAnalysis = analyzeTaskComplexity(unitId, basePath, taskMeta);
85
89
  tier = taskAnalysis.tier;
86
90
  reason = taskAnalysis.reason;
87
91
  }
@@ -96,14 +100,15 @@ export function classifyUnitComplexity(
96
100
  }
97
101
 
98
102
  // Adaptive learning: check if history suggests bumping the tier
99
- const tags = metadata?.tags ?? extractTaskMetadata(unitId, basePath).tags;
103
+ // Use already-extracted taskMeta.tags if available to avoid double-extraction
104
+ const tags = taskMeta?.tags ?? metadata?.tags;
100
105
  const adaptiveAdjustment = getAdaptiveTierAdjustment(unitType, tier, tags);
101
106
  if (adaptiveAdjustment && tierOrdinal(adaptiveAdjustment) > tierOrdinal(tier)) {
102
107
  reason = `${reason} (adaptive: high failure rate at ${tier})`;
103
108
  tier = adaptiveAdjustment;
104
109
  }
105
110
 
106
- const result: ClassificationResult = { tier, reason, downgraded: false };
111
+ const result: ClassificationResult = { tier, reason, downgraded: false, taskMetadata: taskMeta };
107
112
  return applyBudgetPressure(result, budgetPct);
108
113
  }
109
114
 
@@ -17,6 +17,7 @@
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";
20
21
  import { readFileSync, existsSync, statSync } from "node:fs";
21
22
  import { join, resolve, sep } from "node:path";
22
23
  import { spawnSync } from "node:child_process";
@@ -130,8 +131,8 @@ function handleContentHeuristic(
130
131
  if (!new RegExp(verify.pattern).test(content)) {
131
132
  return "pause";
132
133
  }
133
- } catch {
134
- // Invalid regex at runtime — treat as verification failure
134
+ } catch (e) {
135
+ logWarning("engine", `content-heuristic regex failed: ${(e as Error).message}`);
135
136
  return "pause";
136
137
  }
137
138
  }
@@ -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 } from "./workflow-logger.js";
13
+ import { logError, logWarning } 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 { /* swallow */ }
790
+ try { adapter.close(); } catch (e) { logWarning("db", `close after VACUUM failed: ${(e as Error).message}`); }
791
791
  throw retryErr;
792
792
  }
793
793
  } else {
794
- try { adapter.close(); } catch { /* swallow */ }
794
+ try { adapter.close(); } catch (e) { logWarning("db", `close after VACUUM failed: ${(e as Error).message}`); }
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 (e) { logWarning("db", `exit handler close failed: ${(e as Error).message}`); } });
806
806
  }
807
807
 
808
808
  return true;
@@ -812,16 +812,14 @@ export function closeDatabase(): void {
812
812
  if (currentDb) {
813
813
  try {
814
814
  currentDb.exec('PRAGMA wal_checkpoint(TRUNCATE)');
815
- } catch { /* non-fatal best effort before close */ }
815
+ } catch (e) { logWarning("db", `WAL checkpoint failed: ${(e as Error).message}`); }
816
816
  try {
817
817
  // Incremental vacuum to reclaim space without blocking
818
818
  currentDb.exec('PRAGMA incremental_vacuum(64)');
819
- } catch { /* non-fatal */ }
819
+ } catch (e) { logWarning("db", `incremental vacuum failed: ${(e as Error).message}`); }
820
820
  try {
821
821
  currentDb.close();
822
- } catch {
823
- // swallow close errors
824
- }
822
+ } catch (e) { logWarning("db", `database close failed: ${(e as Error).message}`); }
825
823
  currentDb = null;
826
824
  currentPath = null;
827
825
  currentPid = 0;
@@ -833,7 +831,7 @@ export function vacuumDatabase(): void {
833
831
  if (!currentDb) return;
834
832
  try {
835
833
  currentDb.exec('VACUUM');
836
- } catch { /* non-fatal */ }
834
+ } catch (e) { logWarning("db", `VACUUM failed: ${(e as Error).message}`); }
837
835
  }
838
836
 
839
837
  let _txDepth = 0;
@@ -1038,7 +1036,7 @@ export function upsertRequirement(r: Requirement): void {
1038
1036
 
1039
1037
  export function clearArtifacts(): void {
1040
1038
  if (!currentDb) return;
1041
- try { currentDb.exec("DELETE FROM artifacts"); } catch { /* cache clear is best effort */ }
1039
+ try { currentDb.exec("DELETE FROM artifacts"); } catch (e) { logWarning("db", `clearArtifacts failed: ${(e as Error).message}`); }
1042
1040
  }
1043
1041
 
1044
1042
  export function insertArtifact(a: {
@@ -1801,7 +1799,7 @@ export function reconcileWorktreeDb(
1801
1799
  // ATTACHing a WAL-mode DB to itself corrupts the WAL (#2823).
1802
1800
  try {
1803
1801
  if (realpathSync(mainDbPath) === realpathSync(worktreeDbPath)) return zero;
1804
- } catch { /* path resolution failed fall through to existing checks */ }
1802
+ } catch (e) { logWarning("db", `realpathSync failed: ${(e as Error).message}`); }
1805
1803
  // Sanitize path: reject any characters that could break ATTACH syntax.
1806
1804
  // ATTACH DATABASE doesn't support parameterized paths in all providers,
1807
1805
  // so we use strict allowlist validation instead.
@@ -1938,12 +1936,12 @@ export function reconcileWorktreeDb(
1938
1936
 
1939
1937
  adapter.exec("COMMIT");
1940
1938
  } catch (txErr) {
1941
- try { adapter.exec("ROLLBACK"); } catch { /* best effort */ }
1939
+ try { adapter.exec("ROLLBACK"); } catch (e) { logWarning("db", `rollback failed: ${(e as Error).message}`); }
1942
1940
  throw txErr;
1943
1941
  }
1944
1942
  return { ...merged, conflicts };
1945
1943
  } finally {
1946
- try { adapter.exec("DETACH DATABASE wt"); } catch { /* best effort */ }
1944
+ try { adapter.exec("DETACH DATABASE wt"); } catch (e) { logWarning("db", `detach worktree DB failed: ${(e as Error).message}`); }
1947
1945
  }
1948
1946
  } catch (err) {
1949
1947
  logError("db", "worktree DB reconciliation failed", { error: (err as Error).message });
@@ -52,6 +52,7 @@ 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";
55
56
 
56
57
  // ─── ID Generation with Reservation ─────────────────────────────────────────
57
58
 
@@ -180,7 +181,7 @@ export function checkAutoStartAfterDiscuss(): boolean {
180
181
  );
181
182
  }
182
183
  }
183
- } catch { /* non-fatal — PROJECT.md parsing failure shouldn't block auto-start */ }
184
+ } catch (e) { logWarning("guided", `PROJECT.md parsing failed: ${(e as Error).message}`); }
184
185
  }
185
186
 
186
187
  // Gate 4: Discussion manifest process verification (multi-milestone only)
@@ -212,7 +213,7 @@ export function checkAutoStartAfterDiscuss(): boolean {
212
213
  );
213
214
  }
214
215
  }
215
- } catch { /* malformed manifest warn but don't block */ }
216
+ } catch (e) { logWarning("guided", `discussion manifest verification failed: ${(e as Error).message}`); }
216
217
  }
217
218
 
218
219
  // Draft promotion cleanup: if a CONTEXT-DRAFT.md exists alongside the new
@@ -220,16 +221,16 @@ export function checkAutoStartAfterDiscuss(): boolean {
220
221
  try {
221
222
  const draftFile = resolveMilestoneFile(basePath, milestoneId, "CONTEXT-DRAFT");
222
223
  if (draftFile) unlinkSync(draftFile);
223
- } catch { /* non-fatal stale draft doesn't break anything, CONTEXT.md wins */ }
224
+ } catch (e) { logWarning("guided", `CONTEXT-DRAFT.md unlink failed: ${(e as Error).message}`); }
224
225
 
225
226
  // Cleanup: remove discussion manifest after auto-start (only needed during discussion)
226
- try { unlinkSync(manifestPath); } catch { /* may not exist for single-milestone */ }
227
+ try { unlinkSync(manifestPath); } catch (e) { logWarning("guided", `manifest unlink failed: ${(e as Error).message}`); }
227
228
 
228
229
  pendingAutoStartMap.delete(basePath);
229
230
  ctx.ui.notify(`Milestone ${milestoneId} ready.`, "info");
230
231
  startAuto(ctx, pi, basePath, false, { step }).catch((err) => {
231
232
  ctx.ui.notify(`Auto-start failed: ${getErrorMessage(err)}`, "error");
232
- if (process.env.GSD_DEBUG) console.error('[gsd] auto start error:', err);
233
+ logWarning("guided", `auto start error: ${getErrorMessage(err)}`);
233
234
  debugLog("auto-start-failed", { error: getErrorMessage(err) });
234
235
  });
235
236
  return true;
@@ -895,8 +896,8 @@ function selfHealRuntimeRecords(basePath: string, ctx: ExtensionContext): { clea
895
896
  ctx.ui.notify(`Self-heal: cleared ${cleared} stale runtime record(s) from a previous session.`, "info");
896
897
  }
897
898
  return { cleared };
898
- } catch {
899
- // Non-fatal — self-heal should never block the wizard
899
+ } catch (e) {
900
+ logWarning("guided", `self-heal stale runtime records failed: ${(e as Error).message}`);
900
901
  return { cleared: 0 };
901
902
  }
902
903
  }
@@ -1142,7 +1143,7 @@ export async function showSmartEntry(
1142
1143
  );
1143
1144
  return;
1144
1145
  }
1145
- } catch { /* directory exists but unreadable fall through to normal flow */ }
1146
+ } catch (e) { logWarning("guided", `directory read failed: ${(e as Error).message}`); }
1146
1147
  }
1147
1148
  }
1148
1149
 
@@ -16,6 +16,7 @@ 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";
19
20
 
20
21
  // ─── Types ──────────────────────────────────────────────────────────────────────
21
22
 
@@ -238,6 +239,17 @@ export async function showProjectInit(
238
239
  ensureGitignore(basePath);
239
240
  untrackRuntimeFiles(basePath);
240
241
 
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
+
241
253
  ctx.ui.notify("GSD initialized. Starting your first milestone...", "info");
242
254
 
243
255
  return { completed: true, bootstrapped: true };
@@ -9,6 +9,7 @@
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";
12
13
  import { isClosedStatus } from "./status-guards.js";
13
14
  import { join, relative } from "node:path";
14
15
  import { createRequire } from "node:module";
@@ -93,9 +94,7 @@ function loadArtifactContent(
93
94
  try {
94
95
  content = readFileSync(absPath, "utf-8");
95
96
  } catch {
96
- process.stderr.write(
97
- `markdown-renderer: cannot read file from disk: ${absPath}\n`,
98
- );
97
+ logWarning("renderer", `cannot read file from disk: ${absPath}`);
99
98
  return null;
100
99
  }
101
100
 
@@ -111,9 +110,7 @@ function loadArtifactContent(
111
110
  });
112
111
  } catch {
113
112
  // Non-fatal: we have the content, DB storage is best-effort
114
- process.stderr.write(
115
- `markdown-renderer: warning — failed to store disk fallback in DB: ${artifactPath}\n`,
116
- );
113
+ logWarning("renderer", `failed to store disk fallback in DB: ${artifactPath}`);
117
114
  }
118
115
 
119
116
  return content;
@@ -146,9 +143,7 @@ async function writeAndStore(
146
143
  });
147
144
  } catch {
148
145
  // Non-fatal: file is on disk, DB is best-effort
149
- process.stderr.write(
150
- `markdown-renderer: warning — failed to update artifact in DB: ${artifactPath}\n`,
151
- );
146
+ logWarning("renderer", `failed to update artifact in DB: ${artifactPath}`);
152
147
  }
153
148
 
154
149
  invalidateCaches();
@@ -806,7 +801,8 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
806
801
  try {
807
802
  const m = _require("./parsers-legacy.ts");
808
803
  parseRoadmap = m.parseRoadmap; parsePlan = m.parsePlan;
809
- } catch {
804
+ } catch (e) {
805
+ logWarning("renderer", `parsers-legacy.ts require failed, falling back to .js: ${(e as Error).message}`);
810
806
  const m = _require("./parsers-legacy.js");
811
807
  parseRoadmap = m.parseRoadmap; parsePlan = m.parsePlan;
812
808
  }
@@ -841,8 +837,8 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
841
837
  });
842
838
  }
843
839
  }
844
- } catch {
845
- // Can't parse roadmap skip silently
840
+ } catch (e) {
841
+ logWarning("renderer", `roadmap parse failed: ${(e as Error).message}`);
846
842
  }
847
843
  }
848
844
 
@@ -874,8 +870,8 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
874
870
  });
875
871
  }
876
872
  }
877
- } catch {
878
- // Can't parse plan skip silently
873
+ } catch (e) {
874
+ logWarning("renderer", `plan parse failed: ${(e as Error).message}`);
879
875
  }
880
876
  }
881
877
 
@@ -1025,9 +1021,7 @@ export async function repairStaleRenders(basePath: string): Promise<number> {
1025
1021
  }
1026
1022
  }
1027
1023
  } catch (err) {
1028
- process.stderr.write(
1029
- `markdown-renderer: repair failed for ${entry.path}: ${(err as Error).message}\n`,
1030
- );
1024
+ logWarning("renderer", `repair failed for ${entry.path}: ${(err as Error).message}`);
1031
1025
  }
1032
1026
  }
1033
1027
 
@@ -31,6 +31,7 @@ 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';
34
35
 
35
36
  // ─── DECISIONS.md Parser ───────────────────────────────────────────────────
36
37
 
@@ -712,25 +713,25 @@ export function migrateFromMarkdown(gsdDir: string): {
712
713
  try {
713
714
  decisions = importDecisions(gsdDir);
714
715
  } catch (err) {
715
- process.stderr.write(`gsd-migrate: skipping decisions import: ${(err as Error).message}\n`);
716
+ logWarning("migration", `skipping decisions import: ${(err as Error).message}`);
716
717
  }
717
718
 
718
719
  try {
719
720
  requirements = importRequirements(gsdDir);
720
721
  } catch (err) {
721
- process.stderr.write(`gsd-migrate: skipping requirements import: ${(err as Error).message}\n`);
722
+ logWarning("migration", `skipping requirements import: ${(err as Error).message}`);
722
723
  }
723
724
 
724
725
  try {
725
726
  artifacts = importHierarchyArtifacts(gsdDir);
726
727
  } catch (err) {
727
- process.stderr.write(`gsd-migrate: skipping artifacts import: ${(err as Error).message}\n`);
728
+ logWarning("migration", `skipping artifacts import: ${(err as Error).message}`);
728
729
  }
729
730
 
730
731
  try {
731
732
  hierarchy = migrateHierarchyToDb(gsdDir);
732
733
  } catch (err) {
733
- process.stderr.write(`gsd-migrate: skipping hierarchy migration: ${(err as Error).message}\n`);
734
+ logWarning("migration", `skipping hierarchy migration: ${(err as Error).message}`);
734
735
  }
735
736
  });
736
737
 
@@ -21,6 +21,7 @@ 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";
24
25
 
25
26
  // ─── Park ──────────────────────────────────────────────────────────────────
26
27
 
@@ -58,7 +59,7 @@ export function parkMilestone(basePath: string, milestoneId: string, reason: str
58
59
  try {
59
60
  updateMilestoneStatus(milestoneId, "parked");
60
61
  } catch (err) {
61
- process.stderr.write(`gsd: parkMilestone DB sync failed for ${milestoneId}: ${(err as Error).message}\n`);
62
+ logWarning("engine", `parkMilestone DB sync failed for ${milestoneId}: ${(err as Error).message}`);
62
63
  }
63
64
  }
64
65
  invalidateAllCaches();
@@ -84,7 +85,7 @@ export function unparkMilestone(basePath: string, milestoneId: string): boolean
84
85
  try {
85
86
  updateMilestoneStatus(milestoneId, "active");
86
87
  } catch (err) {
87
- process.stderr.write(`gsd: unparkMilestone DB sync failed for ${milestoneId}: ${(err as Error).message}\n`);
88
+ logWarning("engine", `unparkMilestone DB sync failed for ${milestoneId}: ${(err as Error).message}`);
88
89
  }
89
90
  }
90
91
  invalidateAllCaches();
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  import { randomInt } from "node:crypto";
9
+ import { logWarning } from "./workflow-logger.js";
9
10
  import { readdirSync, existsSync } from "node:fs";
10
11
  import { milestonesDir } from "./paths.js";
11
12
  import { loadQueueOrder, sortByQueueOrder } from "./queue-order.js";
@@ -128,7 +129,7 @@ export function findMilestoneIds(basePath: string): string[] {
128
129
  } catch (err) {
129
130
  // Log why milestone scanning failed — silent [] here causes infinite loops (#456)
130
131
  if (existsSync(dir)) {
131
- console.error(`[gsd] findMilestoneIds: .gsd/milestones/ exists but readdirSync failed — ${getErrorMessage(err)}`);
132
+ logWarning("engine", `findMilestoneIds: .gsd/milestones/ exists but readdirSync failed — ${getErrorMessage(err)}`);
132
133
  }
133
134
  return [];
134
135
  }