From 54c666e356d89090a8471ddba7e4bfb18f7bfc35 Mon Sep 17 00:00:00 2001 From: joshwheelock Date: Wed, 8 Jul 2026 22:07:44 +0200 Subject: [PATCH] Render rejected goal issues on start --- .../commands/goals/start/GoalStartOutputBuilder.ts | 9 +++++++++ .../goals/start/GoalStartOutputBuilder.test.ts | 14 ++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/presentation/cli/commands/goals/start/GoalStartOutputBuilder.ts b/src/presentation/cli/commands/goals/start/GoalStartOutputBuilder.ts index bc864564..e1e07e21 100644 --- a/src/presentation/cli/commands/goals/start/GoalStartOutputBuilder.ts +++ b/src/presentation/cli/commands/goals/start/GoalStartOutputBuilder.ts @@ -40,6 +40,15 @@ export class GoalStartOutputBuilder { "INSTRUCTION: Your (the developer's) purpose for this goal is to fulfill this objective." ); + // Review Issues section (if rejected goal is being restarted) + if (goal.reviewIssues) { + this.builder.addPrompt( + heading("Review Issues") + "\n" + + wrapContent(goal.reviewIssues).map(line => Colors.warning(line)).join('\n') + "\n\n" + + "INSTRUCTION: This goal was rejected during QA review. You (the developer) MUST address these issues before submitting the goal again." + ); + } + // Success Criteria section const successCriteriaLines = goal.successCriteria.flatMap(c => wrapBulletContinuation(c)); this.builder.addPrompt( diff --git a/tests/presentation/cli/commands/goals/start/GoalStartOutputBuilder.test.ts b/tests/presentation/cli/commands/goals/start/GoalStartOutputBuilder.test.ts index 6cb33386..7ec7753a 100644 --- a/tests/presentation/cli/commands/goals/start/GoalStartOutputBuilder.test.ts +++ b/tests/presentation/cli/commands/goals/start/GoalStartOutputBuilder.test.ts @@ -16,6 +16,7 @@ import { GoalContext } from "../../../../../../src/application/context/goals/get import { ComponentView } from "../../../../../../src/application/context/components/ComponentView.js"; import { DecisionView } from "../../../../../../src/application/context/decisions/DecisionView.js"; import { InvariantView } from "../../../../../../src/application/context/invariants/InvariantView.js"; +import { stripAnsi } from "../../../../../../src/presentation/cli/rendering/StyleConfig.js"; describe("GoalStartOutputBuilder", () => { let builder: GoalStartOutputBuilder; @@ -106,6 +107,19 @@ describe("GoalStartOutputBuilder", () => { expect(text).toContain("Completed step 2"); }); + it("should render review issues when restarting a rejected goal", () => { + const view = makeView({ + status: "doing", + reviewIssues: "Missing test coverage for rejected goal rework", + }); + const output = builder.build(view); + const text = stripAnsi(output.toHumanReadable()); + + expect(text).toContain("Review Issues"); + expect(text).toContain("Missing test coverage for rejected goal rework"); + expect(text).toContain("MUST address these issues before submitting the goal again"); + }); + it("should include submit instruction with goal ID", () => { const view = makeView({ goalId: "goal_abc" }); const output = builder.build(view);