feat: added handling for complexity score in find task by id

This commit is contained in:
Shrey Paharia
2025-04-19 03:45:22 +05:30
parent b98af1541e
commit 3162ac49ec
2 changed files with 110 additions and 25 deletions

View File

@@ -3,9 +3,9 @@
* Utility functions for the Task Master CLI
*/
import chalk from 'chalk';
import fs from 'fs';
import path from 'path';
import chalk from 'chalk';
// Global silent mode flag
let silentMode = false;
@@ -247,6 +247,8 @@ function findTaskById(tasks, taskId) {
return null;
}
let taskResult = null;
// Check if it's a subtask ID (e.g., "1.2")
if (typeof taskId === 'string' && taskId.includes('.')) {
const [parentId, subtaskId] = taskId
@@ -267,13 +269,33 @@ function findTaskById(tasks, taskId) {
status: parentTask.status
};
subtask.isSubtask = true;
taskResult = subtask;
}
return subtask || null;
} else {
const id = parseInt(taskId, 10);
taskResult = tasks.find((t) => t.id === id) || null;
}
const id = parseInt(taskId, 10);
return tasks.find((t) => t.id === id) || null;
// If we found a task, check for complexity data
if (taskResult) {
// Try to read complexity report
const complexityReport = readComplexityReport();
if (complexityReport && complexityReport.complexityAnalysis) {
// For a main task, look for a direct match
if (!taskResult.isSubtask) {
const taskAnalysis = complexityReport.complexityAnalysis.find(
analysis => analysis.taskId === taskResult.id
);
if (taskAnalysis) {
taskResult.complexityScore = taskAnalysis.complexityScore;
}
}
}
}
return taskResult;
}
/**
@@ -399,23 +421,6 @@ function detectCamelCaseFlags(args) {
// Export all utility functions and configuration
export {
CONFIG,
LOG_LEVELS,
log,
readJSON,
writeJSON,
sanitizePrompt,
readComplexityReport,
findTaskInComplexityReport,
taskExists,
formatTaskId,
findTaskById,
truncate,
findCycles,
toKebabCase,
detectCamelCaseFlags,
enableSilentMode,
disableSilentMode,
isSilentMode,
getTaskManager
CONFIG, detectCamelCaseFlags, disableSilentMode, enableSilentMode, findCycles, findTaskById, findTaskInComplexityReport, formatTaskId, getTaskManager, isSilentMode, log, LOG_LEVELS, readComplexityReport, readJSON, sanitizePrompt, taskExists, toKebabCase, truncate, writeJSON
};

View File

@@ -2,8 +2,26 @@
* Task finder tests
*/
import { jest } from '@jest/globals';
// Set up mock before imports
const mockReadComplexityReport = jest.fn().mockReturnValue(null);
// Mock utils module to control readComplexityReport behavior
jest.mock('../../scripts/modules/utils.js', () => {
// Get the original module
const originalModule = jest.requireActual('../../scripts/modules/utils.js');
// Return a modified version
return {
...originalModule,
readComplexityReport: mockReadComplexityReport
};
});
// Import after mocks are set up
import { findTaskById } from '../../scripts/modules/utils.js';
import { sampleTasks, emptySampleTasks } from '../fixtures/sample-tasks.js';
import { emptySampleTasks, sampleTasks } from '../fixtures/sample-tasks.js';
describe('Task Finder', () => {
describe('findTaskById function', () => {
@@ -46,5 +64,67 @@ describe('Task Finder', () => {
const task = findTaskById(emptySampleTasks.tasks, 1);
expect(task).toBeNull();
});
test('should include complexity score when report exists', () => {
// call readComplexityReport
// Set up mock implementation for this test
mockReadComplexityReport.mockReturnValue({
meta: {
generatedAt: '2023-01-01T00:00:00.000Z',
tasksAnalyzed: 3,
thresholdScore: 5
},
complexityAnalysis: [
{
taskId: 1,
taskTitle: 'Initialize Project',
complexityScore: 3,
recommendedSubtasks: 2
},
{
taskId: 2,
taskTitle: 'Create Core Functionality',
complexityScore: 8,
recommendedSubtasks: 5
},
{
taskId: 3,
taskTitle: 'Implement UI Components',
complexityScore: 6,
recommendedSubtasks: 4
}
]
});
const task = findTaskById(sampleTasks.tasks, 2);
expect(task).toBeDefined();
expect(task.id).toBe(2);
expect(task.complexityScore).toBe(8);
});
test('should work correctly when task has no complexity data', () => {
// Set up mock implementation for this test
mockReadComplexityReport.mockReturnValue({
complexityAnalysis: [{ taskId: 999, complexityScore: 5 }]
});
const task = findTaskById(sampleTasks.tasks, 2);
expect(task).toBeDefined();
expect(task.id).toBe(2);
expect(task.complexityScore).toBeUndefined();
});
test('should work correctly when no complexity report exists', () => {
// Set up mock implementation for this test
mockReadComplexityReport.mockReturnValue(null);
const task = findTaskById(sampleTasks.tasks, 2);
expect(task).toBeDefined();
expect(task.id).toBe(2);
expect(task.complexityScore).toBeUndefined();
});
});
});