/** * Dependency validation utilities for tasks. * * Provides functions to validate task dependencies, detect circular * dependencies, and check if dependencies form a valid DAG. * * @example * ```typescript * import { * validateDependencies, * detectCircularDependencies, * isValidDAG, * } from './dependency.js'; * * const tasks = parseTasksContent(content); * const result = validateDependencies(tasks); * * if (!result.valid) { * console.error('Dependency errors:', result.errors); * } * ``` */ import type { Task } from '../types/task.js'; import type { DependencyValidationResult, CircularDependency } from '../types/dependency.js'; /** * Item that can have dependencies (Task or TaskGroupEntry). */ export interface DependencyItem { id: string; dependencies: string[]; } /** * Detect circular dependencies using depth-first search. * * Uses a standard DFS cycle detection algorithm with three states: * - WHITE (0): Not visited * - GRAY (1): Currently in recursion stack * - BLACK (2): Fully processed * * @param items - Array of items with dependencies * @returns Array of detected cycles (empty if no cycles) * * @example * ```typescript * const tasks = [ * { id: 'T001', dependencies: ['T002'] }, * { id: 'T002', dependencies: ['T003'] }, * { id: 'T003', dependencies: ['T001'] }, // Creates cycle * ]; * * const cycles = detectCircularDependencies(tasks); * // [{ cycle: ['T001', 'T002', 'T003', 'T001'], description: '...' }] * ``` */ export declare function detectCircularDependencies(items: DependencyItem[]): CircularDependency[]; /** * Validate task dependencies. * * Checks for: * - Circular dependencies * - Missing dependencies (referencing non-existent tasks) * - Self-references * * @param items - Array of items (tasks or groups) with dependencies * @returns Validation result with errors and warnings * * @example * ```typescript * const tasks = parseTasksContent(content); * const result = validateDependencies(tasks); * * if (!result.valid) { * for (const error of result.errors) { * console.error(`${error.type}: ${error.message}`); * } * } * ``` */ export declare function validateDependencies(items: DependencyItem[]): DependencyValidationResult; /** * Validate dependencies in Task array. * * Convenience wrapper for validateDependencies that works with Tasks. * * @param tasks - Array of tasks * @returns Validation result */ export declare function validateTaskDependencies(tasks: Task[]): DependencyValidationResult; /** * Check if dependencies form a valid DAG (Directed Acyclic Graph). * * A valid DAG has no circular dependencies. * * @param items - Array of items with dependencies * @returns True if valid DAG (no cycles) * * @example * ```typescript * if (!isValidDAG(tasks)) { * throw new Error('Tasks contain circular dependencies'); * } * ``` */ export declare function isValidDAG(items: DependencyItem[]): boolean; /** * Check if Task array forms a valid DAG. * * @param tasks - Array of tasks * @returns True if valid DAG */ export declare function isValidTaskDAG(tasks: Task[]): boolean; /** * Get all direct dependencies for an item. * * @param items - Array of items * @param itemId - ID of item to get dependencies for * @returns Array of dependency IDs */ export declare function getDependencies(items: DependencyItem[], itemId: string): string[]; /** * Get all items that depend on a given item. * * @param items - Array of items * @param itemId - ID of item to find dependents for * @returns Array of dependent item IDs */ export declare function getDependents(items: DependencyItem[], itemId: string): string[]; /** * Get all transitive dependencies for an item (recursive). * * @param items - Array of items * @param itemId - ID of item to get all dependencies for * @returns Set of all dependency IDs (direct and transitive) */ export declare function getAllDependencies(items: DependencyItem[], itemId: string): Set; /** * Find root items (items with no dependencies). * * @param items - Array of items * @returns Array of root item IDs */ export declare function findRootItems(items: DependencyItem[]): string[]; /** * Find leaf items (items that no other item depends on). * * @param items - Array of items * @returns Array of leaf item IDs */ export declare function findLeafItems(items: DependencyItem[]): string[]; //# sourceMappingURL=dependency.d.ts.map