gsd-pi 2.17.0 → 2.19.0

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 (217) hide show
  1. package/README.md +39 -0
  2. package/dist/onboarding.js +2 -2
  3. package/dist/remote-questions-config.d.ts +10 -0
  4. package/dist/remote-questions-config.js +36 -0
  5. package/dist/resources/extensions/gsd/activity-log.ts +37 -7
  6. package/dist/resources/extensions/gsd/auto-dashboard.ts +14 -2
  7. package/dist/resources/extensions/gsd/auto-prompts.ts +65 -16
  8. package/dist/resources/extensions/gsd/auto-worktree.ts +33 -4
  9. package/dist/resources/extensions/gsd/auto.ts +399 -29
  10. package/dist/resources/extensions/gsd/captures.ts +384 -0
  11. package/dist/resources/extensions/gsd/commands.ts +382 -23
  12. package/dist/resources/extensions/gsd/complexity-classifier.ts +322 -0
  13. package/dist/resources/extensions/gsd/dashboard-overlay.ts +10 -0
  14. package/dist/resources/extensions/gsd/dispatch-guard.ts +7 -19
  15. package/dist/resources/extensions/gsd/docs/preferences-reference.md +201 -2
  16. package/dist/resources/extensions/gsd/files.ts +123 -1
  17. package/dist/resources/extensions/gsd/guided-flow.ts +237 -4
  18. package/dist/resources/extensions/gsd/index.ts +47 -3
  19. package/dist/resources/extensions/gsd/metrics.ts +48 -0
  20. package/dist/resources/extensions/gsd/model-cost-table.ts +65 -0
  21. package/dist/resources/extensions/gsd/model-router.ts +256 -0
  22. package/dist/resources/extensions/gsd/paths.ts +9 -0
  23. package/dist/resources/extensions/gsd/post-unit-hooks.ts +2 -1
  24. package/dist/resources/extensions/gsd/preferences.ts +132 -1
  25. package/dist/resources/extensions/gsd/prompt-loader.ts +45 -9
  26. package/dist/resources/extensions/gsd/prompts/execute-task.md +6 -5
  27. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -0
  28. package/dist/resources/extensions/gsd/prompts/replan-slice.md +8 -0
  29. package/dist/resources/extensions/gsd/prompts/system.md +2 -0
  30. package/dist/resources/extensions/gsd/prompts/triage-captures.md +62 -0
  31. package/dist/resources/extensions/gsd/queue-order.ts +231 -0
  32. package/dist/resources/extensions/gsd/queue-reorder-ui.ts +263 -0
  33. package/dist/resources/extensions/gsd/state.ts +15 -3
  34. package/dist/resources/extensions/gsd/templates/knowledge.md +19 -0
  35. package/dist/resources/extensions/gsd/templates/preferences.md +14 -0
  36. package/dist/resources/extensions/gsd/tests/auto-worktree.test.ts +20 -0
  37. package/dist/resources/extensions/gsd/tests/captures.test.ts +438 -0
  38. package/dist/resources/extensions/gsd/tests/complexity-classifier.test.ts +181 -0
  39. package/dist/resources/extensions/gsd/tests/derive-state-deps.test.ts +99 -0
  40. package/dist/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +434 -0
  41. package/dist/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +79 -0
  42. package/dist/resources/extensions/gsd/tests/knowledge.test.ts +161 -0
  43. package/dist/resources/extensions/gsd/tests/memory-leak-guards.test.ts +87 -0
  44. package/dist/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +144 -0
  45. package/dist/resources/extensions/gsd/tests/model-cost-table.test.ts +69 -0
  46. package/dist/resources/extensions/gsd/tests/model-router.test.ts +167 -0
  47. package/dist/resources/extensions/gsd/tests/preferences-wizard-fields.test.ts +168 -0
  48. package/dist/resources/extensions/gsd/tests/queue-order.test.ts +204 -0
  49. package/dist/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +281 -0
  50. package/dist/resources/extensions/gsd/tests/remote-questions.test.ts +227 -1
  51. package/dist/resources/extensions/gsd/tests/routing-history.test.ts +215 -62
  52. package/dist/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +139 -0
  53. package/dist/resources/extensions/gsd/tests/triage-dispatch.test.ts +224 -0
  54. package/dist/resources/extensions/gsd/tests/triage-resolution.test.ts +215 -0
  55. package/dist/resources/extensions/gsd/tests/visualizer-data.test.ts +198 -0
  56. package/dist/resources/extensions/gsd/tests/visualizer-views.test.ts +255 -0
  57. package/dist/resources/extensions/gsd/triage-resolution.ts +200 -0
  58. package/dist/resources/extensions/gsd/triage-ui.ts +175 -0
  59. package/dist/resources/extensions/gsd/visualizer-data.ts +154 -0
  60. package/dist/resources/extensions/gsd/visualizer-overlay.ts +193 -0
  61. package/dist/resources/extensions/gsd/visualizer-views.ts +293 -0
  62. package/dist/resources/extensions/gsd/worktree-manager.ts +8 -5
  63. package/dist/resources/extensions/gsd/worktree.ts +22 -0
  64. package/dist/resources/extensions/remote-questions/discord-adapter.ts +33 -0
  65. package/dist/resources/extensions/remote-questions/format.ts +12 -6
  66. package/dist/resources/extensions/remote-questions/manager.ts +8 -0
  67. package/dist/resources/extensions/shared/next-action-ui.ts +16 -1
  68. package/package.json +1 -1
  69. package/packages/pi-coding-agent/dist/cli/args.d.ts +5 -0
  70. package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
  71. package/packages/pi-coding-agent/dist/cli/args.js +21 -0
  72. package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
  73. package/packages/pi-coding-agent/dist/cli/list-models.d.ts +14 -3
  74. package/packages/pi-coding-agent/dist/cli/list-models.d.ts.map +1 -1
  75. package/packages/pi-coding-agent/dist/cli/list-models.js +52 -17
  76. package/packages/pi-coding-agent/dist/cli/list-models.js.map +1 -1
  77. package/packages/pi-coding-agent/dist/core/discovery-cache.d.ts +27 -0
  78. package/packages/pi-coding-agent/dist/core/discovery-cache.d.ts.map +1 -0
  79. package/packages/pi-coding-agent/dist/core/discovery-cache.js +79 -0
  80. package/packages/pi-coding-agent/dist/core/discovery-cache.js.map +1 -0
  81. package/packages/pi-coding-agent/dist/core/discovery-cache.test.d.ts +2 -0
  82. package/packages/pi-coding-agent/dist/core/discovery-cache.test.d.ts.map +1 -0
  83. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js +140 -0
  84. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js.map +1 -0
  85. package/packages/pi-coding-agent/dist/core/model-discovery.d.ts +35 -0
  86. package/packages/pi-coding-agent/dist/core/model-discovery.d.ts.map +1 -0
  87. package/packages/pi-coding-agent/dist/core/model-discovery.js +162 -0
  88. package/packages/pi-coding-agent/dist/core/model-discovery.js.map +1 -0
  89. package/packages/pi-coding-agent/dist/core/model-discovery.test.d.ts +2 -0
  90. package/packages/pi-coding-agent/dist/core/model-discovery.test.d.ts.map +1 -0
  91. package/packages/pi-coding-agent/dist/core/model-discovery.test.js +100 -0
  92. package/packages/pi-coding-agent/dist/core/model-discovery.test.js.map +1 -0
  93. package/packages/pi-coding-agent/dist/core/model-registry-discovery.test.d.ts +2 -0
  94. package/packages/pi-coding-agent/dist/core/model-registry-discovery.test.d.ts.map +1 -0
  95. package/packages/pi-coding-agent/dist/core/model-registry-discovery.test.js +113 -0
  96. package/packages/pi-coding-agent/dist/core/model-registry-discovery.test.js.map +1 -0
  97. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +26 -0
  98. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  99. package/packages/pi-coding-agent/dist/core/model-registry.js +98 -0
  100. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  101. package/packages/pi-coding-agent/dist/core/models-json-writer.d.ts +62 -0
  102. package/packages/pi-coding-agent/dist/core/models-json-writer.d.ts.map +1 -0
  103. package/packages/pi-coding-agent/dist/core/models-json-writer.js +145 -0
  104. package/packages/pi-coding-agent/dist/core/models-json-writer.js.map +1 -0
  105. package/packages/pi-coding-agent/dist/core/models-json-writer.test.d.ts +2 -0
  106. package/packages/pi-coding-agent/dist/core/models-json-writer.test.d.ts.map +1 -0
  107. package/packages/pi-coding-agent/dist/core/models-json-writer.test.js +118 -0
  108. package/packages/pi-coding-agent/dist/core/models-json-writer.test.js.map +1 -0
  109. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +9 -0
  110. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  111. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  112. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  113. package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
  114. package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
  115. package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
  116. package/packages/pi-coding-agent/dist/index.d.ts +5 -1
  117. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  118. package/packages/pi-coding-agent/dist/index.js +4 -1
  119. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  120. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  121. package/packages/pi-coding-agent/dist/main.js +17 -2
  122. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  123. package/packages/pi-coding-agent/dist/modes/interactive/components/index.d.ts +1 -0
  124. package/packages/pi-coding-agent/dist/modes/interactive/components/index.d.ts.map +1 -1
  125. package/packages/pi-coding-agent/dist/modes/interactive/components/index.js +1 -0
  126. package/packages/pi-coding-agent/dist/modes/interactive/components/index.js.map +1 -1
  127. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +1 -1
  128. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
  129. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts +25 -0
  130. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -0
  131. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +121 -0
  132. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -0
  133. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +1 -0
  134. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  135. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +32 -0
  136. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  137. package/packages/pi-coding-agent/src/cli/args.ts +21 -0
  138. package/packages/pi-coding-agent/src/cli/list-models.ts +70 -17
  139. package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +170 -0
  140. package/packages/pi-coding-agent/src/core/discovery-cache.ts +97 -0
  141. package/packages/pi-coding-agent/src/core/model-discovery.test.ts +125 -0
  142. package/packages/pi-coding-agent/src/core/model-discovery.ts +231 -0
  143. package/packages/pi-coding-agent/src/core/model-registry-discovery.test.ts +135 -0
  144. package/packages/pi-coding-agent/src/core/model-registry.ts +107 -0
  145. package/packages/pi-coding-agent/src/core/models-json-writer.test.ts +145 -0
  146. package/packages/pi-coding-agent/src/core/models-json-writer.ts +188 -0
  147. package/packages/pi-coding-agent/src/core/settings-manager.ts +21 -0
  148. package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
  149. package/packages/pi-coding-agent/src/index.ts +5 -0
  150. package/packages/pi-coding-agent/src/main.ts +19 -2
  151. package/packages/pi-coding-agent/src/modes/interactive/components/index.ts +1 -0
  152. package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +1 -1
  153. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +163 -0
  154. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +37 -0
  155. package/src/resources/extensions/gsd/activity-log.ts +37 -7
  156. package/src/resources/extensions/gsd/auto-dashboard.ts +14 -2
  157. package/src/resources/extensions/gsd/auto-prompts.ts +65 -16
  158. package/src/resources/extensions/gsd/auto-worktree.ts +33 -4
  159. package/src/resources/extensions/gsd/auto.ts +399 -29
  160. package/src/resources/extensions/gsd/captures.ts +384 -0
  161. package/src/resources/extensions/gsd/commands.ts +382 -23
  162. package/src/resources/extensions/gsd/complexity-classifier.ts +322 -0
  163. package/src/resources/extensions/gsd/dashboard-overlay.ts +10 -0
  164. package/src/resources/extensions/gsd/dispatch-guard.ts +7 -19
  165. package/src/resources/extensions/gsd/docs/preferences-reference.md +201 -2
  166. package/src/resources/extensions/gsd/files.ts +123 -1
  167. package/src/resources/extensions/gsd/guided-flow.ts +237 -4
  168. package/src/resources/extensions/gsd/index.ts +47 -3
  169. package/src/resources/extensions/gsd/metrics.ts +48 -0
  170. package/src/resources/extensions/gsd/model-cost-table.ts +65 -0
  171. package/src/resources/extensions/gsd/model-router.ts +256 -0
  172. package/src/resources/extensions/gsd/paths.ts +9 -0
  173. package/src/resources/extensions/gsd/post-unit-hooks.ts +2 -1
  174. package/src/resources/extensions/gsd/preferences.ts +132 -1
  175. package/src/resources/extensions/gsd/prompt-loader.ts +45 -9
  176. package/src/resources/extensions/gsd/prompts/execute-task.md +6 -5
  177. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -0
  178. package/src/resources/extensions/gsd/prompts/replan-slice.md +8 -0
  179. package/src/resources/extensions/gsd/prompts/system.md +2 -0
  180. package/src/resources/extensions/gsd/prompts/triage-captures.md +62 -0
  181. package/src/resources/extensions/gsd/queue-order.ts +231 -0
  182. package/src/resources/extensions/gsd/queue-reorder-ui.ts +263 -0
  183. package/src/resources/extensions/gsd/state.ts +15 -3
  184. package/src/resources/extensions/gsd/templates/knowledge.md +19 -0
  185. package/src/resources/extensions/gsd/templates/preferences.md +14 -0
  186. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +20 -0
  187. package/src/resources/extensions/gsd/tests/captures.test.ts +438 -0
  188. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +181 -0
  189. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +99 -0
  190. package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +434 -0
  191. package/src/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +79 -0
  192. package/src/resources/extensions/gsd/tests/knowledge.test.ts +161 -0
  193. package/src/resources/extensions/gsd/tests/memory-leak-guards.test.ts +87 -0
  194. package/src/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +144 -0
  195. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +69 -0
  196. package/src/resources/extensions/gsd/tests/model-router.test.ts +167 -0
  197. package/src/resources/extensions/gsd/tests/preferences-wizard-fields.test.ts +168 -0
  198. package/src/resources/extensions/gsd/tests/queue-order.test.ts +204 -0
  199. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +281 -0
  200. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +227 -1
  201. package/src/resources/extensions/gsd/tests/routing-history.test.ts +215 -62
  202. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +139 -0
  203. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +224 -0
  204. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +215 -0
  205. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +198 -0
  206. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +255 -0
  207. package/src/resources/extensions/gsd/triage-resolution.ts +200 -0
  208. package/src/resources/extensions/gsd/triage-ui.ts +175 -0
  209. package/src/resources/extensions/gsd/visualizer-data.ts +154 -0
  210. package/src/resources/extensions/gsd/visualizer-overlay.ts +193 -0
  211. package/src/resources/extensions/gsd/visualizer-views.ts +293 -0
  212. package/src/resources/extensions/gsd/worktree-manager.ts +8 -5
  213. package/src/resources/extensions/gsd/worktree.ts +22 -0
  214. package/src/resources/extensions/remote-questions/discord-adapter.ts +33 -0
  215. package/src/resources/extensions/remote-questions/format.ts +12 -6
  216. package/src/resources/extensions/remote-questions/manager.ts +8 -0
  217. package/src/resources/extensions/shared/next-action-ui.ts +16 -1
@@ -89,7 +89,7 @@ export async function inlineDependencySummaries(
89
89
  export async function inlineGsdRootFile(
90
90
  base: string, filename: string, label: string,
91
91
  ): Promise<string | null> {
92
- const key = filename.replace(/\.md$/i, "").toUpperCase() as "PROJECT" | "DECISIONS" | "QUEUE" | "STATE" | "REQUIREMENTS";
92
+ const key = filename.replace(/\.md$/i, "").toUpperCase() as "PROJECT" | "DECISIONS" | "QUEUE" | "STATE" | "REQUIREMENTS" | "KNOWLEDGE";
93
93
  const absPath = resolveGsdRootFile(base, key);
94
94
  if (!existsSync(absPath)) return null;
95
95
  return inlineFileOptional(absPath, relGsdRootFile(key), label);
@@ -377,6 +377,8 @@ export async function buildResearchMilestonePrompt(mid: string, midTitle: string
377
377
  if (requirementsInline) inlined.push(requirementsInline);
378
378
  const decisionsInline = await inlineGsdRootFile(base, "decisions.md", "Decisions");
379
379
  if (decisionsInline) inlined.push(decisionsInline);
380
+ const knowledgeInlineRM = await inlineGsdRootFile(base, "knowledge.md", "Project Knowledge");
381
+ if (knowledgeInlineRM) inlined.push(knowledgeInlineRM);
380
382
  inlined.push(inlineTemplate("research", "Research"));
381
383
 
382
384
  const inlinedContext = `## Inlined Context (preloaded — do not re-read these files)\n\n${inlined.join("\n\n---\n\n")}`;
@@ -387,7 +389,7 @@ export async function buildResearchMilestonePrompt(mid: string, midTitle: string
387
389
  milestoneId: mid, milestoneTitle: midTitle,
388
390
  milestonePath: relMilestonePath(base, mid),
389
391
  contextPath: contextRel,
390
- outputPath: outputRelPath,
392
+ outputPath: join(base, outputRelPath),
391
393
  inlinedContext,
392
394
  ...buildSkillDiscoveryVars(),
393
395
  });
@@ -413,6 +415,8 @@ export async function buildPlanMilestonePrompt(mid: string, midTitle: string, ba
413
415
  if (requirementsInline) inlined.push(requirementsInline);
414
416
  const decisionsInline = inlineLevel !== "minimal" ? await inlineGsdRootFile(base, "decisions.md", "Decisions") : null;
415
417
  if (decisionsInline) inlined.push(decisionsInline);
418
+ const knowledgeInlinePM = await inlineGsdRootFile(base, "knowledge.md", "Project Knowledge");
419
+ if (knowledgeInlinePM) inlined.push(knowledgeInlinePM);
416
420
  inlined.push(inlineTemplate("roadmap", "Roadmap"));
417
421
  if (inlineLevel === "full") {
418
422
  inlined.push(inlineTemplate("decisions", "Decisions"));
@@ -428,14 +432,14 @@ export async function buildPlanMilestonePrompt(mid: string, midTitle: string, ba
428
432
  const inlinedContext = `## Inlined Context (preloaded — do not re-read these files)\n\n${inlined.join("\n\n---\n\n")}`;
429
433
 
430
434
  const outputRelPath = relMilestoneFile(base, mid, "ROADMAP");
431
- const secretsOutputPath = relMilestoneFile(base, mid, "SECRETS");
435
+ const secretsOutputPath = join(base, relMilestoneFile(base, mid, "SECRETS"));
432
436
  return loadPrompt("plan-milestone", {
433
437
  workingDirectory: base,
434
438
  milestoneId: mid, milestoneTitle: midTitle,
435
439
  milestonePath: relMilestonePath(base, mid),
436
440
  contextPath: contextRel,
437
441
  researchPath: researchRel,
438
- outputPath: outputRelPath,
442
+ outputPath: join(base, outputRelPath),
439
443
  secretsOutputPath,
440
444
  inlinedContext,
441
445
  });
@@ -461,6 +465,8 @@ export async function buildResearchSlicePrompt(
461
465
  if (decisionsInline) inlined.push(decisionsInline);
462
466
  const requirementsInline = await inlineGsdRootFile(base, "requirements.md", "Requirements");
463
467
  if (requirementsInline) inlined.push(requirementsInline);
468
+ const knowledgeInlineRS = await inlineGsdRootFile(base, "knowledge.md", "Project Knowledge");
469
+ if (knowledgeInlineRS) inlined.push(knowledgeInlineRS);
464
470
  inlined.push(inlineTemplate("research", "Research"));
465
471
 
466
472
  const depContent = await inlineDependencySummaries(mid, sid, base);
@@ -478,7 +484,7 @@ export async function buildResearchSlicePrompt(
478
484
  roadmapPath: roadmapRel,
479
485
  contextPath: contextRel,
480
486
  milestoneResearchPath: milestoneResearchRel,
481
- outputPath: outputRelPath,
487
+ outputPath: join(base, outputRelPath),
482
488
  inlinedContext,
483
489
  dependencySummaries: depContent,
484
490
  ...buildSkillDiscoveryVars(),
@@ -504,6 +510,8 @@ export async function buildPlanSlicePrompt(
504
510
  const requirementsInline = await inlineGsdRootFile(base, "requirements.md", "Requirements");
505
511
  if (requirementsInline) inlined.push(requirementsInline);
506
512
  }
513
+ const knowledgeInlinePS = await inlineGsdRootFile(base, "knowledge.md", "Project Knowledge");
514
+ if (knowledgeInlinePS) inlined.push(knowledgeInlinePS);
507
515
  inlined.push(inlineTemplate("plan", "Slice Plan"));
508
516
  if (inlineLevel === "full") {
509
517
  inlined.push(inlineTemplate("task-plan", "Task Plan"));
@@ -523,7 +531,7 @@ export async function buildPlanSlicePrompt(
523
531
  slicePath: relSlicePath(base, mid, sid),
524
532
  roadmapPath: roadmapRel,
525
533
  researchPath: researchRel,
526
- outputPath: outputRelPath,
534
+ outputPath: join(base, outputRelPath),
527
535
  inlinedContext,
528
536
  dependencySummaries: depContent,
529
537
  });
@@ -578,14 +586,19 @@ export async function buildExecuteTaskPrompt(
578
586
  ? priorSummaries.slice(-1)
579
587
  : priorSummaries;
580
588
  const carryForwardSection = await buildCarryForwardSection(effectivePriorSummaries, base);
589
+
590
+ // Inline project knowledge if available
591
+ const knowledgeInlineET = await inlineGsdRootFile(base, "knowledge.md", "Project Knowledge");
592
+
581
593
  const inlinedTemplates = inlineLevel === "minimal"
582
594
  ? inlineTemplate("task-summary", "Task Summary")
583
595
  : [
584
596
  inlineTemplate("task-summary", "Task Summary"),
585
597
  inlineTemplate("decisions", "Decisions"),
598
+ ...(knowledgeInlineET ? [knowledgeInlineET] : []),
586
599
  ].join("\n\n---\n\n");
587
600
 
588
- const taskSummaryPath = `${relSlicePath(base, mid, sid)}/tasks/${tid}-SUMMARY.md`;
601
+ const taskSummaryPath = join(base, `${relSlicePath(base, mid, sid)}/tasks/${tid}-SUMMARY.md`);
589
602
 
590
603
  const activeOverrides = await loadActiveOverrides(base);
591
604
  const overridesSection = formatOverridesSection(activeOverrides);
@@ -594,7 +607,7 @@ export async function buildExecuteTaskPrompt(
594
607
  overridesSection,
595
608
  workingDirectory: base,
596
609
  milestoneId: mid, sliceId: sid, sliceTitle: sTitle, taskId: tid, taskTitle: tTitle,
597
- planPath: relSliceFile(base, mid, sid, "PLAN"),
610
+ planPath: join(base, relSliceFile(base, mid, sid, "PLAN")),
598
611
  slicePath: relSlicePath(base, mid, sid),
599
612
  taskPlanPath: taskPlanRelPath,
600
613
  taskPlanInline,
@@ -624,6 +637,8 @@ export async function buildCompleteSlicePrompt(
624
637
  const requirementsInline = await inlineGsdRootFile(base, "requirements.md", "Requirements");
625
638
  if (requirementsInline) inlined.push(requirementsInline);
626
639
  }
640
+ const knowledgeInlineCS = await inlineGsdRootFile(base, "knowledge.md", "Project Knowledge");
641
+ if (knowledgeInlineCS) inlined.push(knowledgeInlineCS);
627
642
 
628
643
  // Inline all task summaries for this slice
629
644
  const tDir = resolveTasksDir(base, mid, sid);
@@ -650,14 +665,14 @@ export async function buildCompleteSlicePrompt(
650
665
  const inlinedContext = `## Inlined Context (preloaded — do not re-read these files)\n\n${inlined.join("\n\n---\n\n")}`;
651
666
 
652
667
  const sliceRel = relSlicePath(base, mid, sid);
653
- const sliceSummaryPath = `${sliceRel}/${sid}-SUMMARY.md`;
654
- const sliceUatPath = `${sliceRel}/${sid}-UAT.md`;
668
+ const sliceSummaryPath = join(base, `${sliceRel}/${sid}-SUMMARY.md`);
669
+ const sliceUatPath = join(base, `${sliceRel}/${sid}-UAT.md`);
655
670
 
656
671
  return loadPrompt("complete-slice", {
657
672
  workingDirectory: base,
658
673
  milestoneId: mid, sliceId: sid, sliceTitle: sTitle,
659
674
  slicePath: sliceRel,
660
- roadmapPath: roadmapRel,
675
+ roadmapPath: join(base, roadmapRel),
661
676
  inlinedContext,
662
677
  sliceSummaryPath,
663
678
  sliceUatPath,
@@ -697,6 +712,8 @@ export async function buildCompleteMilestonePrompt(
697
712
  const projectInline = await inlineGsdRootFile(base, "project.md", "Project");
698
713
  if (projectInline) inlined.push(projectInline);
699
714
  }
715
+ const knowledgeInlineCM = await inlineGsdRootFile(base, "knowledge.md", "Project Knowledge");
716
+ if (knowledgeInlineCM) inlined.push(knowledgeInlineCM);
700
717
  // Inline milestone context file (milestone-level, not GSD root)
701
718
  const contextPath = resolveMilestoneFile(base, mid, "CONTEXT");
702
719
  const contextRel = relMilestoneFile(base, mid, "CONTEXT");
@@ -706,7 +723,7 @@ export async function buildCompleteMilestonePrompt(
706
723
 
707
724
  const inlinedContext = `## Inlined Context (preloaded — do not re-read these files)\n\n${inlined.join("\n\n---\n\n")}`;
708
725
 
709
- const milestoneSummaryPath = `${relMilestonePath(base, mid)}/${mid}-SUMMARY.md`;
726
+ const milestoneSummaryPath = join(base, `${relMilestonePath(base, mid)}/${mid}-SUMMARY.md`);
710
727
 
711
728
  return loadPrompt("complete-milestone", {
712
729
  workingDirectory: base,
@@ -758,7 +775,21 @@ export async function buildReplanSlicePrompt(
758
775
 
759
776
  const inlinedContext = `## Inlined Context (preloaded — do not re-read these files)\n\n${inlined.join("\n\n---\n\n")}`;
760
777
 
761
- const replanPath = `${relSlicePath(base, mid, sid)}/${sid}-REPLAN.md`;
778
+ const replanPath = join(base, `${relSlicePath(base, mid, sid)}/${sid}-REPLAN.md`);
779
+
780
+ // Build capture context for replan prompt (captures that triggered this replan)
781
+ let captureContext = "(none)";
782
+ try {
783
+ const { loadReplanCaptures } = await import("./triage-resolution.js");
784
+ const replanCaptures = loadReplanCaptures(base);
785
+ if (replanCaptures.length > 0) {
786
+ captureContext = replanCaptures.map(c =>
787
+ `- **${c.id}**: "${c.text}" — ${c.rationale ?? "no rationale"}`
788
+ ).join("\n");
789
+ }
790
+ } catch {
791
+ // Non-fatal — captures module may not be available
792
+ }
762
793
 
763
794
  return loadPrompt("replan-slice", {
764
795
  workingDirectory: base,
@@ -766,10 +797,11 @@ export async function buildReplanSlicePrompt(
766
797
  sliceId: sid,
767
798
  sliceTitle: sTitle,
768
799
  slicePath: relSlicePath(base, mid, sid),
769
- planPath: slicePlanRel,
800
+ planPath: join(base, slicePlanRel),
770
801
  blockerTaskId,
771
802
  inlinedContext,
772
803
  replanPath,
804
+ captureContext,
773
805
  });
774
806
  }
775
807
 
@@ -791,7 +823,7 @@ export async function buildRunUatPrompt(
791
823
 
792
824
  const inlinedContext = `## Inlined Context (preloaded — do not re-read these files)\n\n${inlined.join("\n\n---\n\n")}`;
793
825
 
794
- const uatResultPath = relSliceFile(base, mid, sliceId, "UAT-RESULT");
826
+ const uatResultPath = join(base, relSliceFile(base, mid, sliceId, "UAT-RESULT"));
795
827
  const uatType = extractUatType(uatContent) ?? "human-experience";
796
828
 
797
829
  return loadPrompt("run-uat", {
@@ -825,10 +857,26 @@ export async function buildReassessRoadmapPrompt(
825
857
  const decisionsInline = await inlineGsdRootFile(base, "decisions.md", "Decisions");
826
858
  if (decisionsInline) inlined.push(decisionsInline);
827
859
  }
860
+ const knowledgeInlineRA = await inlineGsdRootFile(base, "knowledge.md", "Project Knowledge");
861
+ if (knowledgeInlineRA) inlined.push(knowledgeInlineRA);
828
862
 
829
863
  const inlinedContext = `## Inlined Context (preloaded — do not re-read these files)\n\n${inlined.join("\n\n---\n\n")}`;
830
864
 
831
- const assessmentPath = relSliceFile(base, mid, completedSliceId, "ASSESSMENT");
865
+ const assessmentPath = join(base, relSliceFile(base, mid, completedSliceId, "ASSESSMENT"));
866
+
867
+ // Build deferred captures context for reassess prompt
868
+ let deferredCaptures = "(none)";
869
+ try {
870
+ const { loadDeferredCaptures } = await import("./triage-resolution.js");
871
+ const deferred = loadDeferredCaptures(base);
872
+ if (deferred.length > 0) {
873
+ deferredCaptures = deferred.map(c =>
874
+ `- **${c.id}**: "${c.text}" — ${c.rationale ?? "deferred during triage"}`
875
+ ).join("\n");
876
+ }
877
+ } catch {
878
+ // Non-fatal — captures module may not be available
879
+ }
832
880
 
833
881
  return loadPrompt("reassess-roadmap", {
834
882
  workingDirectory: base,
@@ -839,6 +887,7 @@ export async function buildReassessRoadmapPrompt(
839
887
  completedSliceSummaryPath: summaryRel,
840
888
  assessmentPath,
841
889
  inlinedContext,
890
+ deferredCaptures,
842
891
  });
843
892
  }
844
893
 
@@ -14,8 +14,10 @@ import {
14
14
  removeWorktree,
15
15
  worktreePath,
16
16
  } from "./worktree-manager.js";
17
+ import { detectWorktreeName } from "./worktree.js";
17
18
  import {
18
19
  MergeConflictError,
20
+ readIntegrationBranch,
19
21
  } from "./git-service.js";
20
22
  import { parseRoadmap } from "./files.js";
21
23
  import { loadEffectiveGSDPreferences } from "./preferences.js";
@@ -90,7 +92,12 @@ export function autoWorktreeBranch(milestoneId: string): string {
90
92
  */
91
93
  export function createAutoWorktree(basePath: string, milestoneId: string): string {
92
94
  const branch = autoWorktreeBranch(milestoneId);
93
- const info = createWorktree(basePath, milestoneId, { branch });
95
+
96
+ // Use the integration branch recorded in META.json as the start point.
97
+ // This ensures the worktree branch is created from the branch the user
98
+ // was on when they started the milestone (e.g. f-setup-gsd-2), not main.
99
+ const integrationBranch = readIntegrationBranch(basePath, milestoneId) ?? undefined;
100
+ const info = createWorktree(basePath, milestoneId, { branch, startPoint: integrationBranch });
94
101
 
95
102
  // Copy .gsd/ planning artifacts from the source repo into the new worktree.
96
103
  // Worktrees are fresh git checkouts — untracked files don't carry over.
@@ -224,6 +231,27 @@ export function getAutoWorktreeOriginalBase(): string | null {
224
231
  return originalBase;
225
232
  }
226
233
 
234
+ export function getActiveAutoWorktreeContext(): {
235
+ originalBase: string;
236
+ worktreeName: string;
237
+ branch: string;
238
+ } | null {
239
+ if (!originalBase) return null;
240
+ const cwd = process.cwd();
241
+ const resolvedBase = existsSync(originalBase) ? realpathSync(originalBase) : originalBase;
242
+ const wtDir = join(resolvedBase, ".gsd", "worktrees");
243
+ if (!cwd.startsWith(wtDir)) return null;
244
+ const worktreeName = detectWorktreeName(cwd);
245
+ if (!worktreeName) return null;
246
+ const branch = nativeGetCurrentBranch(cwd);
247
+ if (!branch.startsWith("milestone/")) return null;
248
+ return {
249
+ originalBase,
250
+ worktreeName,
251
+ branch,
252
+ };
253
+ }
254
+
227
255
  // ─── Merge Milestone -> Main ───────────────────────────────────────────────
228
256
 
229
257
  /**
@@ -279,11 +307,12 @@ export function mergeMilestoneToMain(
279
307
  const previousCwd = process.cwd();
280
308
  process.chdir(originalBasePath_);
281
309
 
282
- // 4. Resolve main branch from preferences
310
+ // 4. Resolve integration branch prefer milestone metadata, fall back to preferences / "main"
283
311
  const prefs = loadEffectiveGSDPreferences()?.preferences?.git ?? {};
284
- const mainBranch = prefs.main_branch || "main";
312
+ const integrationBranch = readIntegrationBranch(originalBasePath_, milestoneId);
313
+ const mainBranch = integrationBranch ?? prefs.main_branch ?? "main";
285
314
 
286
- // 5. Checkout main
315
+ // 5. Checkout integration branch
287
316
  nativeCheckoutBranch(originalBasePath_, mainBranch);
288
317
 
289
318
  // 6. Build rich commit message