fix(ai): Improve AI object response handling in parse-prd

This commit updates  to more robustly handle responses from .

Previously, the module strictly expected the AI-generated object to be nested under . This change ensures that it now first checks if  itself contains the expected task data object, and then falls back to checking .

This enhancement increases compatibility with varying AI provider response structures, similar to the improvements recently made in .
This commit is contained in:
Eyal Toledano
2025-05-13 13:21:51 -04:00
parent e53d5e1577
commit 9f4bac8d6a
3 changed files with 26 additions and 6 deletions

View File

@@ -1,8 +1,8 @@
{
"models": {
"main": {
"provider": "google",
"modelId": "gemini-2.5-pro-exp-03-25",
"provider": "anthropic",
"modelId": "claude-3-7-sonnet-20250219",
"maxTokens": 100000,
"temperature": 0.2
},

View File

@@ -545,7 +545,7 @@ function registerCommands(programInstance) {
if (!(await confirmOverwriteIfNeeded())) return;
console.log(chalk.blue(`Generating ${numTasks} tasks...`));
spinner = ora('Parsing PRD and generating tasks...').start();
spinner = ora('Parsing PRD and generating tasks...\n').start();
await parsePRD(defaultPrdPath, outputPath, numTasks, {
append: useAppend, // Changed key from useAppend to append
force: useForce // Changed key from useForce to force
@@ -607,7 +607,7 @@ function registerCommands(programInstance) {
console.log(chalk.blue('Appending to existing tasks...'));
}
spinner = ora('Parsing PRD and generating tasks...').start();
spinner = ora('Parsing PRD and generating tasks...\n').start();
await parsePRD(inputFile, outputPath, numTasks, {
useAppend: useAppend,
useForce: useForce

View File

@@ -226,10 +226,30 @@ Guidelines:
if (!fs.existsSync(tasksDir)) {
fs.mkdirSync(tasksDir, { recursive: true });
}
logFn.success('Successfully parsed PRD via AI service.');
logFn.success('Successfully parsed PRD via AI service.\n');
// Validate and Process Tasks
const generatedData = aiServiceResponse?.mainResult?.object;
// const generatedData = aiServiceResponse?.mainResult?.object;
// Robustly get the actual AI-generated object
let generatedData = null;
if (aiServiceResponse?.mainResult) {
if (
typeof aiServiceResponse.mainResult === 'object' &&
aiServiceResponse.mainResult !== null &&
'tasks' in aiServiceResponse.mainResult
) {
// If mainResult itself is the object with a 'tasks' property
generatedData = aiServiceResponse.mainResult;
} else if (
typeof aiServiceResponse.mainResult.object === 'object' &&
aiServiceResponse.mainResult.object !== null &&
'tasks' in aiServiceResponse.mainResult.object
) {
// If mainResult.object is the object with a 'tasks' property
generatedData = aiServiceResponse.mainResult.object;
}
}
if (!generatedData || !Array.isArray(generatedData.tasks)) {
logFn.error(