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.
- package/README.md +39 -0
- package/dist/onboarding.js +2 -2
- package/dist/remote-questions-config.d.ts +10 -0
- package/dist/remote-questions-config.js +36 -0
- package/dist/resources/extensions/gsd/activity-log.ts +37 -7
- package/dist/resources/extensions/gsd/auto-dashboard.ts +14 -2
- package/dist/resources/extensions/gsd/auto-prompts.ts +65 -16
- package/dist/resources/extensions/gsd/auto-worktree.ts +33 -4
- package/dist/resources/extensions/gsd/auto.ts +399 -29
- package/dist/resources/extensions/gsd/captures.ts +384 -0
- package/dist/resources/extensions/gsd/commands.ts +382 -23
- package/dist/resources/extensions/gsd/complexity-classifier.ts +322 -0
- package/dist/resources/extensions/gsd/dashboard-overlay.ts +10 -0
- package/dist/resources/extensions/gsd/dispatch-guard.ts +7 -19
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +201 -2
- package/dist/resources/extensions/gsd/files.ts +123 -1
- package/dist/resources/extensions/gsd/guided-flow.ts +237 -4
- package/dist/resources/extensions/gsd/index.ts +47 -3
- package/dist/resources/extensions/gsd/metrics.ts +48 -0
- package/dist/resources/extensions/gsd/model-cost-table.ts +65 -0
- package/dist/resources/extensions/gsd/model-router.ts +256 -0
- package/dist/resources/extensions/gsd/paths.ts +9 -0
- package/dist/resources/extensions/gsd/post-unit-hooks.ts +2 -1
- package/dist/resources/extensions/gsd/preferences.ts +132 -1
- package/dist/resources/extensions/gsd/prompt-loader.ts +45 -9
- package/dist/resources/extensions/gsd/prompts/execute-task.md +6 -5
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -0
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +8 -0
- package/dist/resources/extensions/gsd/prompts/system.md +2 -0
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +62 -0
- package/dist/resources/extensions/gsd/queue-order.ts +231 -0
- package/dist/resources/extensions/gsd/queue-reorder-ui.ts +263 -0
- package/dist/resources/extensions/gsd/state.ts +15 -3
- package/dist/resources/extensions/gsd/templates/knowledge.md +19 -0
- package/dist/resources/extensions/gsd/templates/preferences.md +14 -0
- package/dist/resources/extensions/gsd/tests/auto-worktree.test.ts +20 -0
- package/dist/resources/extensions/gsd/tests/captures.test.ts +438 -0
- package/dist/resources/extensions/gsd/tests/complexity-classifier.test.ts +181 -0
- package/dist/resources/extensions/gsd/tests/derive-state-deps.test.ts +99 -0
- package/dist/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +434 -0
- package/dist/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +79 -0
- package/dist/resources/extensions/gsd/tests/knowledge.test.ts +161 -0
- package/dist/resources/extensions/gsd/tests/memory-leak-guards.test.ts +87 -0
- package/dist/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +144 -0
- package/dist/resources/extensions/gsd/tests/model-cost-table.test.ts +69 -0
- package/dist/resources/extensions/gsd/tests/model-router.test.ts +167 -0
- package/dist/resources/extensions/gsd/tests/preferences-wizard-fields.test.ts +168 -0
- package/dist/resources/extensions/gsd/tests/queue-order.test.ts +204 -0
- package/dist/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +281 -0
- package/dist/resources/extensions/gsd/tests/remote-questions.test.ts +227 -1
- package/dist/resources/extensions/gsd/tests/routing-history.test.ts +215 -62
- package/dist/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +139 -0
- package/dist/resources/extensions/gsd/tests/triage-dispatch.test.ts +224 -0
- package/dist/resources/extensions/gsd/tests/triage-resolution.test.ts +215 -0
- package/dist/resources/extensions/gsd/tests/visualizer-data.test.ts +198 -0
- package/dist/resources/extensions/gsd/tests/visualizer-views.test.ts +255 -0
- package/dist/resources/extensions/gsd/triage-resolution.ts +200 -0
- package/dist/resources/extensions/gsd/triage-ui.ts +175 -0
- package/dist/resources/extensions/gsd/visualizer-data.ts +154 -0
- package/dist/resources/extensions/gsd/visualizer-overlay.ts +193 -0
- package/dist/resources/extensions/gsd/visualizer-views.ts +293 -0
- package/dist/resources/extensions/gsd/worktree-manager.ts +8 -5
- package/dist/resources/extensions/gsd/worktree.ts +22 -0
- package/dist/resources/extensions/remote-questions/discord-adapter.ts +33 -0
- package/dist/resources/extensions/remote-questions/format.ts +12 -6
- package/dist/resources/extensions/remote-questions/manager.ts +8 -0
- package/dist/resources/extensions/shared/next-action-ui.ts +16 -1
- package/package.json +1 -1
- package/packages/pi-coding-agent/dist/cli/args.d.ts +5 -0
- package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/cli/args.js +21 -0
- package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
- package/packages/pi-coding-agent/dist/cli/list-models.d.ts +14 -3
- package/packages/pi-coding-agent/dist/cli/list-models.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/cli/list-models.js +52 -17
- package/packages/pi-coding-agent/dist/cli/list-models.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/discovery-cache.d.ts +27 -0
- package/packages/pi-coding-agent/dist/core/discovery-cache.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/discovery-cache.js +79 -0
- package/packages/pi-coding-agent/dist/core/discovery-cache.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/discovery-cache.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/discovery-cache.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/discovery-cache.test.js +140 -0
- package/packages/pi-coding-agent/dist/core/discovery-cache.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-discovery.d.ts +35 -0
- package/packages/pi-coding-agent/dist/core/model-discovery.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-discovery.js +162 -0
- package/packages/pi-coding-agent/dist/core/model-discovery.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-discovery.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-discovery.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-discovery.test.js +100 -0
- package/packages/pi-coding-agent/dist/core/model-discovery.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-discovery.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry-discovery.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-discovery.test.js +113 -0
- package/packages/pi-coding-agent/dist/core/model-registry-discovery.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +26 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +98 -0
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/models-json-writer.d.ts +62 -0
- package/packages/pi-coding-agent/dist/core/models-json-writer.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/models-json-writer.js +145 -0
- package/packages/pi-coding-agent/dist/core/models-json-writer.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/models-json-writer.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/models-json-writer.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/models-json-writer.test.js +118 -0
- package/packages/pi-coding-agent/dist/core/models-json-writer.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
- package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +5 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +4 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +17 -2
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/index.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/index.js +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts +25 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +121 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +32 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/src/cli/args.ts +21 -0
- package/packages/pi-coding-agent/src/cli/list-models.ts +70 -17
- package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +170 -0
- package/packages/pi-coding-agent/src/core/discovery-cache.ts +97 -0
- package/packages/pi-coding-agent/src/core/model-discovery.test.ts +125 -0
- package/packages/pi-coding-agent/src/core/model-discovery.ts +231 -0
- package/packages/pi-coding-agent/src/core/model-registry-discovery.test.ts +135 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +107 -0
- package/packages/pi-coding-agent/src/core/models-json-writer.test.ts +145 -0
- package/packages/pi-coding-agent/src/core/models-json-writer.ts +188 -0
- package/packages/pi-coding-agent/src/core/settings-manager.ts +21 -0
- package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
- package/packages/pi-coding-agent/src/index.ts +5 -0
- package/packages/pi-coding-agent/src/main.ts +19 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/index.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +163 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +37 -0
- package/src/resources/extensions/gsd/activity-log.ts +37 -7
- package/src/resources/extensions/gsd/auto-dashboard.ts +14 -2
- package/src/resources/extensions/gsd/auto-prompts.ts +65 -16
- package/src/resources/extensions/gsd/auto-worktree.ts +33 -4
- package/src/resources/extensions/gsd/auto.ts +399 -29
- package/src/resources/extensions/gsd/captures.ts +384 -0
- package/src/resources/extensions/gsd/commands.ts +382 -23
- package/src/resources/extensions/gsd/complexity-classifier.ts +322 -0
- package/src/resources/extensions/gsd/dashboard-overlay.ts +10 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +7 -19
- package/src/resources/extensions/gsd/docs/preferences-reference.md +201 -2
- package/src/resources/extensions/gsd/files.ts +123 -1
- package/src/resources/extensions/gsd/guided-flow.ts +237 -4
- package/src/resources/extensions/gsd/index.ts +47 -3
- package/src/resources/extensions/gsd/metrics.ts +48 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +65 -0
- package/src/resources/extensions/gsd/model-router.ts +256 -0
- package/src/resources/extensions/gsd/paths.ts +9 -0
- package/src/resources/extensions/gsd/post-unit-hooks.ts +2 -1
- package/src/resources/extensions/gsd/preferences.ts +132 -1
- package/src/resources/extensions/gsd/prompt-loader.ts +45 -9
- package/src/resources/extensions/gsd/prompts/execute-task.md +6 -5
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -0
- package/src/resources/extensions/gsd/prompts/replan-slice.md +8 -0
- package/src/resources/extensions/gsd/prompts/system.md +2 -0
- package/src/resources/extensions/gsd/prompts/triage-captures.md +62 -0
- package/src/resources/extensions/gsd/queue-order.ts +231 -0
- package/src/resources/extensions/gsd/queue-reorder-ui.ts +263 -0
- package/src/resources/extensions/gsd/state.ts +15 -3
- package/src/resources/extensions/gsd/templates/knowledge.md +19 -0
- package/src/resources/extensions/gsd/templates/preferences.md +14 -0
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/captures.test.ts +438 -0
- package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +181 -0
- package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +434 -0
- package/src/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +161 -0
- package/src/resources/extensions/gsd/tests/memory-leak-guards.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/model-router.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/preferences-wizard-fields.test.ts +168 -0
- package/src/resources/extensions/gsd/tests/queue-order.test.ts +204 -0
- package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +281 -0
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +227 -1
- package/src/resources/extensions/gsd/tests/routing-history.test.ts +215 -62
- package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +224 -0
- package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +215 -0
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +198 -0
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +255 -0
- package/src/resources/extensions/gsd/triage-resolution.ts +200 -0
- package/src/resources/extensions/gsd/triage-ui.ts +175 -0
- package/src/resources/extensions/gsd/visualizer-data.ts +154 -0
- package/src/resources/extensions/gsd/visualizer-overlay.ts +193 -0
- package/src/resources/extensions/gsd/visualizer-views.ts +293 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +8 -5
- package/src/resources/extensions/gsd/worktree.ts +22 -0
- package/src/resources/extensions/remote-questions/discord-adapter.ts +33 -0
- package/src/resources/extensions/remote-questions/format.ts +12 -6
- package/src/resources/extensions/remote-questions/manager.ts +8 -0
- 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
|
-
|
|
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
|
|
310
|
+
// 4. Resolve integration branch — prefer milestone metadata, fall back to preferences / "main"
|
|
283
311
|
const prefs = loadEffectiveGSDPreferences()?.preferences?.git ?? {};
|
|
284
|
-
const
|
|
312
|
+
const integrationBranch = readIntegrationBranch(originalBasePath_, milestoneId);
|
|
313
|
+
const mainBranch = integrationBranch ?? prefs.main_branch ?? "main";
|
|
285
314
|
|
|
286
|
-
// 5. Checkout
|
|
315
|
+
// 5. Checkout integration branch
|
|
287
316
|
nativeCheckoutBranch(originalBasePath_, mainBranch);
|
|
288
317
|
|
|
289
318
|
// 6. Build rich commit message
|