From 3bc82965df267cf9b4073b7cba6a82c26491331c Mon Sep 17 00:00:00 2001 From: MH4GF Date: Wed, 8 Oct 2025 20:03:21 +0900 Subject: [PATCH 1/2] refactor(agent): use isHumanMessage() and message.text in createGraph MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Import isHumanMessage from @langchain/core/messages - Replace msg._getType() === 'human' with isHumanMessage() helper - Replace content as string with message.text property 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- frontend/internal-packages/agent/src/createGraph.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/frontend/internal-packages/agent/src/createGraph.ts b/frontend/internal-packages/agent/src/createGraph.ts index 3470803a99..1c83a71ebd 100644 --- a/frontend/internal-packages/agent/src/createGraph.ts +++ b/frontend/internal-packages/agent/src/createGraph.ts @@ -1,4 +1,4 @@ -import { AIMessage } from '@langchain/core/messages' +import { AIMessage, isHumanMessage } from '@langchain/core/messages' import type { RunnableConfig } from '@langchain/core/runnables' import { END, START, StateGraph } from '@langchain/langgraph' import type { BaseCheckpointSaver } from '@langchain/langgraph-checkpoint' @@ -24,8 +24,13 @@ export const createGraph = (checkpointer?: BaseCheckpointSaver) => { const qaAgentSubgraph = createQaAgentGraph() const callDbAgent = async (state: WorkflowState, config: RunnableConfig) => { + // Extract user input from the first HumanMessage + const userInput = + state.messages.find((msg) => isHumanMessage(msg))?.text || '' + const prompt = convertRequirementsToPrompt( state.analyzedRequirements, + userInput, state.schemaIssues, ) const modifiedState = { ...state, messages: [], prompt } From 33963d6f2add9943bd12386fed55a21b641aa8ee Mon Sep 17 00:00:00 2001 From: MH4GF Date: Wed, 8 Oct 2025 20:05:02 +0900 Subject: [PATCH 2/2] refactor(agent): update prompt format with markdown headers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Change prompt format to use ## markdown headers - Reorder sections: Session Goal → Original User Request → Test Cases - Update all test snapshots to match new format 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- ...onvertAnalyzedRequirementsToPrompt.test.ts | 101 +++++++++++++++--- .../convertAnalyzedRequirementsToPrompt.ts | 26 +++-- 2 files changed, 102 insertions(+), 25 deletions(-) diff --git a/frontend/internal-packages/agent/src/db-agent/utils/convertAnalyzedRequirementsToPrompt.test.ts b/frontend/internal-packages/agent/src/db-agent/utils/convertAnalyzedRequirementsToPrompt.test.ts index ff3efcf3d8..0103a0c246 100644 --- a/frontend/internal-packages/agent/src/db-agent/utils/convertAnalyzedRequirementsToPrompt.test.ts +++ b/frontend/internal-packages/agent/src/db-agent/utils/convertAnalyzedRequirementsToPrompt.test.ts @@ -56,12 +56,23 @@ describe('convertAnalyzedRequirementsToPrompt', () => { } it('should convert analyzed requirements to formatted text prompt', () => { - const result = convertRequirementsToPrompt(sampleAnalyzedRequirements) + const userInput = 'Design a user management system with authentication' + const result = convertRequirementsToPrompt( + sampleAnalyzedRequirements, + userInput, + ) expect(result).toMatchInlineSnapshot(` - "Session Goal: Build a user management system + "## Session Goal + + Build a user management system + + ## Original User Request + + Design a user management system with authentication + + ## Test Cases - Test Cases: - authentication: User login (SELECT), User logout (UPDATE), Password reset (UPDATE) - userManagement: Create new user (INSERT), Update user info (UPDATE), Delete user (DELETE)" `) @@ -72,13 +83,20 @@ describe('convertAnalyzedRequirementsToPrompt', () => { goal: 'Simple system', testcases: {}, } + const userInput = 'Build a simple system' - const result = convertRequirementsToPrompt(analyzedRequirements) + const result = convertRequirementsToPrompt(analyzedRequirements, userInput) expect(result).toMatchInlineSnapshot(` - "Session Goal: Simple system + "## Session Goal + + Simple system + + ## Original User Request + + Build a simple system - Test Cases:" + ## Test Cases" `) }) @@ -97,37 +115,55 @@ describe('convertAnalyzedRequirementsToPrompt', () => { ], }, } + const userInput = 'Add a basic feature' - const result = convertRequirementsToPrompt(analyzedRequirements) + const result = convertRequirementsToPrompt(analyzedRequirements, userInput) expect(result).toMatchInlineSnapshot(` - "Session Goal: + "## Session Goal + + + + ## Original User Request + + Add a basic feature + + ## Test Cases - Test Cases: - basic: Basic feature test (INSERT)" `) }) describe('with schemaIssues filtering', () => { it('should filter testcases based on schemaIssues without showing issue details', () => { + const userInput = 'Design a user management system with authentication' const schemaIssues = [ { testcaseId: '2', description: 'Missing logout table' }, ] const result = convertRequirementsToPrompt( sampleAnalyzedRequirements, + userInput, schemaIssues, ) expect(result).toMatchInlineSnapshot(` - "Session Goal: Build a user management system + "## Session Goal + + Build a user management system + + ## Original User Request + + Design a user management system with authentication + + ## Test Cases - Test Cases: - authentication: User logout (UPDATE)" `) }) it('should handle empty schemaIssues array', () => { + const userInput = 'Design a user management system with authentication' const schemaIssues: Array<{ testcaseId: string description: string @@ -135,38 +171,56 @@ describe('convertAnalyzedRequirementsToPrompt', () => { const result = convertRequirementsToPrompt( sampleAnalyzedRequirements, + userInput, schemaIssues, ) // Should behave like no schemaIssues parameter expect(result).toMatchInlineSnapshot(` - "Session Goal: Build a user management system + "## Session Goal + + Build a user management system + + ## Original User Request + + Design a user management system with authentication + + ## Test Cases - Test Cases: - authentication: User login (SELECT), User logout (UPDATE), Password reset (UPDATE) - userManagement: Create new user (INSERT), Update user info (UPDATE), Delete user (DELETE)" `) }) it('should filter out entire categories when no testcases match schemaIssues', () => { + const userInput = 'Design a user management system with authentication' const schemaIssues = [ { testcaseId: '1', description: 'Login form missing' }, ] const result = convertRequirementsToPrompt( sampleAnalyzedRequirements, + userInput, schemaIssues, ) expect(result).toMatchInlineSnapshot(` - "Session Goal: Build a user management system + "## Session Goal + + Build a user management system + + ## Original User Request + + Design a user management system with authentication + + ## Test Cases - Test Cases: - authentication: User login (SELECT)" `) }) it('should handle schemaIssues with no matching testcases', () => { + const userInput = 'Design a user management system with authentication' const schemaIssues = [ { testcaseId: 'non-existent', @@ -176,26 +230,39 @@ describe('convertAnalyzedRequirementsToPrompt', () => { const result = convertRequirementsToPrompt( sampleAnalyzedRequirements, + userInput, schemaIssues, ) expect(result).toMatchInlineSnapshot(` - "Session Goal: Build a user management system + "## Session Goal + + Build a user management system - Test Cases:" + ## Original User Request + + Design a user management system with authentication + + ## Test Cases" `) }) it('should filter testcases without showing IDs or issue details', () => { + const userInput = 'Design a user management system with authentication' const schemaIssues = [ { testcaseId: '4', description: 'User table structure issue' }, ] const result = convertRequirementsToPrompt( sampleAnalyzedRequirements, + userInput, schemaIssues, ) + expect(result).toContain('## Original User Request') + expect(result).toContain( + 'Design a user management system with authentication', + ) expect(result).toContain('Create new user') expect(result).not.toContain('[4]') expect(result).not.toContain('User table structure issue') diff --git a/frontend/internal-packages/agent/src/db-agent/utils/convertAnalyzedRequirementsToPrompt.ts b/frontend/internal-packages/agent/src/db-agent/utils/convertAnalyzedRequirementsToPrompt.ts index 013fd8a0d4..4c06fc5a2f 100644 --- a/frontend/internal-packages/agent/src/db-agent/utils/convertAnalyzedRequirementsToPrompt.ts +++ b/frontend/internal-packages/agent/src/db-agent/utils/convertAnalyzedRequirementsToPrompt.ts @@ -4,6 +4,7 @@ type TestCases = AnalyzedRequirements['testcases'] export const convertRequirementsToPrompt = ( requirements: AnalyzedRequirements, + userInput: string, schemaIssues?: Array<{ testcaseId: string; description: string }>, ): string => { let testcasesToUse: TestCases = requirements.testcases @@ -29,13 +30,22 @@ export const convertRequirementsToPrompt = ( testcasesToUse = filteredTestcases } - return `Session Goal:${requirements.goal ? ` ${requirements.goal}` : ''} + const testCasesSection = Object.entries(testcasesToUse) + .map( + ([category, testcases]) => + `- ${category}: ${testcases.map((tc) => `${tc.title} (${tc.type})`).join(', ')}`, + ) + .join('\n') + + return `## Session Goal + +${requirements.goal} + +## Original User Request + +${userInput} + +## Test Cases -Test Cases: -${Object.entries(testcasesToUse) - .map( - ([category, testcases]) => - `- ${category}: ${testcases.map((tc) => `${tc.title} (${tc.type})`).join(', ')}`, - ) - .join('\n')}`.trim() +${testCasesSection}`.trim() }