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
@@ -44,7 +44,7 @@ import {
44
44
  } from "./worktree.js";
45
45
  import { MergeConflictError, readIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
46
46
  import { debugLog } from "./debug-logger.js";
47
- import { logWarning } from "./workflow-logger.js";
47
+ import { logWarning, logError } from "./workflow-logger.js";
48
48
  import { loadEffectiveGSDPreferences } from "./preferences.js";
49
49
  import {
50
50
  nativeGetCurrentBranch,
@@ -100,7 +100,8 @@ const ROOT_STATE_FILES = [
100
100
  function isSamePath(a: string, b: string): boolean {
101
101
  try {
102
102
  return realpathSync(a) === realpathSync(b);
103
- } catch {
103
+ } catch (e) {
104
+ logWarning("worktree", `isSamePath failed: ${(e as Error).message}`);
104
105
  return false;
105
106
  }
106
107
  }
@@ -153,16 +154,19 @@ function forceOverwriteAssessmentsWithVerdict(
153
154
  // Source has a verdict — force-copy into worktree
154
155
  mkdirSync(dstSliceDir, { recursive: true });
155
156
  safeCopy(srcFile, join(dstSliceDir, fileEntry.name), { force: true });
156
- } catch {
157
+ } catch (err) {
157
158
  /* non-fatal per file */
159
+ logWarning("worktree", `assessment force-copy failed: ${err instanceof Error ? err.message : String(err)}`);
158
160
  }
159
161
  }
160
- } catch {
162
+ } catch (err) {
161
163
  /* non-fatal per slice */
164
+ logWarning("worktree", `assessment slice scan failed: ${err instanceof Error ? err.message : String(err)}`);
162
165
  }
163
166
  }
164
- } catch {
167
+ } catch (err) {
165
168
  /* non-fatal */
169
+ logWarning("worktree", `assessment sync failed: ${err instanceof Error ? err.message : String(err)}`);
166
170
  }
167
171
  }
168
172
 
@@ -182,8 +186,9 @@ function clearProjectRootStateFiles(basePath: string, milestoneId: string): void
182
186
  for (const file of transientFiles) {
183
187
  try {
184
188
  unlinkSync(file);
185
- } catch {
189
+ } catch (err) {
186
190
  /* non-fatal — file may not exist */
191
+ logWarning("worktree", `file unlink failed: ${err instanceof Error ? err.message : String(err)}`);
187
192
  }
188
193
  }
189
194
 
@@ -211,14 +216,16 @@ function clearProjectRootStateFiles(basePath: string, milestoneId: string): void
211
216
  for (const f of untrackedOutput.split("\n").filter(Boolean)) {
212
217
  try {
213
218
  unlinkSync(join(basePath, f));
214
- } catch {
219
+ } catch (err) {
215
220
  /* non-fatal */
221
+ logWarning("worktree", `untracked file unlink failed: ${err instanceof Error ? err.message : String(err)}`);
216
222
  }
217
223
  }
218
224
  }
219
225
  }
220
- } catch {
226
+ } catch (err) {
221
227
  /* non-fatal — git command may fail if not in repo */
228
+ logWarning("worktree", `untracked file cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
222
229
  }
223
230
  }
224
231
  }
@@ -313,8 +320,9 @@ export function syncProjectRootToWorktree(
313
320
  unlinkSync(wtDb);
314
321
  }
315
322
  }
316
- } catch {
323
+ } catch (err) {
317
324
  /* non-fatal */
325
+ logWarning("worktree", `worktree DB cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
318
326
  }
319
327
  }
320
328
 
@@ -383,7 +391,8 @@ export function readResourceVersion(): string | null {
383
391
  return typeof manifest?.gsdVersion === "string"
384
392
  ? manifest.gsdVersion
385
393
  : null;
386
- } catch {
394
+ } catch (e) {
395
+ logWarning("worktree", `readResourceVersion failed: ${(e as Error).message}`);
387
396
  return null;
388
397
  }
389
398
  }
@@ -449,8 +458,9 @@ export function escapeStaleWorktree(base: string): string {
449
458
 
450
459
  try {
451
460
  process.chdir(projectRoot);
452
- } catch {
461
+ } catch (e) {
453
462
  // If chdir fails, return the original — caller will handle errors downstream
463
+ logWarning("worktree", `escapeStaleWorktree chdir failed: ${(e as Error).message}`);
454
464
  return base;
455
465
  }
456
466
  return projectRoot;
@@ -480,13 +490,15 @@ export function cleanStaleRuntimeUnits(
480
490
  try {
481
491
  unlinkSync(join(runtimeUnitsDir, file));
482
492
  cleaned++;
483
- } catch {
493
+ } catch (err) {
484
494
  /* non-fatal */
495
+ logWarning("worktree", `stale runtime unit unlink failed (${file}): ${err instanceof Error ? err.message : String(err)}`);
485
496
  }
486
497
  }
487
498
  }
488
- } catch {
499
+ } catch (err) {
489
500
  /* non-fatal */
501
+ logWarning("worktree", `stale runtime unit cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
490
502
  }
491
503
  return cleaned;
492
504
  }
@@ -528,8 +540,9 @@ export function syncGsdStateToWorktree(
528
540
  try {
529
541
  cpSync(src, dst);
530
542
  synced.push(f);
531
- } catch {
543
+ } catch (err) {
532
544
  /* non-fatal */
545
+ logWarning("worktree", `file copy failed (${f}): ${err instanceof Error ? err.message : String(err)}`);
533
546
  }
534
547
  }
535
548
  }
@@ -548,8 +561,9 @@ export function syncGsdStateToWorktree(
548
561
  try {
549
562
  cpSync(src, dst);
550
563
  synced.push(file);
551
- } catch {
564
+ } catch (err) {
552
565
  /* non-fatal */
566
+ logWarning("worktree", `preferences copy failed (${file}): ${err instanceof Error ? err.message : String(err)}`);
553
567
  }
554
568
  break;
555
569
  }
@@ -578,8 +592,9 @@ export function syncGsdStateToWorktree(
578
592
  try {
579
593
  cpSync(srcDir, dstDir, { recursive: true });
580
594
  synced.push(`milestones/${mid}/`);
581
- } catch {
595
+ } catch (err) {
582
596
  /* non-fatal */
597
+ logWarning("worktree", `milestone copy failed (${mid}): ${err instanceof Error ? err.message : String(err)}`);
583
598
  }
584
599
  } else {
585
600
  // Milestone directory exists but may be missing files (stale snapshot).
@@ -598,8 +613,9 @@ export function syncGsdStateToWorktree(
598
613
  cpSync(srcFile, dstFile);
599
614
  synced.push(`milestones/${mid}/${f}`);
600
615
  }
601
- } catch {
616
+ } catch (err) {
602
617
  /* non-fatal */
618
+ logWarning("worktree", `milestone file copy failed (${mid}/${f}): ${err instanceof Error ? err.message : String(err)}`);
603
619
  }
604
620
  }
605
621
  }
@@ -611,8 +627,9 @@ export function syncGsdStateToWorktree(
611
627
  try {
612
628
  cpSync(srcSlicesDir, dstSlicesDir, { recursive: true });
613
629
  synced.push(`milestones/${mid}/slices/`);
614
- } catch {
630
+ } catch (err) {
615
631
  /* non-fatal */
632
+ logWarning("worktree", `slices copy failed (${mid}): ${err instanceof Error ? err.message : String(err)}`);
616
633
  }
617
634
  } else if (existsSync(srcSlicesDir) && existsSync(dstSlicesDir)) {
618
635
  // Both exist — sync missing slice directories
@@ -628,19 +645,22 @@ export function syncGsdStateToWorktree(
628
645
  try {
629
646
  cpSync(srcSlice, dstSlice, { recursive: true });
630
647
  synced.push(`milestones/${mid}/slices/${sid}/`);
631
- } catch {
648
+ } catch (err) {
632
649
  /* non-fatal */
650
+ logWarning("worktree", `slice copy failed (${mid}/${sid}): ${err instanceof Error ? err.message : String(err)}`);
633
651
  }
634
652
  }
635
653
  }
636
654
  }
637
- } catch {
655
+ } catch (err) {
638
656
  /* non-fatal */
657
+ logWarning("worktree", `milestone file sync failed: ${err instanceof Error ? err.message : String(err)}`);
639
658
  }
640
659
  }
641
660
  }
642
- } catch {
661
+ } catch (err) {
643
662
  /* non-fatal */
663
+ logWarning("worktree", `milestone directory sync failed: ${err instanceof Error ? err.message : String(err)}`);
644
664
  }
645
665
  }
646
666
 
@@ -692,8 +712,9 @@ export function syncWorktreeStateBack(
692
712
  try {
693
713
  reconcileWorktreeDb(mainDb, wtLocalDb);
694
714
  synced.push("gsd.db (pre-upgrade reconcile)");
695
- } catch {
715
+ } catch (err) {
696
716
  // Non-fatal — file sync below is the fallback
717
+ logError("worktree", `DB reconciliation failed: ${err instanceof Error ? err.message : String(err)}`);
697
718
  }
698
719
  }
699
720
 
@@ -710,8 +731,9 @@ export function syncWorktreeStateBack(
710
731
  try {
711
732
  cpSync(src, dst, { force: true });
712
733
  synced.push(f);
713
- } catch {
734
+ } catch (err) {
714
735
  /* non-fatal */
736
+ logWarning("worktree", `state file copy-back failed (${f}): ${err instanceof Error ? err.message : String(err)}`);
715
737
  }
716
738
  }
717
739
  }
@@ -731,8 +753,9 @@ export function syncWorktreeStateBack(
731
753
  for (const mid of wtMilestones) {
732
754
  syncMilestoneDir(wtGsd, mainGsd, mid, synced);
733
755
  }
734
- } catch {
756
+ } catch (err) {
735
757
  /* non-fatal */
758
+ logWarning("worktree", `milestone sync-back failed: ${err instanceof Error ? err.message : String(err)}`);
736
759
  }
737
760
 
738
761
  return { synced };
@@ -756,12 +779,14 @@ function syncDirFiles(
756
779
  try {
757
780
  cpSync(join(srcDir, entry.name), join(dstDir, entry.name), { force: true });
758
781
  synced.push(`${prefix}${entry.name}`);
759
- } catch {
782
+ } catch (err) {
760
783
  /* non-fatal */
784
+ logWarning("worktree", `file copy failed (${prefix}${entry.name}): ${err instanceof Error ? err.message : String(err)}`);
761
785
  }
762
786
  }
763
- } catch {
787
+ } catch (err) {
764
788
  /* non-fatal — srcDir may not be readable */
789
+ logWarning("worktree", `directory read failed: ${err instanceof Error ? err.message : String(err)}`);
765
790
  }
766
791
  }
767
792
 
@@ -804,8 +829,9 @@ function syncMilestoneDir(
804
829
  syncDirFiles(wtTasksDir, mainTasksDir, isMd, synced, `milestones/${mid}/slices/${sid}/tasks/`);
805
830
  }
806
831
  }
807
- } catch {
832
+ } catch (err) {
808
833
  /* non-fatal */
834
+ logWarning("worktree", `milestone slice sync failed (${mid}): ${err instanceof Error ? err.message : String(err)}`);
809
835
  }
810
836
  }
811
837
  // ─── Worktree Post-Create Hook (#597) ────────────────────────────────────────
@@ -837,7 +863,9 @@ export function runWorktreePostCreateHook(
837
863
  return `Worktree post-create hook not found: ${resolved}`;
838
864
  }
839
865
  if (process.platform === "win32") {
840
- try { resolved = realpathSync.native(resolved); } catch { /* keep original */ }
866
+ try { resolved = realpathSync.native(resolved); } catch (err) { /* keep original */
867
+ logWarning("worktree", `realpath failed: ${err instanceof Error ? err.message : String(err)}`);
868
+ }
841
869
  }
842
870
 
843
871
  try {
@@ -921,8 +949,9 @@ function reconcilePlanCheckboxes(
921
949
  results.push(full);
922
950
  }
923
951
  }
924
- } catch {
952
+ } catch (err) {
925
953
  /* non-fatal */
954
+ logWarning("worktree", `walkMd directory read failed: ${err instanceof Error ? err.message : String(err)}`);
926
955
  }
927
956
  return results;
928
957
  }
@@ -937,7 +966,8 @@ function reconcilePlanCheckboxes(
937
966
  try {
938
967
  srcContent = readFileSync(srcFile, "utf-8");
939
968
  dstContent = readFileSync(dstFile, "utf-8");
940
- } catch {
969
+ } catch (e) {
970
+ logWarning("worktree", `reconcilePlanCheckboxes read failed: ${(e as Error).message}`);
941
971
  continue;
942
972
  }
943
973
 
@@ -972,8 +1002,9 @@ function reconcilePlanCheckboxes(
972
1002
  if (changed) {
973
1003
  try {
974
1004
  atomicWriteSync(dstFile, updated, "utf-8");
975
- } catch {
1005
+ } catch (err) {
976
1006
  /* non-fatal */
1007
+ logWarning("worktree", `plan checkbox reconcile write failed: ${err instanceof Error ? err.message : String(err)}`);
977
1008
  }
978
1009
  }
979
1010
  }
@@ -1158,8 +1189,9 @@ export function teardownAutoWorktree(
1158
1189
  // Attempt a direct filesystem removal as a fallback
1159
1190
  try {
1160
1191
  rmSync(wtDir, { recursive: true, force: true });
1161
- } catch {
1192
+ } catch (err) {
1162
1193
  // Non-fatal — the warning above tells the user how to clean up
1194
+ logWarning("worktree", `worktree directory removal failed: ${err instanceof Error ? err.message : String(err)}`);
1163
1195
  }
1164
1196
  }
1165
1197
  }
@@ -1200,7 +1232,8 @@ export function getAutoWorktreePath(
1200
1232
  try {
1201
1233
  const content = readFileSync(gitPath, "utf8").trim();
1202
1234
  if (!content.startsWith("gitdir: ")) return null;
1203
- } catch {
1235
+ } catch (e) {
1236
+ logWarning("worktree", `getAutoWorktreePath .git read failed: ${(e as Error).message}`);
1204
1237
  return null;
1205
1238
  }
1206
1239
 
@@ -1359,8 +1392,9 @@ export function mergeMilestoneToMain(
1359
1392
  if (!isSamePath(worktreeDbPath, mainDbPath)) {
1360
1393
  reconcileWorktreeDb(mainDbPath, worktreeDbPath);
1361
1394
  }
1362
- } catch {
1395
+ } catch (err) {
1363
1396
  /* non-fatal */
1397
+ logError("worktree", `DB reconciliation failed: ${err instanceof Error ? err.message : String(err)}`);
1364
1398
  }
1365
1399
  }
1366
1400
 
@@ -1515,9 +1549,10 @@ export function mergeMilestoneToMain(
1515
1549
  );
1516
1550
  stashed = true;
1517
1551
  }
1518
- } catch {
1552
+ } catch (err) {
1519
1553
  // Stash failure is non-fatal — proceed without stash and let the merge
1520
1554
  // report the dirty tree if it fails.
1555
+ logWarning("worktree", `git stash failed: ${err instanceof Error ? err.message : String(err)}`);
1521
1556
  }
1522
1557
 
1523
1558
  // 7a. Shelter queued milestone directories before the squash merge (#2505).
@@ -1538,9 +1573,13 @@ export function mergeMilestoneToMain(
1538
1573
  try {
1539
1574
  mkdirSync(milestonesDir, { recursive: true });
1540
1575
  cpSync(join(shelterDir, dirName), join(milestonesDir, dirName), { recursive: true, force: true });
1541
- } catch { /* best-effort */ }
1576
+ } catch (err) { /* best-effort */
1577
+ logError("worktree", `shelter restore failed: ${err instanceof Error ? err.message : String(err)}`);
1578
+ }
1579
+ }
1580
+ try { rmSync(shelterDir, { recursive: true, force: true }); } catch (err) { /* best-effort */
1581
+ logWarning("worktree", `shelter cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
1542
1582
  }
1543
- try { rmSync(shelterDir, { recursive: true, force: true }); } catch { /* best-effort */ }
1544
1583
  };
1545
1584
 
1546
1585
  try {
@@ -1557,13 +1596,15 @@ export function mergeMilestoneToMain(
1557
1596
  cpSync(srcDir, dstDir, { recursive: true, force: true });
1558
1597
  rmSync(srcDir, { recursive: true, force: true });
1559
1598
  shelteredDirs.push(entry.name);
1560
- } catch {
1599
+ } catch (err) {
1561
1600
  // Non-fatal — if shelter fails, the merge may still succeed
1601
+ logWarning("worktree", `milestone shelter failed (${entry.name}): ${err instanceof Error ? err.message : String(err)}`);
1562
1602
  }
1563
1603
  }
1564
1604
  }
1565
- } catch {
1605
+ } catch (err) {
1566
1606
  // Non-fatal — proceed with merge; untracked files may block it
1607
+ logWarning("worktree", `milestone shelter operation failed: ${err instanceof Error ? err.message : String(err)}`);
1567
1608
  }
1568
1609
 
1569
1610
  // 7b. Clean up stale merge state before attempting squash merge (#2912).
@@ -1577,7 +1618,9 @@ export function mergeMilestoneToMain(
1577
1618
  const p = join(gitDir_, f);
1578
1619
  if (existsSync(p)) unlinkSync(p);
1579
1620
  }
1580
- } catch { /* best-effort */ }
1621
+ } catch (err) { /* best-effort */
1622
+ logError("worktree", `merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
1623
+ }
1581
1624
 
1582
1625
  // 8. Squash merge — auto-resolve .gsd/ state file conflicts (#530)
1583
1626
  const mergeResult = nativeMergeSquash(originalBasePath_, milestoneBranch);
@@ -1595,7 +1638,9 @@ export function mergeMilestoneToMain(
1595
1638
  const p = join(gitDir_, f);
1596
1639
  if (existsSync(p)) unlinkSync(p);
1597
1640
  }
1598
- } catch { /* best-effort */ }
1641
+ } catch (err) { /* best-effort */
1642
+ logError("worktree", `merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
1643
+ }
1599
1644
 
1600
1645
  // Pop stash before throwing so local work is not lost.
1601
1646
  if (stashed) {
@@ -1605,7 +1650,9 @@ export function mergeMilestoneToMain(
1605
1650
  stdio: ["ignore", "pipe", "pipe"],
1606
1651
  encoding: "utf-8",
1607
1652
  });
1608
- } catch { /* stash pop conflict is non-fatal */ }
1653
+ } catch (err) { /* stash pop conflict is non-fatal */
1654
+ logWarning("worktree", `git stash pop failed: ${err instanceof Error ? err.message : String(err)}`);
1655
+ }
1609
1656
  }
1610
1657
  restoreShelter();
1611
1658
  // Restore cwd so the caller is not stranded on the integration branch
@@ -1644,9 +1691,10 @@ export function mergeMilestoneToMain(
1644
1691
  try {
1645
1692
  nativeCheckoutTheirs(originalBasePath_, [safeFile]);
1646
1693
  nativeAddPaths(originalBasePath_, [safeFile]);
1647
- } catch {
1694
+ } catch (e) {
1648
1695
  // If checkout --theirs fails, try removing the file from the merge
1649
1696
  // (it's a runtime file that shouldn't be committed anyway)
1697
+ logWarning("worktree", `checkout --theirs failed for ${safeFile}, removing: ${(e as Error).message}`);
1650
1698
  nativeRmForce(originalBasePath_, [safeFile]);
1651
1699
  }
1652
1700
  }
@@ -1657,14 +1705,18 @@ export function mergeMilestoneToMain(
1657
1705
  // Abort merge state so MERGE_HEAD is not left on disk (#2912).
1658
1706
  // libgit2's merge creates MERGE_HEAD even for squash merges; if left
1659
1707
  // dangling, subsequent merges fail and doctor reports corrupt state.
1660
- try { nativeMergeAbort(originalBasePath_); } catch { /* best-effort */ }
1708
+ try { nativeMergeAbort(originalBasePath_); } catch (err) { /* best-effort */
1709
+ logError("worktree", `git merge-abort failed: ${err instanceof Error ? err.message : String(err)}`);
1710
+ }
1661
1711
  try {
1662
1712
  const gitDir_ = resolveGitDir(originalBasePath_);
1663
1713
  for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_HEAD"]) {
1664
1714
  const p = join(gitDir_, f);
1665
1715
  if (existsSync(p)) unlinkSync(p);
1666
1716
  }
1667
- } catch { /* best-effort */ }
1717
+ } catch (err) { /* best-effort */
1718
+ logError("worktree", `merge state file cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
1719
+ }
1668
1720
 
1669
1721
  // Pop stash before throwing so local work is not lost (#2151).
1670
1722
  if (stashed) {
@@ -1674,7 +1726,9 @@ export function mergeMilestoneToMain(
1674
1726
  stdio: ["ignore", "pipe", "pipe"],
1675
1727
  encoding: "utf-8",
1676
1728
  });
1677
- } catch { /* stash pop conflict is non-fatal */ }
1729
+ } catch (err) { /* stash pop conflict is non-fatal */
1730
+ logWarning("worktree", `git stash pop failed: ${err instanceof Error ? err.message : String(err)}`);
1731
+ }
1678
1732
  }
1679
1733
  restoreShelter();
1680
1734
  throw new MergeConflictError(
@@ -1704,7 +1758,9 @@ export function mergeMilestoneToMain(
1704
1758
  const p = join(gitDir_, f);
1705
1759
  if (existsSync(p)) unlinkSync(p);
1706
1760
  }
1707
- } catch { /* best-effort */ }
1761
+ } catch (err) { /* best-effort */
1762
+ logError("worktree", `post-commit merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
1763
+ }
1708
1764
 
1709
1765
  // 9a-ii. Restore stashed files now that the merge+commit is complete (#2151).
1710
1766
  // Pop after commit so stashed changes do not interfere with the squash merge
@@ -1717,7 +1773,8 @@ export function mergeMilestoneToMain(
1717
1773
  stdio: ["ignore", "pipe", "pipe"],
1718
1774
  encoding: "utf-8",
1719
1775
  });
1720
- } catch {
1776
+ } catch (e) {
1777
+ logWarning("worktree", `git stash pop failed, attempting conflict resolution: ${(e as Error).message}`);
1721
1778
  // Stash pop after squash merge can conflict on .gsd/ state files that
1722
1779
  // diverged between branches. Left unresolved, these UU entries block
1723
1780
  // every subsequent merge. Auto-resolve them the same way we handle
@@ -1737,8 +1794,9 @@ export function mergeMilestoneToMain(
1737
1794
  encoding: "utf-8",
1738
1795
  });
1739
1796
  nativeAddPaths(originalBasePath_, [f]);
1740
- } catch {
1797
+ } catch (e) {
1741
1798
  // Last resort: remove the conflicted state file
1799
+ logWarning("worktree", `checkout HEAD failed for ${f}, removing: ${(e as Error).message}`);
1742
1800
  nativeRmForce(originalBasePath_, [f]);
1743
1801
  }
1744
1802
  }
@@ -1752,7 +1810,9 @@ export function mergeMilestoneToMain(
1752
1810
  stdio: ["ignore", "pipe", "pipe"],
1753
1811
  encoding: "utf-8",
1754
1812
  });
1755
- } catch { /* stash may already be consumed */ }
1813
+ } catch (err) { /* stash may already be consumed */
1814
+ logWarning("worktree", `git stash drop failed: ${err instanceof Error ? err.message : String(err)}`);
1815
+ }
1756
1816
  } else {
1757
1817
  // Non-.gsd conflicts remain — leave stash for manual resolution
1758
1818
  logWarning("reconcile", "Stash pop conflict on non-.gsd files after merge", {
@@ -1805,8 +1865,9 @@ export function mergeMilestoneToMain(
1805
1865
  codeFilesChanged = mergedFiles.some(
1806
1866
  (entry) => !entry.path.startsWith(".gsd/"),
1807
1867
  );
1808
- } catch {
1868
+ } catch (e) {
1809
1869
  // If HEAD~1 doesn't exist (first commit), assume code was changed
1870
+ logWarning("worktree", `diff numstat failed (assuming code changed): ${(e as Error).message}`);
1810
1871
  codeFilesChanged = true;
1811
1872
  }
1812
1873
  }
@@ -1822,8 +1883,9 @@ export function mergeMilestoneToMain(
1822
1883
  encoding: "utf-8",
1823
1884
  });
1824
1885
  pushed = true;
1825
- } catch {
1886
+ } catch (err) {
1826
1887
  // Push failure is non-fatal
1888
+ logWarning("worktree", `git push failed: ${err instanceof Error ? err.message : String(err)}`);
1827
1889
  }
1828
1890
  }
1829
1891
 
@@ -1852,8 +1914,9 @@ export function mergeMilestoneToMain(
1852
1914
  encoding: "utf-8",
1853
1915
  });
1854
1916
  prCreated = true;
1855
- } catch {
1917
+ } catch (err) {
1856
1918
  // PR creation failure is non-fatal — gh may not be installed or authenticated
1919
+ logWarning("worktree", `PR creation failed: ${err instanceof Error ? err.message : String(err)}`);
1857
1920
  }
1858
1921
  }
1859
1922
 
@@ -1891,15 +1954,17 @@ export function mergeMilestoneToMain(
1891
1954
  branch: null as unknown as string,
1892
1955
  deleteBranch: false,
1893
1956
  });
1894
- } catch {
1957
+ } catch (err) {
1895
1958
  // Best-effort -- worktree dir may already be gone
1959
+ logWarning("worktree", `worktree removal failed: ${err instanceof Error ? err.message : String(err)}`);
1896
1960
  }
1897
1961
 
1898
1962
  // 13. Delete milestone branch (after worktree removal so ref is unlocked)
1899
1963
  try {
1900
1964
  nativeBranchDelete(originalBasePath_, milestoneBranch);
1901
- } catch {
1965
+ } catch (err) {
1902
1966
  // Best-effort
1967
+ logWarning("worktree", `git branch-delete failed: ${err instanceof Error ? err.message : String(err)}`);
1903
1968
  }
1904
1969
 
1905
1970
  // 14. Clear module state
@@ -1908,3 +1973,4 @@ export function mergeMilestoneToMain(
1908
1973
 
1909
1974
  return { commitMessage, pushed, prCreated, codeFilesChanged };
1910
1975
  }
1976
+