From 3888ef41d41fd4edfc8c4538e742c8fda70e41cf Mon Sep 17 00:00:00 2001 From: Eyal Toledano Date: Thu, 12 Jun 2025 00:46:55 -0400 Subject: [PATCH] fix: include tagInfo in AI service responses for MCP tools - Update all core functions that call AI services to extract and return tagInfo - Update all direct functions to include tagInfo in MCP response data - Fixes issue where add_task, expand_task, and other AI commands were not including current tag and available tags information - tagInfo includes currentTag from state.json and availableTags list - Ensures tagged task lists system information is properly propagated through the full chain: AI service -> core function -> direct function -> MCP client --- mcp-server/src/core/direct-functions/add-task.js | 6 +++++- .../src/core/direct-functions/analyze-task-complexity.js | 3 ++- mcp-server/src/core/direct-functions/expand-task.js | 3 ++- mcp-server/src/core/direct-functions/parse-prd.js | 3 ++- mcp-server/src/core/direct-functions/research.js | 3 ++- .../src/core/direct-functions/update-subtask-by-id.js | 3 ++- mcp-server/src/core/direct-functions/update-task-by-id.js | 8 +++++--- mcp-server/src/core/direct-functions/update-tasks.js | 3 ++- scripts/modules/task-manager/add-task.js | 3 ++- scripts/modules/task-manager/analyze-task-complexity.js | 3 ++- scripts/modules/task-manager/expand-task.js | 3 ++- scripts/modules/task-manager/parse-prd.js | 3 ++- scripts/modules/task-manager/research.js | 4 +++- scripts/modules/task-manager/update-subtask-by-id.js | 3 ++- scripts/modules/task-manager/update-task-by-id.js | 3 ++- scripts/modules/task-manager/update-tasks.js | 3 ++- 16 files changed, 39 insertions(+), 18 deletions(-) diff --git a/mcp-server/src/core/direct-functions/add-task.js b/mcp-server/src/core/direct-functions/add-task.js index e334442f..9964dd21 100644 --- a/mcp-server/src/core/direct-functions/add-task.js +++ b/mcp-server/src/core/direct-functions/add-task.js @@ -95,6 +95,7 @@ export async function addTaskDirect(args, log, context = {}) { let manualTaskData = null; let newTaskId; let telemetryData; + let tagInfo; if (isManualCreation) { // Create manual task data object @@ -129,6 +130,7 @@ export async function addTaskDirect(args, log, context = {}) { ); newTaskId = result.newTaskId; telemetryData = result.telemetryData; + tagInfo = result.tagInfo; } else { // AI-driven task creation log.info( @@ -154,6 +156,7 @@ export async function addTaskDirect(args, log, context = {}) { ); newTaskId = result.newTaskId; telemetryData = result.telemetryData; + tagInfo = result.tagInfo; } // Restore normal logging @@ -164,7 +167,8 @@ export async function addTaskDirect(args, log, context = {}) { data: { taskId: newTaskId, message: `Successfully added new task #${newTaskId}`, - telemetryData: telemetryData + telemetryData: telemetryData, + tagInfo: tagInfo } }; } catch (error) { diff --git a/mcp-server/src/core/direct-functions/analyze-task-complexity.js b/mcp-server/src/core/direct-functions/analyze-task-complexity.js index 861bbda8..8a5cfa60 100644 --- a/mcp-server/src/core/direct-functions/analyze-task-complexity.js +++ b/mcp-server/src/core/direct-functions/analyze-task-complexity.js @@ -196,7 +196,8 @@ export async function analyzeTaskComplexityDirect(args, log, context = {}) { lowComplexityTasks }, fullReport: coreResult.report, - telemetryData: coreResult.telemetryData + telemetryData: coreResult.telemetryData, + tagInfo: coreResult.tagInfo } }; } catch (parseError) { diff --git a/mcp-server/src/core/direct-functions/expand-task.js b/mcp-server/src/core/direct-functions/expand-task.js index 6c98dd91..d92d178d 100644 --- a/mcp-server/src/core/direct-functions/expand-task.js +++ b/mcp-server/src/core/direct-functions/expand-task.js @@ -225,7 +225,8 @@ export async function expandTaskDirect(args, log, context = {}) { task: coreResult.task, subtasksAdded, hasExistingSubtasks, - telemetryData: coreResult.telemetryData + telemetryData: coreResult.telemetryData, + tagInfo: coreResult.tagInfo } }; } catch (error) { diff --git a/mcp-server/src/core/direct-functions/parse-prd.js b/mcp-server/src/core/direct-functions/parse-prd.js index ffe74cd2..ac1642e2 100644 --- a/mcp-server/src/core/direct-functions/parse-prd.js +++ b/mcp-server/src/core/direct-functions/parse-prd.js @@ -170,7 +170,8 @@ export async function parsePRDDirect(args, log, context = {}) { data: { message: successMsg, outputPath: result.tasksPath, - telemetryData: result.telemetryData + telemetryData: result.telemetryData, + tagInfo: result.tagInfo } }; } else { diff --git a/mcp-server/src/core/direct-functions/research.js b/mcp-server/src/core/direct-functions/research.js index b4fb5562..b9c20bc3 100644 --- a/mcp-server/src/core/direct-functions/research.js +++ b/mcp-server/src/core/direct-functions/research.js @@ -140,7 +140,8 @@ export async function researchDirect(args, log, context = {}) { userPromptTokens: result.userPromptTokens, totalInputTokens: result.totalInputTokens, detailLevel: result.detailLevel, - telemetryData: result.telemetryData + telemetryData: result.telemetryData, + tagInfo: result.tagInfo } }; } catch (error) { diff --git a/mcp-server/src/core/direct-functions/update-subtask-by-id.js b/mcp-server/src/core/direct-functions/update-subtask-by-id.js index 0df637d9..c1310294 100644 --- a/mcp-server/src/core/direct-functions/update-subtask-by-id.js +++ b/mcp-server/src/core/direct-functions/update-subtask-by-id.js @@ -139,7 +139,8 @@ export async function updateSubtaskByIdDirect(args, log, context = {}) { subtask: coreResult.updatedSubtask, tasksPath, useResearch, - telemetryData: coreResult.telemetryData + telemetryData: coreResult.telemetryData, + tagInfo: coreResult.tagInfo } }; } catch (error) { diff --git a/mcp-server/src/core/direct-functions/update-task-by-id.js b/mcp-server/src/core/direct-functions/update-task-by-id.js index 1d3d8753..478ba5a9 100644 --- a/mcp-server/src/core/direct-functions/update-task-by-id.js +++ b/mcp-server/src/core/direct-functions/update-task-by-id.js @@ -76,7 +76,7 @@ export async function updateTaskByIdDirect(args, log, context = {}) { } else { // Parse as integer for main task IDs taskId = parseInt(id, 10); - if (isNaN(taskId)) { + if (Number.isNaN(taskId)) { const errorMessage = `Invalid task ID: ${id}. Task ID must be a positive integer or subtask ID (e.g., "5.2").`; logWrapper.error(errorMessage); return { @@ -132,7 +132,8 @@ export async function updateTaskByIdDirect(args, log, context = {}) { message: message, taskId: taskId, updated: false, - telemetryData: coreResult?.telemetryData + telemetryData: coreResult?.telemetryData, + tagInfo: coreResult?.tagInfo } }; } @@ -149,7 +150,8 @@ export async function updateTaskByIdDirect(args, log, context = {}) { useResearch: useResearch, updated: true, updatedTask: coreResult.updatedTask, - telemetryData: coreResult.telemetryData + telemetryData: coreResult.telemetryData, + tagInfo: coreResult.tagInfo } }; } catch (error) { diff --git a/mcp-server/src/core/direct-functions/update-tasks.js b/mcp-server/src/core/direct-functions/update-tasks.js index cb719f43..1b33eca2 100644 --- a/mcp-server/src/core/direct-functions/update-tasks.js +++ b/mcp-server/src/core/direct-functions/update-tasks.js @@ -90,7 +90,8 @@ export async function updateTasksDirect(args, log, context = {}) { message: `Successfully updated ${result.updatedTasks.length} tasks.`, tasksPath: tasksJsonPath, updatedCount: result.updatedTasks.length, - telemetryData: result.telemetryData + telemetryData: result.telemetryData, + tagInfo: result.tagInfo } }; } else { diff --git a/scripts/modules/task-manager/add-task.js b/scripts/modules/task-manager/add-task.js index 8409aa6c..fbc3d12c 100644 --- a/scripts/modules/task-manager/add-task.js +++ b/scripts/modules/task-manager/add-task.js @@ -624,7 +624,8 @@ async function addTask( ); return { newTaskId: newTaskId, - telemetryData: aiServiceResponse ? aiServiceResponse.telemetryData : null + telemetryData: aiServiceResponse ? aiServiceResponse.telemetryData : null, + tagInfo: aiServiceResponse ? aiServiceResponse.tagInfo : null }; } catch (error) { // Stop any loading indicator on error diff --git a/scripts/modules/task-manager/analyze-task-complexity.js b/scripts/modules/task-manager/analyze-task-complexity.js index 0d5426e9..0c417d38 100644 --- a/scripts/modules/task-manager/analyze-task-complexity.js +++ b/scripts/modules/task-manager/analyze-task-complexity.js @@ -644,7 +644,8 @@ async function analyzeTaskComplexity(options, context = {}) { return { report: report, - telemetryData: aiServiceResponse?.telemetryData + telemetryData: aiServiceResponse?.telemetryData, + tagInfo: aiServiceResponse?.tagInfo }; } catch (aiError) { if (loadingIndicator) stopLoadingIndicator(loadingIndicator); diff --git a/scripts/modules/task-manager/expand-task.js b/scripts/modules/task-manager/expand-task.js index a0c1e4db..348f0e59 100644 --- a/scripts/modules/task-manager/expand-task.js +++ b/scripts/modules/task-manager/expand-task.js @@ -686,7 +686,8 @@ async function expandTask( // Return the updated task object AND telemetry data return { task, - telemetryData: aiServiceResponse?.telemetryData + telemetryData: aiServiceResponse?.telemetryData, + tagInfo: aiServiceResponse?.tagInfo }; } catch (error) { // Catches errors from file reading, parsing, AI call etc. diff --git a/scripts/modules/task-manager/parse-prd.js b/scripts/modules/task-manager/parse-prd.js index 095f9941..16b98010 100644 --- a/scripts/modules/task-manager/parse-prd.js +++ b/scripts/modules/task-manager/parse-prd.js @@ -359,7 +359,8 @@ Guidelines: return { success: true, tasksPath, - telemetryData: aiServiceResponse?.telemetryData + telemetryData: aiServiceResponse?.telemetryData, + tagInfo: aiServiceResponse?.tagInfo }; } catch (error) { report(`Error parsing PRD: ${error.message}`, 'error'); diff --git a/scripts/modules/task-manager/research.js b/scripts/modules/task-manager/research.js index b7a7f5fb..3d307e11 100644 --- a/scripts/modules/task-manager/research.js +++ b/scripts/modules/task-manager/research.js @@ -244,6 +244,7 @@ async function performResearch( const researchResult = aiResult.mainResult; const telemetryData = aiResult.telemetryData; + const tagInfo = aiResult.tagInfo; // Format and display results if (outputFormat === 'text') { @@ -285,7 +286,8 @@ async function performResearch( userPromptTokens, totalInputTokens, detailLevel, - telemetryData + telemetryData, + tagInfo }; } catch (error) { logFn.error(`Research query failed: ${error.message}`); diff --git a/scripts/modules/task-manager/update-subtask-by-id.js b/scripts/modules/task-manager/update-subtask-by-id.js index e1b355a3..aa8b894b 100644 --- a/scripts/modules/task-manager/update-subtask-by-id.js +++ b/scripts/modules/task-manager/update-subtask-by-id.js @@ -366,7 +366,8 @@ Output Requirements: return { updatedSubtask: updatedSubtask, - telemetryData: aiServiceResponse.telemetryData + telemetryData: aiServiceResponse.telemetryData, + tagInfo: aiServiceResponse.tagInfo }; } catch (error) { if (outputFormat === 'text' && loadingIndicator) { diff --git a/scripts/modules/task-manager/update-task-by-id.js b/scripts/modules/task-manager/update-task-by-id.js index 66d518be..c2eb6ea4 100644 --- a/scripts/modules/task-manager/update-task-by-id.js +++ b/scripts/modules/task-manager/update-task-by-id.js @@ -535,7 +535,8 @@ The changes described in the prompt should be thoughtfully applied to make the t // --- Return Success with Telemetry --- return { updatedTask: updatedTask, // Return the updated task object - telemetryData: aiServiceResponse.telemetryData // <<< ADD telemetryData + telemetryData: aiServiceResponse.telemetryData, // <<< ADD telemetryData + tagInfo: aiServiceResponse.tagInfo }; } catch (error) { // Catch errors from generateTextService diff --git a/scripts/modules/task-manager/update-tasks.js b/scripts/modules/task-manager/update-tasks.js index 13e64af6..ba30a14e 100644 --- a/scripts/modules/task-manager/update-tasks.js +++ b/scripts/modules/task-manager/update-tasks.js @@ -486,7 +486,8 @@ The changes described in the prompt should be applied to ALL tasks in the list.` return { success: true, updatedTasks: parsedUpdatedTasks, - telemetryData: aiServiceResponse.telemetryData + telemetryData: aiServiceResponse.telemetryData, + tagInfo: aiServiceResponse.tagInfo }; } catch (error) { if (loadingIndicator) stopLoadingIndicator(loadingIndicator);