/** * F5 CLI - Requirement Consolidator * Merge requirements from multiple sources with deduplication * * @module @f5/cli/core/requirement-consolidator * @version 1.0.0 */ export interface SourcedRequirement { id: string; description: string; priority?: string; category?: string; source: { file: string; line?: number; originalId?: string; }; acceptanceCriteria?: string[]; notes?: string; hash: string; normalizedText: string; } export interface DuplicateGroup { canonical: SourcedRequirement; duplicates: SourcedRequirement[]; similarity: number; reason: string; } export interface ConflictInfo { requirementId: string; field: string; values: Array<{ value: string; source: string; }>; resolution?: string; resolvedBy?: 'first' | 'last' | 'manual' | 'merged'; } export interface SourceSummary { file: string; requirementCount: number; contributedIds: string[]; duplicatesFound: number; conflictsFound: number; } export interface ConsolidationResult { consolidated: SourcedRequirement[]; duplicates: DuplicateGroup[]; conflicts: ConflictInfo[]; sources: SourceSummary[]; summary: { totalInputRequirements: number; uniqueRequirements: number; duplicatesRemoved: number; conflictsFound: number; conflictsResolved: number; }; changelog: string[]; } export interface ConsolidationOptions { /** Similarity threshold for duplicate detection (0-1, default: 0.8) */ similarityThreshold?: number; /** How to resolve conflicts: 'first', 'last', 'manual', 'keep-both' */ conflictResolution?: 'first' | 'last' | 'manual' | 'keep-both'; /** Preserve source information in output */ preserveSources?: boolean; /** Renumber all IDs sequentially */ renumberIds?: boolean; /** Prefix for renumbered IDs */ idPrefix?: string; /** Merge acceptance criteria from duplicates */ mergeAcceptanceCriteria?: boolean; } export declare class RequirementConsolidator { private options; private changelog; constructor(options?: ConsolidationOptions); /** * Consolidate requirements from multiple files */ consolidate(files: string[]): Promise; /** * Compare two requirement files */ compare(file1: string, file2: string): Promise<{ onlyInFirst: SourcedRequirement[]; onlyInSecond: SourcedRequirement[]; modified: Array<{ id: string; changes: Array<{ field: string; from: string; to: string; }>; }>; unchanged: string[]; }>; /** * Load requirements from a single file */ private loadRequirementsFromFile; /** * Find duplicate requirements */ private findDuplicates; /** * Find conflicts (same ID, different content) */ private findConflicts; /** * Resolve conflicts based on strategy */ private resolveConflicts; /** * Renumber requirements sequentially */ private renumberRequirements; /** * Log a change */ private log; /** * Generate consolidated output as Markdown */ toMarkdown(result: ConsolidationResult): string; /** * Generate comparison report */ toComparisonReport(comparison: { onlyInFirst: SourcedRequirement[]; onlyInSecond: SourcedRequirement[]; modified: Array<{ id: string; changes: Array<{ field: string; from: string; to: string; }>; }>; unchanged: string[]; }, file1: string, file2: string): string; }