From d007f23c2413a5903c6192d6087530647e5bc1aa Mon Sep 17 00:00:00 2001 From: "Christopher C. Smith" Date: Sun, 30 Mar 2025 16:55:32 -0400 Subject: [PATCH 1/3] Return all task details from read_task tool --- src/server/TaskManager.ts | 15 +++------------ src/types/index.ts | 5 +---- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/src/server/TaskManager.ts b/src/server/TaskManager.ts index bd560ae..98a3be9 100644 --- a/src/server/TaskManager.ts +++ b/src/server/TaskManager.ts @@ -428,23 +428,14 @@ export class TaskManager { await this.ensureInitialized(); // Reload from disk to ensure we have the latest data await this.reloadFromDisk(); - + for (const proj of this.data.projects) { const target = proj.tasks.find((t) => t.id === taskId); if (target) { + // Return only projectId and the full task object return createSuccessResponse({ projectId: proj.projectId, - initialPrompt: proj.initialPrompt, - projectPlan: proj.projectPlan, - completed: proj.completed, - task: { - id: target.id, - title: target.title, - description: target.description, - status: target.status, - approved: target.approved, - completedDetails: target.completedDetails, - }, + task: { ...target }, // Return all fields from the found task }); } } diff --git a/src/types/index.ts b/src/types/index.ts index 3d85ae5..ca39792 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -111,10 +111,7 @@ export interface ApproveProjectSuccessData { export interface OpenTaskSuccessData { projectId: string; - initialPrompt: string; - projectPlan: string; - completed: boolean; - task: Task; // Use the full Task type + task: Task; } export interface ListProjectsSuccessData { From 1ba62d8d24f4d59e170e11705f839ce6555ba17a Mon Sep 17 00:00:00 2001 From: "Christopher C. Smith" Date: Sun, 30 Mar 2025 17:28:17 -0400 Subject: [PATCH 2/3] Return full task details on read_task and get_next_task tool calls --- index.ts | 2 +- package.json | 2 +- src/client/cli.ts | 2 +- src/server/TaskManager.ts | 16 ++++++---------- src/server/toolExecutors.ts | 10 ---------- src/types/index.ts | 14 +------------- .../integration/TaskManager.integration.test.ts | 12 ++++++------ tests/integration/e2e.integration.test.ts | 13 ++++++------- tests/unit/TaskManager.test.ts | 6 +++--- tests/unit/toolExecutors.test.ts | 7 +++++-- 10 files changed, 30 insertions(+), 54 deletions(-) diff --git a/index.ts b/index.ts index 3c0a2eb..69b0f4e 100644 --- a/index.ts +++ b/index.ts @@ -10,7 +10,7 @@ import { ListToolsRequestSchema, CallToolRequestSchema } from "@modelcontextprot const server = new Server( { name: "task-manager-server", - version: "1.3.1" + version: "1.3.2" }, { capabilities: { diff --git a/package.json b/package.json index 5311e12..9d87041 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "taskqueue-mcp", - "version": "1.3.1", + "version": "1.3.2", "description": "Task Queue MCP Server", "author": "Christopher C. Smith (christopher.smith@promptlytechnologies.com)", "main": "dist/index.js", diff --git a/src/client/cli.ts b/src/client/cli.ts index 6b7a7eb..62f99bd 100644 --- a/src/client/cli.ts +++ b/src/client/cli.ts @@ -16,7 +16,7 @@ const program = new Command(); program .name("taskqueue") .description("CLI for the Task Manager MCP Server") - .version("1.3.1") + .version("1.3.2") .option( '-f, --file-path ', 'Specify the path to the tasks JSON file. Overrides TASK_MANAGER_FILE_PATH env var.' diff --git a/src/server/TaskManager.ts b/src/server/TaskManager.ts index 98a3be9..2fdd47f 100644 --- a/src/server/TaskManager.ts +++ b/src/server/TaskManager.ts @@ -280,7 +280,7 @@ export class TaskManager { } } - public async getNextTask(projectId: string): Promise { + public async getNextTask(projectId: string): Promise> { await this.ensureInitialized(); // Reload from disk to ensure we have the latest data await this.reloadFromDisk(); @@ -316,15 +316,11 @@ export class TaskManager { ); } - return { - status: "next_task", - data: { - id: nextTask.id, - title: nextTask.title, - description: nextTask.description, - message: `Next task is ready. Task approval will be required after completion.\n` - } - }; + // Return the full task details similar to openTaskDetails + return createSuccessResponse({ + projectId: proj.projectId, + task: { ...nextTask }, + }); } public async approveTaskCompletion(projectId: string, taskId: string): Promise> { diff --git a/src/server/toolExecutors.ts b/src/server/toolExecutors.ts index 5cb8c3b..707e76b 100644 --- a/src/server/toolExecutors.ts +++ b/src/server/toolExecutors.ts @@ -237,16 +237,6 @@ const getNextTaskToolExecutor: ToolExecutor = { async execute(taskManager, args) { const projectId = validateProjectId(args.projectId); const result = await taskManager.getNextTask(projectId); - - // Ensure backward compatibility with integration tests - if (result.status === "next_task" && result.data) { - return formatToolResponse({ - status: "next_task", - task: result.data, - message: result.data.message, - }); - } - return formatToolResponse(result); }, }; diff --git a/src/types/index.ts b/src/types/index.ts index ca39792..393bf0a 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -144,7 +144,7 @@ export interface ReadProjectSuccessData { initialPrompt: string; projectPlan: string; completed: boolean; - tasks: Task[]; // Use the full Task type + tasks: Task[]; } // --- End NEW Success Data Interfaces --- @@ -166,17 +166,6 @@ export interface ErrorResponse { }; } -// Next task response -export interface NextTaskResponse { - status: "next_task"; - data: { - id: string; - title: string; - description: string; - message?: string; - }; -} - // All tasks done response export interface AllTasksDoneResponse { status: "all_tasks_done"; @@ -189,5 +178,4 @@ export interface AllTasksDoneResponse { export type StandardResponse = | SuccessResponse | ErrorResponse - | NextTaskResponse | AllTasksDoneResponse; diff --git a/tests/integration/TaskManager.integration.test.ts b/tests/integration/TaskManager.integration.test.ts index bc9307b..26b7080 100644 --- a/tests/integration/TaskManager.integration.test.ts +++ b/tests/integration/TaskManager.integration.test.ts @@ -100,9 +100,9 @@ describe('TaskManager Integration', () => { // 2. Get the next task (first task) const nextTaskResult = await server.getNextTask(projectId); - expect(nextTaskResult.status).toBe('next_task'); - if (nextTaskResult.status === 'next_task' && nextTaskResult.data) { - expect(nextTaskResult.data.id).toBe(taskId1); + expect(nextTaskResult.status).toBe('success'); + if (nextTaskResult.status === 'success' && 'task' in nextTaskResult.data) { + expect(nextTaskResult.data.task.id).toBe(taskId1); } // 3. Mark the first task as in progress @@ -123,9 +123,9 @@ describe('TaskManager Integration', () => { // 6. Get the next task (second task) const nextTaskResult2 = await server.getNextTask(projectId); - expect(nextTaskResult2.status).toBe('next_task'); - if (nextTaskResult2.status === 'next_task' && nextTaskResult2.data) { - expect(nextTaskResult2.data.id).toBe(taskId2); + expect(nextTaskResult2.status).toBe('success'); + if (nextTaskResult2.status === 'success' && 'task' in nextTaskResult2.data) { + expect(nextTaskResult2.data.task.id).toBe(taskId2); } // 7. Mark the second task as in progress diff --git a/tests/integration/e2e.integration.test.ts b/tests/integration/e2e.integration.test.ts index 2563158..58cb08f 100644 --- a/tests/integration/e2e.integration.test.ts +++ b/tests/integration/e2e.integration.test.ts @@ -159,9 +159,9 @@ describe('MCP Client Integration', () => { }) as ToolResponse; expect(nextTaskResult.isError).toBeFalsy(); const nextTask = JSON.parse((nextTaskResult.content[0] as { text: string }).text); - expect(nextTask.status).toBe("next_task"); - expect(nextTask.task).toBeDefined(); - const taskId = nextTask.task.id; + expect(nextTask.status).toBe("success"); + expect(nextTask.data).toHaveProperty('task'); + const taskId = nextTask.data.task.id; console.log('Got next task with ID:', taskId); // Mark task as done @@ -202,7 +202,6 @@ describe('MCP Client Integration', () => { it('should have accurate version', async () => { console.log('Testing server version...'); const response = await client.getServerVersion(); - expect(response).toBeDefined(); expect(response).toHaveProperty('version'); // Should match package.json version const packageJson = JSON.parse( @@ -242,9 +241,9 @@ describe('MCP Client Integration', () => { }) as ToolResponse; expect(nextTaskResult.isError).toBeFalsy(); const nextTask = JSON.parse((nextTaskResult.content[0] as { text: string }).text); - expect(nextTask.status).toBe("next_task"); - expect(nextTask.task).toBeDefined(); - const taskId = nextTask.task.id; + expect(nextTask.status).toBe("success"); + expect(nextTask.data).toHaveProperty('task'); + const taskId = nextTask.data.task.id; // Mark task as done - we need to mark it as done using the update_task tool const markDoneResult = await client.callTool({ diff --git a/tests/unit/TaskManager.test.ts b/tests/unit/TaskManager.test.ts index c939bba..dc615a1 100644 --- a/tests/unit/TaskManager.test.ts +++ b/tests/unit/TaskManager.test.ts @@ -370,9 +370,9 @@ describe('TaskManager', () => { // Get the next task const nextTaskResult = await taskManager.getNextTask(projectId); - expect(nextTaskResult.status).toBe('next_task'); - if (nextTaskResult.status === 'next_task') { - expect(nextTaskResult.data.id).toBe(createResult.data.tasks[0].id); + expect(nextTaskResult.status).toBe('success'); + if (nextTaskResult.status === 'success' && 'task' in nextTaskResult.data) { + expect(nextTaskResult.data.task.id).toBe(createResult.data.tasks[0].id); } } }); diff --git a/tests/unit/toolExecutors.test.ts b/tests/unit/toolExecutors.test.ts index 6d4b764..92eec81 100644 --- a/tests/unit/toolExecutors.test.ts +++ b/tests/unit/toolExecutors.test.ts @@ -238,8 +238,11 @@ describe('Tool Executors', () => { }; taskManager.getNextTask.mockResolvedValue({ - status: 'next_task', - data: mockTask + status: 'success', + data: { + message: 'Next task retrieved successfully', + task: mockTask + } }); const result = await executor.execute(taskManager, { projectId: 'proj-1' }); From 11bff9c3ae91e33c6c58f85223c7c5c234315101 Mon Sep 17 00:00:00 2001 From: "Christopher C. Smith" Date: Sun, 30 Mar 2025 17:31:13 -0400 Subject: [PATCH 3/3] Version bump --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7fd3d77..3f7ae84 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "taskqueue-mcp", - "version": "1.3.1", + "version": "1.3.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "taskqueue-mcp", - "version": "1.3.1", + "version": "1.3.2", "license": "MIT", "dependencies": { "@ai-sdk/deepseek": "^0.2.2",