Context Manager MCP Server
by docherty
Verified
- contextmgr-mcp
- src
- api
- controllers
const Task = require('../../db/models/Task');
const planningService = require('../../services/planning');
const developmentService = require('../../services/development');
const qaService = require('../../services/qa');
// Task controller for handling task-related API requests
const taskController = {
// Create a new task
async createTask(req, res) {
try {
const workPackageId = req.params.workPackageId;
const taskData = req.body;
if (!taskData.name || !taskData.filePath) {
return res.status(400).json({
error: true,
message: 'Task name and filePath are required'
});
}
const task = await planningService.createTask(workPackageId, taskData);
return res.status(201).json({
success: true,
message: 'Task created successfully',
task
});
} catch (error) {
return res.status(500).json({
error: true,
message: 'Failed to create task',
details: error.message
});
}
},
// Get all tasks for a work package
async getTasks(req, res) {
try {
const workPackageId = req.params.workPackageId;
const tasks = await Task.findAll({
where: { workPackageId },
order: [['priority', 'ASC']]
});
return res.status(200).json({
success: true,
tasks
});
} catch (error) {
return res.status(500).json({
error: true,
message: 'Failed to fetch tasks',
details: error.message
});
}
},
// Get a specific task by ID
async getTask(req, res) {
try {
const taskId = req.params.id;
const task = await Task.findByPk(taskId);
if (!task) {
return res.status(404).json({
error: true,
message: 'Task not found'
});
}
return res.status(200).json({
success: true,
task
});
} catch (error) {
return res.status(500).json({
error: true,
message: 'Failed to fetch task',
details: error.message
});
}
},
// Update task properties
async updateTask(req, res) {
try {
const taskId = req.params.id;
const updates = req.body;
const task = await planningService.updateTask(taskId, updates);
return res.status(200).json({
success: true,
message: 'Task updated successfully',
task
});
} catch (error) {
return res.status(500).json({
error: true,
message: 'Failed to update task',
details: error.message
});
}
},
// Start working on a task
async startTask(req, res) {
try {
const taskId = req.params.id;
const result = await developmentService.startTask(taskId);
return res.status(200).json({
success: true,
message: 'Task started successfully',
task: result.task,
state: result.state
});
} catch (error) {
return res.status(500).json({
error: true,
message: 'Failed to start task',
details: error.message
});
}
},
// Complete a task (mark as ready for QA)
async completeTask(req, res) {
try {
const taskId = req.params.id;
const implementationData = req.body;
const result = await developmentService.completeTask(taskId, implementationData);
return res.status(200).json({
success: true,
message: 'Task completed and ready for QA',
task: result.task,
state: result.state
});
} catch (error) {
return res.status(500).json({
error: true,
message: 'Failed to complete task',
details: error.message
});
}
},
// Save implementation checkpoint
async saveCheckpoint(req, res) {
try {
const taskId = req.params.id;
const checkpointData = req.body;
const checkpoint = await developmentService.saveImplementationCheckpoint(taskId, checkpointData);
return res.status(200).json({
success: true,
message: 'Implementation checkpoint saved',
checkpoint
});
} catch (error) {
return res.status(500).json({
error: true,
message: 'Failed to save checkpoint',
details: error.message
});
}
},
// Resume work on a task
async resumeTask(req, res) {
try {
const taskId = req.params.id;
const context = await developmentService.resumeTask(taskId);
return res.status(200).json({
success: true,
message: 'Task context retrieved for resumption',
context
});
} catch (error) {
return res.status(500).json({
error: true,
message: 'Failed to resume task',
details: error.message
});
}
},
// Get next pending task for a project
async getNextPendingTask(req, res) {
try {
const projectId = req.params.projectId;
const result = await developmentService.getNextTask(projectId);
return res.status(200).json({
success: true,
...result
});
} catch (error) {
return res.status(500).json({
error: true,
message: 'Failed to get next pending task',
details: error.message
});
}
},
// Start QA review for a task
async startQAReview(req, res) {
try {
const taskId = req.params.id;
const context = await qaService.startTaskReview(taskId);
return res.status(200).json({
success: true,
message: 'QA review started',
context
});
} catch (error) {
return res.status(500).json({
error: true,
message: 'Failed to start QA review',
details: error.message
});
}
},
// Complete QA review for a task
async completeQAReview(req, res) {
try {
const taskId = req.params.id;
const qaResults = req.body;
if (qaResults.passed === undefined) {
return res.status(400).json({
error: true,
message: 'QA results must include passed status'
});
}
const result = await qaService.completeTaskReview(taskId, qaResults);
return res.status(200).json({
success: true,
message: qaResults.passed ? 'Task passed QA' : 'Task failed QA',
task: result.task,
state: result.state
});
} catch (error) {
return res.status(500).json({
error: true,
message: 'Failed to complete QA review',
details: error.message
});
}
},
// Create a fix task for a failed QA task
async createFixTask(req, res) {
try {
const taskId = req.params.id;
const fixDetails = req.body;
const fixTask = await qaService.createFixTask(taskId, fixDetails);
return res.status(201).json({
success: true,
message: 'Fix task created successfully',
fixTask
});
} catch (error) {
return res.status(500).json({
error: true,
message: 'Failed to create fix task',
details: error.message
});
}
},
// Get tasks ready for QA
async getTasksForQA(req, res) {
try {
const projectId = req.params.projectId;
const tasks = await qaService.getTasksReadyForQA(projectId);
return res.status(200).json({
success: true,
tasks
});
} catch (error) {
return res.status(500).json({
error: true,
message: 'Failed to get tasks ready for QA',
details: error.message
});
}
}
};
module.exports = taskController;