Jira Configuration
{
"jiraConfig": {
"projectKey": "PROJ",
"issueTypes": [
{
"name": "Epic",
"fields": ["Summary", "Description", "Priority"],
"workflow": "Epic Workflow"
},
{
"name": "Story",
"fields": [
"Summary",
"Description",
"Story Points",
"Priority",
"Sprint"
],
"workflow": "Agile Workflow"
},
{
"name": "Task",
"fields": [
"Summary",
"Description",
"Assignee",
"Due Date"
],
"workflow": "Task Workflow"
}
],
"customFields": [
{
"name": "Business Value",
"type": "number",
"required": true
},
{
"name": "Risk Level",
"type": "select",
"options": ["Low", "Medium", "High"]
}
],
"workflows": {
"agileWorkflow": {
"states": [
"To Do",
"In Progress",
"Review",
"Done"
],
"transitions": [
{
"from": "To Do",
"to": "In Progress",
"conditions": ["assigneeSet"]
}
]
}
}
}
}
Progress Tracking
// Burndown Chart Data Generation
function generateBurndownData(
totalPoints: number,
sprintDays: number,
completedPoints: number[]
): object {
const idealBurndown = [];
const actualBurndown = [];
const pointsPerDay = totalPoints / sprintDays;
for (let day = 0; day <= sprintDays; day++) {
// Ideal burndown
idealBurndown.push({
day,
points: Math.max(0, totalPoints - (day * pointsPerDay))
});
// Actual burndown
actualBurndown.push({
day,
points: day < completedPoints.length ?
totalPoints - completedPoints[day] : null
});
}
return {
ideal: idealBurndown,
actual: actualBurndown,
metrics: {
totalPoints,
completedPoints: completedPoints[completedPoints.length - 1],
remainingPoints: totalPoints -
completedPoints[completedPoints.length - 1],
projectedCompletion: calculateProjectedCompletion(
totalPoints,
completedPoints
)
}
};
}