@boundless-oss/atlas
Version:
Atlas - MCP Server for comprehensive startup project management
467 lines (417 loc) • 11.4 kB
text/typescript
export interface Sprint {
id: string;
name: string;
goal: string;
status: 'active' | 'completed' | 'cancelled';
startDate: Date;
endDate: Date;
duration: number; // days
team: string[];
storyIds: string[];
epicIds?: string[]; // Associated epics
capacity: number; // story points
velocity: number; // actual velocity achieved
burndownData: BurndownDataPoint[];
// Cross-module references
milestoneId?: string; // Reference to roadmap milestone
releaseId?: string; // Reference to release planning
}
import {
AcceptanceCriterion,
TaskDependency,
TimeTracking,
Attachment,
Comment,
CustomField,
Subtask
} from '../shared/task-types.js';
export interface Story {
id: string;
title: string;
description: string;
status: 'backlog' | 'todo' | 'in_progress' | 'review' | 'testing' | 'done' | 'blocked' | 'cancelled';
priority: 'low' | 'medium' | 'high' | 'critical';
storyPoints: number;
acceptanceCriteria: AcceptanceCriterion[]; // Changed from string[] to structured criteria
assignee?: string;
epic?: string;
sprintId?: string;
createdAt: Date;
updatedAt: Date;
hoursSpent: number;
tags: string[];
// New enhanced features
dependencies: TaskDependency[];
timeTracking: TimeTracking;
attachments: Attachment[];
comments: Comment[];
customFields: CustomField[];
subtasks: Subtask[];
watchers: string[];
// Additional metadata
dueDate?: Date;
startDate?: Date;
completedAt?: Date;
blockedReason?: string;
groomedWithUserFeedback?: boolean; // Indicates if story has been groomed with user feedback
// Keep backward compatibility
acceptanceCriteriaLegacy?: string[]; // For migration purposes
// Cross-module references
relatedIssueIds?: string[]; // References to issue-tracking module
requirementId?: string; // Reference to product-requirements module
featureId?: string; // Reference to feature in product roadmap
bugIds?: string[]; // References to bug tracking
// Documentation references
designDocumentUrl?: string; // URL to design document
implementationDocumentUrl?: string; // URL to implementation/technical document
documentationStatus?: 'pending' | 'in-progress' | 'approved' | 'outdated'; // Documentation approval status
documentationLastReviewed?: Date; // Last time documents were reviewed
documentationReviewers?: string[]; // Who reviewed/approved the documents
}
export interface Epic {
id: string;
title: string;
description: string;
status: 'planned' | 'active' | 'completed' | 'cancelled';
priority: 'low' | 'medium' | 'high' | 'critical';
goals: string[];
owner?: string;
createdAt: Date;
updatedAt: Date;
storyIds: string[];
stories?: string[]; // Alias for compatibility
progress: number; // percentage
metadata?: {
estimatedEffort?: string;
hasDependencies?: boolean;
dependencyDetails?: string;
risks?: string;
targetUsers?: string;
businessValue?: string;
createdVia?: string;
};
// Cross-module references
roadmapItemId?: string; // Reference to product roadmap
requirementIds?: string[]; // References to product requirements
featureIds?: string[]; // References to features
}
export interface SprintPlanningSession {
id: string;
sprintId: string;
date: Date;
attendees: string[];
capacity: number;
commitments: string[]; // story IDs
notes: string;
outcome: 'ready' | 'needs_work' | 'blocked';
}
export interface SprintRetrospective {
id: string;
sprintId: string;
date: Date;
attendees: string[];
whatWentWell: string[];
whatCanImprove: string[];
actionItems: string[];
sprintRating?: number; // 1-10
}
export interface StandupReport {
id: string;
sprintId: string;
attendee: string;
date: Date;
yesterday: string[];
today: string[];
blockers: string[];
}
export interface VelocityReport {
teamName: string;
sprintsAnalyzed: number;
periodStart: Date;
periodEnd: Date;
averageVelocity: number;
highestVelocity: number;
lowestVelocity: number;
trend: 'improving' | 'declining' | 'stable';
sprintData: SprintVelocityData[];
insights: string[];
recommendations: string[];
}
export interface SprintVelocityData {
sprintName: string;
velocity: number;
completionRate: number;
startDate: Date;
endDate: Date;
}
export interface BurndownChart {
sprintId: string;
totalStoryPoints: number;
completedPoints: number;
sprintDays: number;
dailyData: BurndownDataPoint[];
onTrack: boolean;
daysRemaining: number;
trend?: string;
}
export interface BurndownDataPoint {
day: number;
idealPoints: number;
actualPoints: number;
remainingPoints: number;
completedPoints: number;
}
export interface SprintStatus {
sprint: Sprint;
stories: Story[]; // Full story objects
epics: Epic[]; // Full epic objects related to the sprint
totalStories: number;
completedStories: number;
inProgressStories: number;
remainingStories: number;
totalStoryPoints: number;
completedStoryPoints: number;
remainingStoryPoints: number;
sprintHealth: string;
blockers: string[];
currentVelocity: number;
metrics: {
velocity: number;
capacity: number;
utilization: number;
burndownData: BurndownChart;
health: 'excellent' | 'good' | 'at-risk' | 'critical';
daysElapsed: number;
daysRemaining: number;
sprintDuration: number;
};
team: {
members: string[];
availability: number;
blockers: string[];
};
}
export interface BacklogFilter {
epic?: string;
priority?: string;
assignee?: string;
status?: string;
maxStoryPoints?: number;
}
// Input option interfaces for API calls
export interface CreateSprintOptions {
name: string;
goal: string;
duration: number;
startDate?: Date;
team?: string[];
initialStoryIds?: string[];
}
export interface CreateStoryOptions {
title: string;
description: string;
storyPoints: number;
priority: 'low' | 'medium' | 'high' | 'critical';
acceptanceCriteria: string[] | AcceptanceCriterion[]; // Support both legacy and new format
epic?: string;
assignee?: string;
sprintId?: string;
tags?: string[];
dependencies?: TaskDependency[];
timeEstimate?: number;
watchers?: string[];
groomedWithUserFeedback?: boolean;
designDocumentUrl?: string;
implementationDocumentUrl?: string;
documentationStatus?: 'pending' | 'in-progress' | 'approved' | 'outdated';
}
export interface CreateEpicOptions {
title: string;
description: string;
goals: string[];
priority: 'low' | 'medium' | 'high' | 'critical';
owner?: string;
}
export interface SprintPlanningOptions {
sprintId: string;
attendees: string[];
capacity?: number;
commitments: string[];
}
export interface StandupOptions {
sprintId: string;
attendee: string;
yesterday: string[];
today: string[];
blockers: string[];
}
export interface RetrospectiveOptions {
sprintId: string;
attendees: string[];
whatWentWell: string[];
whatCanImprove: string[];
actionItems: string[];
}
export interface StoryUpdateOptions {
status?: 'backlog' | 'todo' | 'in_progress' | 'review' | 'testing' | 'done' | 'blocked' | 'cancelled';
hoursSpent?: number;
notes?: string;
title?: string;
description?: string;
priority?: 'low' | 'medium' | 'high' | 'critical';
storyPoints?: number;
assignee?: string;
tags?: string[];
acceptanceCriteria?: string[] | AcceptanceCriterion[];
dependencies?: TaskDependency[];
timeTracking?: TimeTracking;
groomedWithUserFeedback?: boolean;
epic?: string;
designDocumentUrl?: string;
implementationDocumentUrl?: string;
documentationStatus?: 'pending' | 'in-progress' | 'approved' | 'outdated';
documentationLastReviewed?: Date;
documentationReviewers?: string[];
}
export interface VelocityOptions {
teamName?: string;
lastNSprints: number;
}
export interface EpicUpdateOptions {
title?: string;
description?: string;
status?: 'planned' | 'active' | 'completed' | 'cancelled';
priority?: 'low' | 'medium' | 'high' | 'critical';
goals?: string[];
owner?: string;
metadata?: {
estimatedEffort?: string;
hasDependencies?: boolean;
dependencyDetails?: string;
risks?: string;
targetUsers?: string;
businessValue?: string;
};
}
export interface SprintUpdateOptions {
name?: string;
goal?: string;
status?: 'active' | 'completed' | 'cancelled';
endDate?: Date;
team?: string[];
capacity?: number;
}
// Team and capacity planning interfaces
export interface TeamMember {
name: string;
role: string;
capacity: number; // hours per sprint
skills: string[];
availability: number; // percentage
}
export interface SprintCapacity {
totalHours: number;
totalStoryPoints: number;
teamMembers: TeamMemberCapacity[];
workingDays: number;
}
export interface TeamMemberCapacity {
name: string;
allocatedHours: number;
allocatedStoryPoints: number;
assignments: string[]; // story IDs
}
// Agile metrics and analytics
export interface AgileMetrics {
velocity: VelocityMetrics;
quality: QualityMetrics;
predictability: PredictabilityMetrics;
team: TeamMetrics;
}
export interface VelocityMetrics {
current: number;
average: number;
trend: 'up' | 'down' | 'stable';
consistency: number; // 0-100%
}
export interface QualityMetrics {
defectRate: number;
reworkRate: number;
testCoverage?: number;
codeReviewCoverage?: number;
}
export interface PredictabilityMetrics {
commitmentAccuracy: number; // percentage
scopeCreep: number; // percentage
deliveryConsistency: number; // percentage
}
export interface TeamMetrics {
memberSatisfaction?: number;
collaborationScore?: number;
knowledgeSharing?: number;
impedimentResolution: number; // average days
}
// Story estimation and sizing
export interface EstimationSession {
id: string;
storyIds: string[];
participants: string[];
method: 'planning_poker' | 'story_points' | 't_shirt_sizes';
results: EstimationResult[];
date: Date;
}
export interface EstimationResult {
storyId: string;
estimates: Record<string, number>; // participant -> estimate
finalEstimate: number;
confidence: number; // 0-100%
notes?: string;
}
// Definition of Done and acceptance criteria
export interface DefinitionOfDone {
id: string;
title: string;
criteria: DoDCriteria[];
applicableFor: string[]; // story types, epics, etc.
createdBy: string;
createdAt: Date;
}
export interface DoDCriteria {
description: string;
required: boolean;
category: 'development' | 'testing' | 'documentation' | 'deployment';
verificationMethod?: string;
}
// Sprint goals and objectives
export interface SprintGoal {
id: string;
sprintId: string;
title: string;
description: string;
success_criteria: string[];
priority: 'primary' | 'secondary';
progress: number; // 0-100%
status: 'not_started' | 'in_progress' | 'achieved' | 'at_risk';
}
// Release planning
export interface Release {
id: string;
name: string;
version: string;
targetDate: Date;
sprintIds: string[];
epicIds: string[];
goals: string[];
status: 'in_progress' | 'released' | 'cancelled';
releaseNotes?: string;
}
export interface ReleaseStatus {
release: Release;
completedEpics: number;
totalEpics: number;
completedStoryPoints: number;
totalStoryPoints: number;
onTrack: boolean;
risks: string[];
mitigations: string[];
}