diff --git a/src/resources/extensions/gsd/gsd-db.ts b/src/resources/extensions/gsd/gsd-db.ts index 9a42646dd..fdb53492a 100644 --- a/src/resources/extensions/gsd/gsd-db.ts +++ b/src/resources/extensions/gsd/gsd-db.ts @@ -1136,11 +1136,12 @@ export function insertMilestone(m: { }); } -export function upsertMilestonePlanning(milestoneId: string, planning: Partial, title?: string): void { +export function upsertMilestonePlanning(milestoneId: string, planning: Partial & { title?: string; status?: string }): void { if (!currentDb) throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open"); currentDb.prepare( `UPDATE milestones SET - title = COALESCE(:title, title), + title = COALESCE(NULLIF(:title, ''), title), + status = COALESCE(NULLIF(:status, ''), status), vision = COALESCE(:vision, vision), success_criteria = COALESCE(:success_criteria, success_criteria), key_risks = COALESCE(:key_risks, key_risks), @@ -1155,7 +1156,8 @@ export function upsertMilestonePlanning(milestoneId: string, planning: Partial { + const base = makeTmpBase(); + const dbPath = join(base, '.gsd', 'gsd.db'); + openDatabase(dbPath); + + try { + // Simulate ensureMilestoneDbRow: pre-create row with status "queued" + // (this is what gsd_milestone_generate_id does) + insertMilestone({ id: 'M001', status: 'queued' }); + + const before = getMilestone('M001'); + assert.equal(before?.status, 'queued', 'pre-condition: milestone should start as queued'); + + // Now plan the milestone — status should be promoted to "active" + const result = await handlePlanMilestone(validParams(), base); + assert.ok(!('error' in result), `unexpected error: ${'error' in result ? result.error : ''}`); + + const after = getMilestone('M001'); + assert.equal(after?.status, 'active', 'milestone status should be promoted from queued to active'); + assert.equal(after?.title, 'DB-backed planning', 'milestone title should be set'); + } finally { + cleanup(base); + } +}); diff --git a/src/resources/extensions/gsd/tools/plan-milestone.ts b/src/resources/extensions/gsd/tools/plan-milestone.ts index 4cc39fe8b..51b3120af 100644 --- a/src/resources/extensions/gsd/tools/plan-milestone.ts +++ b/src/resources/extensions/gsd/tools/plan-milestone.ts @@ -241,6 +241,8 @@ export async function handlePlanMilestone( }); upsertMilestonePlanning(params.milestoneId, { + title: params.title, + status: params.status ?? "active", vision: params.vision, successCriteria: params.successCriteria, keyRisks: params.keyRisks, @@ -252,7 +254,7 @@ export async function handlePlanMilestone( definitionOfDone: params.definitionOfDone, requirementCoverage: params.requirementCoverage, boundaryMapMarkdown: params.boundaryMapMarkdown, - }, params.title); + }); for (const slice of params.slices) { // Preserve completed/done status on re-plan (#2558).