@restnfeel/agentc-starter-kit
Version:
한국어 기업용 CMS 모듈 - Task Master AI와 함께 빠르게 웹사이트를 구현할 수 있는 재사용 가능한 컴포넌트 시스템
268 lines (243 loc) • 6.18 kB
text/typescript
/**
* Configuration Control Board (CCB) Type Definitions
* Manages change requests and impact assessments for CMS configuration items
*/
export type ChangeRequestStatus =
| "submitted"
| "under_review"
| "impact_assessment"
| "approved"
| "rejected"
| "deferred"
| "escalated"
| "remanded"
| "implemented"
| "closed";
export type Priority = "low" | "medium" | "high" | "critical";
export type ImpactCategory =
| "cost"
| "schedule"
| "performance"
| "security"
| "system_interfaces"
| "other_systems";
export type ChangeType =
| "component_modification"
| "template_change"
| "configuration_update"
| "database_schema"
| "api_modification"
| "security_update"
| "performance_optimization";
export interface ChangeRequest {
id: string;
title: string;
description: string;
requesterId: string;
requesterName: string;
requestedAt: Date;
priority: Priority;
changeType: ChangeType;
status: ChangeRequestStatus;
affectedItems: ConfigurationItem[];
justification: string;
expectedBenefits: string;
risksIdentified: string;
proposedImplementationDate?: Date;
assignedReviewer?: string;
ccbMeetingDate?: Date;
decision?: CCBDecision;
comments: Comment[];
attachments: Attachment[];
createdAt: Date;
updatedAt: Date;
}
export interface ConfigurationItem {
id: string;
name: string;
type:
| "component"
| "template"
| "configuration"
| "database"
| "api"
| "asset";
currentVersion: string;
baseline: string;
lastModified: Date;
owner: string;
dependencies: string[];
criticalityLevel: "low" | "medium" | "high" | "critical";
}
export interface ImpactAssessment {
id: string;
changeRequestId: string;
assessorId: string;
assessorName: string;
assessmentDate: Date;
overallRisk: "low" | "medium" | "high" | "critical";
impacts: ImpactDetail[];
estimatedEffort: EffortEstimate;
resourceRequirements: ResourceRequirement[];
dependencies: DependencyImpact[];
testingRequirements: string;
rollbackPlan: string;
mitigationStrategies: string[];
recommendations: string;
approved: boolean;
approvedBy?: string;
approvedAt?: Date;
}
export interface ImpactDetail {
category: ImpactCategory;
description: string;
severity: "minimal" | "moderate" | "significant" | "major";
likelihood: "low" | "medium" | "high";
estimatedCost?: number;
scheduleImpact?: number; // days
mitigationRequired: boolean;
}
export interface EffortEstimate {
developmentHours: number;
testingHours: number;
deploymentHours: number;
documentationHours: number;
totalHours: number;
estimatedCost: number;
confidence: "low" | "medium" | "high";
}
export interface ResourceRequirement {
type: "developer" | "designer" | "qa" | "devops" | "product_manager";
skillLevel: "junior" | "mid" | "senior" | "lead";
hoursRequired: number;
availability: "available" | "limited" | "unavailable";
}
export interface DependencyImpact {
itemId: string;
itemName: string;
impactType:
| "breaking_change"
| "compatibility_issue"
| "enhancement"
| "no_impact";
description: string;
actionRequired: string;
}
export interface CCBDecision {
id: string;
changeRequestId: string;
decision: "approved" | "rejected" | "deferred" | "escalated" | "remanded";
decisionDate: Date;
decidedBy: string;
rationale: string;
conditions?: string[];
nextReviewDate?: Date;
escalationReason?: string;
votingMembers: CCBMember[];
votes: Vote[];
}
export interface CCBMember {
id: string;
name: string;
role:
| "chairperson"
| "technical_lead"
| "product_manager"
| "security_officer"
| "qa_lead"
| "member";
department: string;
votingPower: number; // 1-3, higher numbers for more senior roles
}
export interface Vote {
memberId: string;
memberName: string;
vote: "approve" | "reject" | "defer" | "abstain";
comments?: string;
conditions?: string[];
}
export interface Comment {
id: string;
authorId: string;
authorName: string;
content: string;
createdAt: Date;
isInternal: boolean; // true for CCB-only comments
}
export interface Attachment {
id: string;
fileName: string;
fileSize: number;
mimeType: string;
uploadedBy: string;
uploadedAt: Date;
description?: string;
url: string;
}
export interface CCBConfiguration {
quorumSize: number;
votingThreshold: number; // percentage required for approval
defaultReviewDays: number;
escalationThreshold: number; // days before auto-escalation
meetingSchedule: string; // cron expression
notificationSettings: NotificationSettings;
}
export interface NotificationSettings {
emailEnabled: boolean;
slackEnabled: boolean;
webhookUrl?: string;
notifyOnSubmission: boolean;
notifyOnDecision: boolean;
notifyOnEscalation: boolean;
reminderDaysBefore: number;
}
// Workflow state machine types
export interface CCBWorkflowState {
currentStatus: ChangeRequestStatus;
allowedTransitions: ChangeRequestStatus[];
requiredActions: string[];
autoTransitionRules?: AutoTransitionRule[];
}
export interface AutoTransitionRule {
condition: string;
targetStatus: ChangeRequestStatus;
delayDays?: number;
}
// Search and filtering types
export interface CCBSearchFilters {
status?: ChangeRequestStatus[];
priority?: Priority[];
changeType?: ChangeType[];
requesterId?: string;
assignedReviewer?: string;
dateRange?: {
start: Date;
end: Date;
};
impactLevel?: ("low" | "medium" | "high" | "critical")[];
}
export interface CCBSearchResult {
items: ChangeRequest[];
totalCount: number;
page: number;
limit: number;
hasMore: boolean;
}
// API response types
export interface CCBApiResponse<T = unknown> {
success: boolean;
data?: T;
error?: string;
message?: string;
timestamp: Date;
}
export interface CCBMetrics {
totalRequests: number;
pendingRequests: number;
approvedRequests: number;
rejectedRequests: number;
averageProcessingTime: number; // days
requestsByPriority: Record<Priority, number>;
requestsByType: Record<ChangeType, number>;
impactDistribution: Record<string, number>;
}