@eldrforge/kodrdriv 1.2.27 → 1.2.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AI-FRIENDLY-LOGGING-GUIDE.md +237 -0
- package/AI-LOGGING-MIGRATION-COMPLETE.md +371 -0
- package/ALREADY-PUBLISHED-PACKAGES-FIX.md +264 -0
- package/AUDIT-BRANCHES-PROGRESS-FIX.md +90 -0
- package/AUDIT-EXAMPLE-OUTPUT.md +113 -0
- package/CHECKPOINT-RECOVERY-FIX.md +450 -0
- package/LOGGING-MIGRATION-STATUS.md +186 -0
- package/PARALLEL-PUBLISH-DEBUGGING-GUIDE.md +441 -0
- package/PARALLEL-PUBLISH-FIXES-IMPLEMENTED.md +405 -0
- package/PARALLEL-PUBLISH-LOGGING-FIXES.md +274 -0
- package/PARALLEL-PUBLISH-QUICK-REFERENCE.md +375 -0
- package/PARALLEL_EXECUTION_FIX.md +2 -2
- package/PUBLISH_IMPROVEMENTS_IMPLEMENTED.md +4 -5
- package/VERSION-AUDIT-FIX.md +333 -0
- package/dist/application.js +6 -6
- package/dist/application.js.map +1 -1
- package/dist/arguments.js +43 -13
- package/dist/arguments.js.map +1 -1
- package/dist/commands/audio-commit.js +18 -18
- package/dist/commands/audio-commit.js.map +1 -1
- package/dist/commands/audio-review.js +32 -32
- package/dist/commands/audio-review.js.map +1 -1
- package/dist/commands/clean.js +9 -9
- package/dist/commands/clean.js.map +1 -1
- package/dist/commands/commit.js +20 -20
- package/dist/commands/commit.js.map +1 -1
- package/dist/commands/development.js +88 -89
- package/dist/commands/development.js.map +1 -1
- package/dist/commands/link.js +36 -36
- package/dist/commands/link.js.map +1 -1
- package/dist/commands/publish.js +318 -220
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/release.js +14 -14
- package/dist/commands/release.js.map +1 -1
- package/dist/commands/review.js +15 -17
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/select-audio.js +5 -5
- package/dist/commands/select-audio.js.map +1 -1
- package/dist/commands/tree.js +134 -39
- package/dist/commands/tree.js.map +1 -1
- package/dist/commands/unlink.js +39 -39
- package/dist/commands/unlink.js.map +1 -1
- package/dist/commands/updates.js +150 -14
- package/dist/commands/updates.js.map +1 -1
- package/dist/commands/versions.js +14 -13
- package/dist/commands/versions.js.map +1 -1
- package/dist/constants.js +1 -1
- package/dist/content/diff.js +5 -5
- package/dist/content/diff.js.map +1 -1
- package/dist/content/files.js +2 -2
- package/dist/content/files.js.map +1 -1
- package/dist/content/log.js +3 -3
- package/dist/content/log.js.map +1 -1
- package/dist/execution/CommandValidator.js +6 -6
- package/dist/execution/CommandValidator.js.map +1 -1
- package/dist/execution/DynamicTaskPool.js +129 -19
- package/dist/execution/DynamicTaskPool.js.map +1 -1
- package/dist/execution/RecoveryManager.js +99 -21
- package/dist/execution/RecoveryManager.js.map +1 -1
- package/dist/execution/TreeExecutionAdapter.js +23 -20
- package/dist/execution/TreeExecutionAdapter.js.map +1 -1
- package/dist/main.js +2 -2
- package/dist/main.js.map +1 -1
- package/dist/util/checkpointManager.js +4 -4
- package/dist/util/checkpointManager.js.map +1 -1
- package/dist/util/dependencyGraph.js +2 -2
- package/dist/util/dependencyGraph.js.map +1 -1
- package/dist/util/fileLock.js +1 -1
- package/dist/util/fileLock.js.map +1 -1
- package/dist/util/general.js +148 -15
- package/dist/util/general.js.map +1 -1
- package/dist/util/interactive.js +2 -2
- package/dist/util/interactive.js.map +1 -1
- package/dist/util/performance.js.map +1 -1
- package/dist/util/safety.js +13 -13
- package/dist/util/safety.js.map +1 -1
- package/dist/utils/branchState.js +567 -0
- package/dist/utils/branchState.js.map +1 -0
- package/package.json +4 -4
- package/scripts/update-test-log-assertions.js +73 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicTaskPool.js","sources":["../../src/execution/DynamicTaskPool.ts"],"sourcesContent":["import { EventEmitter } from 'events';\nimport { randomUUID } from 'crypto';\nimport { getLogger } from '../logging';\nimport { Config } from '../types';\nimport {\n DependencyGraph,\n findAllDependents\n} from '../util/dependencyGraph';\nimport {\n ParallelExecutionCheckpoint,\n ExecutionState,\n ExecutionResult,\n PackageResult,\n ExecutionMetrics,\n FailedPackageSnapshot\n} from '../types/parallelExecution';\nimport { CheckpointManager } from '../util/checkpointManager';\nimport { DependencyChecker } from './DependencyChecker';\nimport { ResourceMonitor } from './ResourceMonitor';\nimport { Scheduler } from './Scheduler';\n\nexport interface PoolConfig {\n graph: DependencyGraph;\n maxConcurrency: number;\n command: string;\n config: Config;\n checkpointPath?: string;\n continue?: boolean;\n maxRetries?: number;\n initialRetryDelay?: number;\n maxRetryDelay?: number;\n backoffMultiplier?: number;\n}\n\ninterface CompletedTask {\n packageName: string;\n result: PackageResult | null;\n error: Error | null;\n}\n\ninterface RunningTask {\n packageName: string;\n startTime: Date;\n promise: Promise<PackageResult>;\n controller: AbortController;\n}\n\n/**\n * DynamicTaskPool manages parallel execution of packages with dependency awareness\n */\nexport class DynamicTaskPool extends EventEmitter {\n private config: PoolConfig;\n private graph: DependencyGraph;\n private state: ExecutionState;\n private dependencyChecker: DependencyChecker;\n private resourceMonitor: ResourceMonitor;\n private scheduler: Scheduler;\n private checkpointManager: CheckpointManager;\n private logger = getLogger();\n\n // Execution tracking\n private executionId: string;\n private startTime: Date;\n private runningTasks = new Map<string, RunningTask>();\n private packageStartTimes = new Map<string, Date>();\n private packageEndTimes = new Map<string, Date>();\n private packageDurations = new Map<string, number>();\n private retryAttempts = new Map<string, number>();\n private publishedVersions: Array<{name: string, version: string, time: Date}> = [];\n\n constructor(config: PoolConfig) {\n super();\n this.config = config;\n this.graph = config.graph;\n this.executionId = randomUUID();\n this.startTime = new Date();\n\n // Initialize components\n this.dependencyChecker = new DependencyChecker(this.graph);\n this.resourceMonitor = new ResourceMonitor(config.maxConcurrency);\n this.scheduler = new Scheduler(this.graph, this.dependencyChecker);\n this.checkpointManager = new CheckpointManager(\n config.checkpointPath || process.cwd()\n );\n\n // Initialize state\n this.state = this.initializeState();\n }\n\n /**\n * Main execution entry point\n */\n async execute(): Promise<ExecutionResult> {\n this.logger.info(`Starting parallel execution with max concurrency: ${this.config.maxConcurrency}`);\n this.emit('execution:started', { totalPackages: this.graph.packages.size });\n\n try {\n // Load checkpoint if continuing\n if (this.config.continue) {\n await this.loadCheckpoint();\n }\n\n // Initialize ready queue\n this.updateReadyQueue();\n\n // Main execution loop\n while (!this.isComplete()) {\n // Schedule as many packages as we can\n const availableSlots = this.resourceMonitor.getAvailableSlots();\n if (availableSlots > 0 && this.state.ready.length > 0) {\n const toSchedule = this.scheduler.getNext(availableSlots, this.state);\n\n for (const packageName of toSchedule) {\n await this.schedulePackage(packageName);\n }\n }\n\n // Check if we're stuck\n if (this.runningTasks.size === 0) {\n if (this.state.ready.length > 0) {\n throw new Error('Deadlock detected: packages ready but cannot execute');\n }\n break; // No more work to do\n }\n\n // Wait for next package to complete\n const completedTask = await this.waitForNext();\n await this.handleTaskCompletion(completedTask);\n\n // Update ready queue\n this.updateReadyQueue();\n\n // Save checkpoint periodically\n if (this.shouldCheckpoint()) {\n await this.saveCheckpoint();\n }\n }\n\n // Final checkpoint and cleanup\n // Only cleanup if everything completed (no failures, no skipped packages due to dependencies)\n // Note: skippedNoChanges is OK - those packages successfully ran but had nothing to do\n const allCompleted = this.state.failed.length === 0 && this.state.skipped.length === 0;\n if (allCompleted) {\n await this.checkpointManager.cleanup();\n } else {\n await this.saveCheckpoint();\n }\n\n // Build and return result\n const result = this.buildExecutionResult();\n this.emit('execution:completed', { result });\n\n return result;\n } catch (error) {\n // Save checkpoint on error\n await this.saveCheckpoint();\n throw error;\n }\n }\n\n /**\n * Initialize execution state\n */\n private initializeState(): ExecutionState {\n const buildOrder = Array.from(this.graph.packages.keys());\n\n return {\n pending: [...buildOrder],\n ready: [],\n running: [],\n completed: [],\n failed: [],\n skipped: [],\n skippedNoChanges: []\n };\n }\n\n /**\n * Schedule a package for execution\n */\n private async schedulePackage(packageName: string): Promise<void> {\n // Move from ready to running\n this.state.ready = this.state.ready.filter(p => p !== packageName);\n\n // Allocate resource\n if (!this.resourceMonitor.allocate()) {\n throw new Error(`Failed to allocate resource for ${packageName}`);\n }\n\n // Record start time\n this.packageStartTimes.set(packageName, new Date());\n\n // Create abort controller\n const controller = new AbortController();\n\n // Start execution\n const promise = this.executePackage(packageName, controller.signal);\n\n // Track running task\n const task: RunningTask = {\n packageName,\n startTime: new Date(),\n promise,\n controller\n };\n\n this.runningTasks.set(packageName, task);\n\n // Update state\n this.state.running.push({\n name: packageName,\n startTime: task.startTime.toISOString(),\n elapsedTime: 0\n });\n\n // Emit event\n this.emit('package:started', { packageName });\n\n this.logger.verbose(\n `Scheduled ${packageName} (${this.runningTasks.size}/${this.config.maxConcurrency} slots used)`\n );\n }\n\n /**\n * Execute a single package (placeholder - will be overridden or use callback)\n */\n private async executePackage(\n _packageName: string,\n _signal: AbortSignal\n ): Promise<PackageResult> {\n // This is a placeholder that will be replaced with actual execution logic\n // In the real implementation, this would call the tree.ts executePackage function\n throw new Error('executePackage must be implemented');\n }\n\n /**\n * Wait for next task to complete\n */\n private async waitForNext(): Promise<CompletedTask> {\n const runningTasks = Array.from(this.runningTasks.entries());\n\n const promises = runningTasks.map(([name, task]) =>\n task.promise\n .then(result => ({ packageName: name, result, error: null }))\n .catch(error => ({ packageName: name, result: null, error }))\n );\n\n return await Promise.race(promises);\n }\n\n /**\n * Handle task completion\n */\n private async handleTaskCompletion(task: CompletedTask): Promise<void> {\n const { packageName, result, error } = task;\n\n // Remove from running\n this.runningTasks.delete(packageName);\n this.state.running = this.state.running.filter(r => r.name !== packageName);\n this.resourceMonitor.release();\n\n // Record timing\n const endTime = new Date();\n this.packageEndTimes.set(packageName, endTime);\n\n const startTime = this.packageStartTimes.get(packageName)!;\n const duration = endTime.getTime() - startTime.getTime();\n this.packageDurations.set(packageName, duration);\n\n if (error) {\n await this.handleFailure(packageName, error);\n } else {\n await this.handleSuccess(packageName, result!);\n }\n }\n\n /**\n * Handle successful package completion\n */\n private async handleSuccess(packageName: string, result: PackageResult): Promise<void> {\n // Check if this was skipped due to no changes\n if (result.skippedNoChanges) {\n this.state.skippedNoChanges.push(packageName);\n const duration = this.packageDurations.get(packageName)!;\n this.logger.info(`⊘ ${packageName} skipped - no code changes (${this.formatDuration(duration)})`);\n this.emit('package:skipped-no-changes', { packageName, result });\n } else {\n this.state.completed.push(packageName);\n const duration = this.packageDurations.get(packageName)!;\n this.logger.info(`✓ ${packageName} completed successfully (${this.formatDuration(duration)})`);\n this.emit('package:completed', { packageName, result });\n\n // Track published version if applicable\n if (result.publishedVersion) {\n this.publishedVersions.push({\n name: packageName,\n version: result.publishedVersion,\n time: new Date()\n });\n }\n }\n }\n\n /**\n * Handle package failure\n */\n private async handleFailure(packageName: string, error: Error): Promise<void> {\n const attemptNumber = (this.retryAttempts.get(packageName) || 0) + 1;\n this.retryAttempts.set(packageName, attemptNumber);\n\n const isRetriable = this.isRetriableError(error);\n const maxRetries = this.config.maxRetries || 3;\n const canRetry = isRetriable && attemptNumber < maxRetries;\n\n if (canRetry) {\n // Schedule retry\n this.logger.warn(\n `⟳ ${packageName} failed (attempt ${attemptNumber}/${maxRetries}), will retry`\n );\n\n this.state.pending.push(packageName);\n this.emit('package:retrying', { packageName, attemptNumber });\n\n // Apply backoff delay\n const delay = this.calculateRetryDelay(attemptNumber);\n await new Promise(resolve => setTimeout(resolve, delay));\n } else {\n // Permanent failure\n const dependencies = Array.from(this.graph.edges.get(packageName) || []);\n const dependents = Array.from(findAllDependents(packageName, this.graph));\n\n // Extract detailed error information\n const errorDetails = this.extractErrorDetails(error, packageName);\n\n const failureInfo: FailedPackageSnapshot = {\n name: packageName,\n error: error.message,\n stack: error.stack,\n isRetriable,\n attemptNumber,\n failedAt: new Date().toISOString(),\n dependencies,\n dependents,\n errorDetails\n };\n\n this.state.failed.push(failureInfo);\n\n this.logger.error(`✗ ${packageName} failed permanently: ${error.message}`);\n this.emit('package:failed', { packageName, error });\n\n // Cascade failure to dependents\n await this.cascadeFailure(packageName);\n }\n }\n\n /**\n * Cascade failure to dependent packages\n */\n private async cascadeFailure(failedPackage: string): Promise<void> {\n const toSkip = findAllDependents(failedPackage, this.graph);\n\n for (const dependent of toSkip) {\n // Remove from pending/ready\n this.state.pending = this.state.pending.filter(p => p !== dependent);\n this.state.ready = this.state.ready.filter(p => p !== dependent);\n\n // Add to skipped\n if (!this.state.skipped.includes(dependent)) {\n this.state.skipped.push(dependent);\n this.logger.warn(`⊘ Skipping ${dependent} (depends on failed ${failedPackage})`);\n this.emit('package:skipped', {\n packageName: dependent,\n reason: `Depends on failed ${failedPackage}`\n });\n }\n }\n }\n\n /**\n * Update ready queue\n */\n private updateReadyQueue(): void {\n const nowReady: string[] = [];\n\n for (const packageName of this.state.pending) {\n if (this.dependencyChecker.isReady(packageName, this.state)) {\n nowReady.push(packageName);\n }\n }\n\n for (const packageName of nowReady) {\n this.state.pending = this.state.pending.filter(p => p !== packageName);\n this.state.ready.push(packageName);\n }\n }\n\n /**\n * Check if execution is complete\n */\n private isComplete(): boolean {\n return (\n this.state.pending.length === 0 &&\n this.state.ready.length === 0 &&\n this.runningTasks.size === 0\n );\n }\n\n /**\n * Determine if should save checkpoint\n */\n private shouldCheckpoint(): boolean {\n // Checkpoint after each completion for now\n // Could be optimized to checkpoint less frequently\n return true;\n }\n\n /**\n * Save checkpoint\n */\n private async saveCheckpoint(): Promise<void> {\n const checkpoint: ParallelExecutionCheckpoint = {\n version: '1.0.0',\n executionId: this.executionId,\n createdAt: this.startTime.toISOString(),\n lastUpdated: new Date().toISOString(),\n command: this.config.command,\n originalConfig: this.config.config,\n dependencyGraph: {\n packages: Array.from(this.graph.packages.values()).map(pkg => ({\n name: pkg.name,\n version: pkg.version,\n path: pkg.path,\n dependencies: Array.from(pkg.dependencies)\n })),\n edges: Array.from(this.graph.edges.entries()).map(([pkg, deps]) => [\n pkg,\n Array.from(deps)\n ])\n },\n buildOrder: [\n ...this.state.pending,\n ...this.state.ready,\n ...this.state.running.map(r => r.name),\n ...this.state.completed,\n ...this.state.failed.map(f => f.name),\n ...this.state.skipped\n ],\n executionMode: 'parallel',\n maxConcurrency: this.config.maxConcurrency,\n state: this.state,\n publishedVersions: this.publishedVersions.map(pv => ({\n packageName: pv.name,\n version: pv.version,\n publishTime: pv.time.toISOString()\n })),\n retryAttempts: Object.fromEntries(this.retryAttempts),\n lastRetryTime: {},\n packageStartTimes: Object.fromEntries(\n Array.from(this.packageStartTimes.entries()).map(([k, v]) => [k, v.toISOString()])\n ),\n packageEndTimes: Object.fromEntries(\n Array.from(this.packageEndTimes.entries()).map(([k, v]) => [k, v.toISOString()])\n ),\n packageDurations: Object.fromEntries(this.packageDurations),\n totalStartTime: this.startTime.toISOString(),\n recoveryHints: [],\n canRecover: true\n };\n\n await this.checkpointManager.save(checkpoint);\n this.emit('checkpoint:saved', { timestamp: new Date() });\n }\n\n /**\n * Load checkpoint\n */\n private async loadCheckpoint(): Promise<void> {\n const checkpoint = await this.checkpointManager.load();\n\n if (!checkpoint) {\n this.logger.warn('No checkpoint found, starting fresh');\n return;\n }\n\n this.logger.info('Loading checkpoint...');\n this.logger.info(`Execution ID: ${checkpoint.executionId}`);\n this.logger.info(`Completed: ${checkpoint.state.completed.length} packages`);\n this.logger.info(`Failed: ${checkpoint.state.failed.length} packages`);\n\n // Restore state\n this.executionId = checkpoint.executionId;\n this.startTime = new Date(checkpoint.totalStartTime);\n this.state = checkpoint.state;\n\n // Restore timing data\n for (const [pkg, time] of Object.entries(checkpoint.packageStartTimes)) {\n this.packageStartTimes.set(pkg, new Date(time));\n }\n for (const [pkg, time] of Object.entries(checkpoint.packageEndTimes)) {\n this.packageEndTimes.set(pkg, new Date(time));\n }\n for (const [pkg, duration] of Object.entries(checkpoint.packageDurations)) {\n this.packageDurations.set(pkg, duration);\n }\n\n // Restore retry attempts\n for (const [pkg, attempts] of Object.entries(checkpoint.retryAttempts)) {\n this.retryAttempts.set(pkg, attempts);\n }\n\n // Clear running state (cannot resume mid-execution)\n for (const running of this.state.running) {\n this.state.pending.push(running.name);\n }\n this.state.running = [];\n }\n\n /**\n * Build execution result\n */\n private buildExecutionResult(): ExecutionResult {\n const totalDuration = Date.now() - this.startTime.getTime();\n const completedDurations = Array.from(this.packageDurations.values());\n const averageDuration = completedDurations.length > 0\n ? completedDurations.reduce((a, b) => a + b, 0) / completedDurations.length\n : 0;\n\n const metrics: ExecutionMetrics = {\n totalDuration,\n averagePackageDuration: averageDuration,\n peakConcurrency: this.resourceMonitor.getMetrics().peakConcurrency,\n averageConcurrency: this.resourceMonitor.getMetrics().averageConcurrency\n };\n\n return {\n success: this.state.failed.length === 0,\n totalPackages: this.graph.packages.size,\n completed: this.state.completed,\n failed: this.state.failed,\n skipped: this.state.skipped,\n skippedNoChanges: this.state.skippedNoChanges,\n metrics\n };\n }\n\n /**\n * Check if error is retriable\n */\n private isRetriableError(error: Error): boolean {\n const retriablePatterns = [\n /ETIMEDOUT/i,\n /ECONNRESET/i,\n /ENOTFOUND/i,\n /rate limit/i,\n /temporary failure/i,\n /try again/i,\n /gateway timeout/i,\n /service unavailable/i\n ];\n\n return retriablePatterns.some(pattern =>\n pattern.test(error.message || String(error))\n );\n }\n\n /**\n * Calculate retry delay with exponential backoff\n */\n private calculateRetryDelay(attemptNumber: number): number {\n const initialDelay = this.config.initialRetryDelay || 5000;\n const maxDelay = this.config.maxRetryDelay || 60000;\n const multiplier = this.config.backoffMultiplier || 2;\n\n const delay = Math.min(\n initialDelay * Math.pow(multiplier, attemptNumber - 1),\n maxDelay\n );\n\n // Add jitter\n const jitter = Math.random() * 0.1 * delay;\n\n return delay + jitter;\n }\n\n /**\n * Format duration in human-readable format\n */\n private formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n return `${seconds}s`;\n }\n\n /**\n * Extract detailed error information from error message and stack\n */\n private extractErrorDetails(error: Error, packageName: string): { type?: string; context?: string; logFile?: string; suggestion?: string } | undefined {\n const errorMsg = error.message || '';\n const errorStack = error.stack || '';\n const fullText = `${errorMsg}\\n${errorStack}`;\n\n // Test coverage failure\n if (fullText.match(/coverage.*below.*threshold|coverage.*insufficient/i)) {\n const coverageMatch = fullText.match(/(\\w+):\\s*(\\d+\\.?\\d*)%.*threshold:\\s*(\\d+\\.?\\d*)%/i);\n return {\n type: 'test_coverage',\n context: coverageMatch\n ? `${coverageMatch[1]}: ${coverageMatch[2]}% (threshold: ${coverageMatch[3]}%)`\n : 'Coverage below threshold',\n logFile: this.getLogFilePath(packageName),\n suggestion: `cd ${this.getPackagePath(packageName)} && npm test -- --coverage`\n };\n }\n\n // Build/compile errors\n if (fullText.match(/compilation.*failed|build.*failed|tsc.*error/i)) {\n return {\n type: 'build_error',\n context: this.extractFirstErrorLine(fullText),\n logFile: this.getLogFilePath(packageName),\n suggestion: `cd ${this.getPackagePath(packageName)} && npm run build`\n };\n }\n\n // Merge conflicts\n if (fullText.match(/merge.*conflict|conflict.*marker|<<<<<<<|>>>>>>>/i)) {\n return {\n type: 'merge_conflict',\n context: 'Unresolved merge conflicts detected',\n logFile: this.getLogFilePath(packageName),\n suggestion: `cd ${this.getPackagePath(packageName)} && git status`\n };\n }\n\n // Test failures\n if (fullText.match(/test.*failed|tests.*failed|\\d+\\s+failing/i)) {\n const failMatch = fullText.match(/(\\d+)\\s+failing/i);\n return {\n type: 'test_failure',\n context: failMatch ? `${failMatch[1]} test(s) failing` : 'Tests failed',\n logFile: this.getLogFilePath(packageName),\n suggestion: `cd ${this.getPackagePath(packageName)} && npm test`\n };\n }\n\n // Timeout errors\n if (fullText.match(/timeout|timed.*out/i)) {\n return {\n type: 'timeout',\n context: this.extractFirstErrorLine(fullText),\n logFile: this.getLogFilePath(packageName),\n suggestion: 'Consider increasing timeout or checking for stuck processes'\n };\n }\n\n // Generic error with log file\n return {\n type: 'unknown',\n context: errorMsg.split('\\n')[0].substring(0, 200),\n logFile: this.getLogFilePath(packageName)\n };\n }\n\n private extractFirstErrorLine(text: string): string {\n const lines = text.split('\\n');\n for (const line of lines) {\n if (line.match(/error|failed|exception/i) && line.trim().length > 10) {\n return line.trim().substring(0, 200);\n }\n }\n return text.split('\\n')[0].substring(0, 200);\n }\n\n private getPackagePath(packageName: string): string {\n const pkgInfo = this.graph.packages.get(packageName);\n return pkgInfo?.path || '.';\n }\n\n private getLogFilePath(packageName: string): string {\n const pkgPath = this.getPackagePath(packageName);\n const outputDir = this.config.config.outputDirectory || 'output/kodrdriv';\n // Try to find the most recent log file\n return `${pkgPath}/${outputDir}/publish_*.log`;\n }\n}\n"],"names":["DynamicTaskPool","EventEmitter","execute","logger","info","config","maxConcurrency","emit","totalPackages","graph","packages","size","continue","loadCheckpoint","updateReadyQueue","isComplete","availableSlots","resourceMonitor","getAvailableSlots","state","ready","length","toSchedule","scheduler","getNext","packageName","schedulePackage","runningTasks","Error","completedTask","waitForNext","handleTaskCompletion","shouldCheckpoint","saveCheckpoint","allCompleted","failed","skipped","checkpointManager","cleanup","result","buildExecutionResult","error","initializeState","buildOrder","Array","from","keys","pending","running","completed","skippedNoChanges","filter","p","allocate","packageStartTimes","set","Date","controller","AbortController","promise","executePackage","signal","task","startTime","push","name","toISOString","elapsedTime","verbose","_packageName","_signal","entries","promises","map","then","catch","Promise","race","delete","r","release","endTime","packageEndTimes","get","duration","getTime","packageDurations","handleFailure","handleSuccess","formatDuration","publishedVersion","publishedVersions","version","time","attemptNumber","retryAttempts","isRetriable","isRetriableError","maxRetries","canRetry","warn","delay","calculateRetryDelay","resolve","setTimeout","dependencies","edges","dependents","findAllDependents","errorDetails","extractErrorDetails","failureInfo","message","stack","failedAt","cascadeFailure","failedPackage","toSkip","dependent","includes","reason","nowReady","dependencyChecker","isReady","checkpoint","executionId","createdAt","lastUpdated","command","originalConfig","dependencyGraph","values","pkg","path","deps","f","executionMode","pv","publishTime","Object","fromEntries","lastRetryTime","k","v","totalStartTime","recoveryHints","canRecover","save","timestamp","load","attempts","totalDuration","now","completedDurations","averageDuration","reduce","a","b","metrics","averagePackageDuration","peakConcurrency","getMetrics","averageConcurrency","success","retriablePatterns","some","pattern","test","String","initialDelay","initialRetryDelay","maxDelay","maxRetryDelay","multiplier","backoffMultiplier","Math","min","pow","jitter","random","ms","seconds","floor","minutes","errorMsg","errorStack","fullText","match","coverageMatch","type","context","logFile","getLogFilePath","suggestion","getPackagePath","extractFirstErrorLine","failMatch","split","substring","text","lines","line","trim","pkgInfo","pkgPath","outputDir","outputDirectory","getLogger","Map","randomUUID","DependencyChecker","ResourceMonitor","Scheduler","CheckpointManager","checkpointPath","process","cwd"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DynamicTaskPool.js","sources":["../../src/execution/DynamicTaskPool.ts"],"sourcesContent":["import { EventEmitter } from 'events';\nimport { randomUUID } from 'crypto';\nimport { getLogger } from '../logging';\nimport { Config } from '../types';\nimport {\n DependencyGraph,\n findAllDependents\n} from '../util/dependencyGraph';\nimport {\n ParallelExecutionCheckpoint,\n ExecutionState,\n ExecutionResult,\n PackageResult,\n ExecutionMetrics,\n FailedPackageSnapshot\n} from '../types/parallelExecution';\nimport { CheckpointManager } from '../util/checkpointManager';\nimport { DependencyChecker } from './DependencyChecker';\nimport { ResourceMonitor } from './ResourceMonitor';\nimport { Scheduler } from './Scheduler';\n\nexport interface PoolConfig {\n graph: DependencyGraph;\n maxConcurrency: number;\n command: string;\n config: Config;\n checkpointPath?: string;\n continue?: boolean;\n maxRetries?: number;\n initialRetryDelay?: number;\n maxRetryDelay?: number;\n backoffMultiplier?: number;\n}\n\ninterface CompletedTask {\n packageName: string;\n result: PackageResult | null;\n error: Error | null;\n}\n\ninterface RunningTask {\n packageName: string;\n startTime: Date;\n promise: Promise<PackageResult>;\n controller: AbortController;\n}\n\n/**\n * DynamicTaskPool manages parallel execution of packages with dependency awareness\n */\nexport class DynamicTaskPool extends EventEmitter {\n private config: PoolConfig;\n private graph: DependencyGraph;\n private state: ExecutionState;\n private dependencyChecker: DependencyChecker;\n private resourceMonitor: ResourceMonitor;\n private scheduler: Scheduler;\n private checkpointManager: CheckpointManager;\n private logger = getLogger();\n\n // Execution tracking\n private executionId: string;\n private startTime: Date;\n private runningTasks = new Map<string, RunningTask>();\n private packageStartTimes = new Map<string, Date>();\n private packageEndTimes = new Map<string, Date>();\n private packageDurations = new Map<string, number>();\n private retryAttempts = new Map<string, number>();\n private publishedVersions: Array<{name: string, version: string, time: Date}> = [];\n\n constructor(config: PoolConfig) {\n super();\n this.config = config;\n this.graph = config.graph;\n this.executionId = randomUUID();\n this.startTime = new Date();\n\n // Initialize components\n this.dependencyChecker = new DependencyChecker(this.graph);\n this.resourceMonitor = new ResourceMonitor(config.maxConcurrency);\n this.scheduler = new Scheduler(this.graph, this.dependencyChecker);\n this.checkpointManager = new CheckpointManager(\n config.checkpointPath || process.cwd()\n );\n\n // Initialize state\n this.state = this.initializeState();\n }\n\n /**\n * Main execution entry point\n */\n async execute(): Promise<ExecutionResult> {\n this.logger.info(`EXECUTION_STARTING: Starting parallel execution | Max Concurrency: ${this.config.maxConcurrency} | Mode: parallel | Purpose: Execute packages with dependency awareness`);\n this.emit('execution:started', { totalPackages: this.graph.packages.size });\n\n try {\n // Load checkpoint if continuing\n if (this.config.continue) {\n await this.loadCheckpoint();\n }\n\n // Initialize ready queue\n this.updateReadyQueue();\n\n // Main execution loop\n while (!this.isComplete()) {\n // Schedule as many packages as we can\n const availableSlots = this.resourceMonitor.getAvailableSlots();\n if (availableSlots > 0 && this.state.ready.length > 0) {\n const toSchedule = this.scheduler.getNext(availableSlots, this.state);\n\n for (const packageName of toSchedule) {\n await this.schedulePackage(packageName);\n }\n }\n\n // Check if we're stuck\n if (this.runningTasks.size === 0) {\n if (this.state.ready.length > 0) {\n throw new Error('Deadlock detected: packages ready but cannot execute');\n }\n break; // No more work to do\n }\n\n // Wait for next package to complete\n const completedTask = await this.waitForNext();\n await this.handleTaskCompletion(completedTask);\n\n // Update ready queue\n this.updateReadyQueue();\n\n // Save checkpoint periodically\n if (this.shouldCheckpoint()) {\n await this.saveCheckpoint();\n }\n }\n\n // Final checkpoint and cleanup\n // Only cleanup if everything completed (no failures, no skipped packages due to dependencies)\n // Note: skippedNoChanges is OK - those packages successfully ran but had nothing to do\n const allCompleted = this.state.failed.length === 0 && this.state.skipped.length === 0;\n if (allCompleted) {\n await this.checkpointManager.cleanup();\n } else {\n await this.saveCheckpoint();\n }\n\n // Build and return result\n const result = this.buildExecutionResult();\n this.emit('execution:completed', { result });\n\n return result;\n } catch (error) {\n // Save checkpoint on error\n await this.saveCheckpoint();\n throw error;\n }\n }\n\n /**\n * Initialize execution state\n */\n private initializeState(): ExecutionState {\n const buildOrder = Array.from(this.graph.packages.keys());\n\n return {\n pending: [...buildOrder],\n ready: [],\n running: [],\n completed: [],\n failed: [],\n skipped: [],\n skippedNoChanges: []\n };\n }\n\n /**\n * Schedule a package for execution\n */\n private async schedulePackage(packageName: string): Promise<void> {\n // Move from ready to running\n this.state.ready = this.state.ready.filter(p => p !== packageName);\n\n // Allocate resource\n if (!this.resourceMonitor.allocate()) {\n throw new Error(`Failed to allocate resource for ${packageName}`);\n }\n\n // Record start time\n this.packageStartTimes.set(packageName, new Date());\n\n // Create abort controller\n const controller = new AbortController();\n\n // Start execution\n const promise = this.executePackage(packageName, controller.signal);\n\n // Track running task\n const task: RunningTask = {\n packageName,\n startTime: new Date(),\n promise,\n controller\n };\n\n this.runningTasks.set(packageName, task);\n\n // Update state\n this.state.running.push({\n name: packageName,\n startTime: task.startTime.toISOString(),\n elapsedTime: 0\n });\n\n // Emit event\n this.emit('package:started', { packageName });\n\n this.logger.verbose(\n `Scheduled ${packageName} (${this.runningTasks.size}/${this.config.maxConcurrency} slots used)`\n );\n }\n\n /**\n * Execute a single package (placeholder - will be overridden or use callback)\n */\n private async executePackage(\n _packageName: string,\n _signal: AbortSignal\n ): Promise<PackageResult> {\n // This is a placeholder that will be replaced with actual execution logic\n // In the real implementation, this would call the tree.ts executePackage function\n throw new Error('executePackage must be implemented');\n }\n\n /**\n * Wait for next task to complete\n */\n private async waitForNext(): Promise<CompletedTask> {\n const runningTasks = Array.from(this.runningTasks.entries());\n\n const promises = runningTasks.map(([name, task]) =>\n task.promise\n .then(result => ({ packageName: name, result, error: null }))\n .catch(error => ({ packageName: name, result: null, error }))\n );\n\n return await Promise.race(promises);\n }\n\n /**\n * Handle task completion\n */\n private async handleTaskCompletion(task: CompletedTask): Promise<void> {\n const { packageName, result, error } = task;\n\n // Remove from running\n this.runningTasks.delete(packageName);\n this.state.running = this.state.running.filter(r => r.name !== packageName);\n this.resourceMonitor.release();\n\n // Record timing\n const endTime = new Date();\n this.packageEndTimes.set(packageName, endTime);\n\n const startTime = this.packageStartTimes.get(packageName)!;\n const duration = endTime.getTime() - startTime.getTime();\n this.packageDurations.set(packageName, duration);\n\n if (error) {\n await this.handleFailure(packageName, error);\n } else {\n await this.handleSuccess(packageName, result!);\n }\n }\n\n /**\n * Handle successful package completion\n */\n private async handleSuccess(packageName: string, result: PackageResult): Promise<void> {\n // Check if this was skipped due to no changes\n if (result.skippedNoChanges) {\n this.state.skippedNoChanges.push(packageName);\n const duration = this.packageDurations.get(packageName)!;\n this.logger.info(`PACKAGE_SKIPPED_NO_CHANGES: Package skipped due to no code changes | Package: ${packageName} | Duration: ${this.formatDuration(duration)} | Reason: no-changes`);\n this.emit('package:skipped-no-changes', { packageName, result });\n } else {\n this.state.completed.push(packageName);\n const duration = this.packageDurations.get(packageName)!;\n this.logger.info(`PACKAGE_EXECUTION_COMPLETE: Package execution finished successfully | Package: ${packageName} | Duration: ${this.formatDuration(duration)} | Status: success`);\n this.emit('package:completed', { packageName, result });\n\n // Track published version if applicable\n if (result.publishedVersion) {\n this.publishedVersions.push({\n name: packageName,\n version: result.publishedVersion,\n time: new Date()\n });\n }\n }\n }\n\n /**\n * Handle package failure\n */\n private async handleFailure(packageName: string, error: Error): Promise<void> {\n const attemptNumber = (this.retryAttempts.get(packageName) || 0) + 1;\n this.retryAttempts.set(packageName, attemptNumber);\n\n const isRetriable = this.isRetriableError(error);\n const maxRetries = this.config.maxRetries || 3;\n const canRetry = isRetriable && attemptNumber < maxRetries;\n\n if (canRetry) {\n // Schedule retry\n this.logger.warn(\n `⟳ ${packageName} failed (attempt ${attemptNumber}/${maxRetries}), will retry`\n );\n\n this.state.pending.push(packageName);\n this.emit('package:retrying', { packageName, attemptNumber });\n\n // Apply backoff delay\n const delay = this.calculateRetryDelay(attemptNumber);\n await new Promise(resolve => setTimeout(resolve, delay));\n } else {\n // Permanent failure\n const dependencies = Array.from(this.graph.edges.get(packageName) || []);\n const dependents = Array.from(findAllDependents(packageName, this.graph));\n\n // Extract detailed error information\n const errorDetails = this.extractErrorDetails(error, packageName);\n\n const failureInfo: FailedPackageSnapshot = {\n name: packageName,\n error: error.message,\n stack: error.stack,\n isRetriable,\n attemptNumber,\n failedAt: new Date().toISOString(),\n dependencies,\n dependents,\n errorDetails\n };\n\n this.state.failed.push(failureInfo);\n\n this.logger.error(`PACKAGE_FAILED_PERMANENT: Package failed permanently | Package: ${packageName} | Error: ${error.message} | Status: failed | Retriable: false`);\n this.emit('package:failed', { packageName, error });\n\n // Cascade failure to dependents\n await this.cascadeFailure(packageName);\n }\n }\n\n /**\n * Cascade failure to dependent packages\n */\n private async cascadeFailure(failedPackage: string): Promise<void> {\n const toSkip = findAllDependents(failedPackage, this.graph);\n\n for (const dependent of toSkip) {\n // Remove from pending/ready\n this.state.pending = this.state.pending.filter(p => p !== dependent);\n this.state.ready = this.state.ready.filter(p => p !== dependent);\n\n // Add to skipped\n if (!this.state.skipped.includes(dependent)) {\n this.state.skipped.push(dependent);\n this.logger.warn(`PACKAGE_SKIPPED_DEPENDENCY: Package skipped due to failed dependency | Package: ${dependent} | Failed Dependency: ${failedPackage} | Reason: dependency-failed`);\n this.emit('package:skipped', {\n packageName: dependent,\n reason: `Depends on failed ${failedPackage}`\n });\n }\n }\n }\n\n /**\n * Update ready queue\n */\n private updateReadyQueue(): void {\n const nowReady: string[] = [];\n\n for (const packageName of this.state.pending) {\n if (this.dependencyChecker.isReady(packageName, this.state)) {\n nowReady.push(packageName);\n }\n }\n\n for (const packageName of nowReady) {\n this.state.pending = this.state.pending.filter(p => p !== packageName);\n this.state.ready.push(packageName);\n }\n }\n\n /**\n * Check if execution is complete\n */\n private isComplete(): boolean {\n return (\n this.state.pending.length === 0 &&\n this.state.ready.length === 0 &&\n this.runningTasks.size === 0\n );\n }\n\n /**\n * Determine if should save checkpoint\n */\n private shouldCheckpoint(): boolean {\n // Checkpoint after each completion for now\n // Could be optimized to checkpoint less frequently\n return true;\n }\n\n /**\n * Save checkpoint\n */\n private async saveCheckpoint(): Promise<void> {\n const checkpoint: ParallelExecutionCheckpoint = {\n version: '1.0.0',\n executionId: this.executionId,\n createdAt: this.startTime.toISOString(),\n lastUpdated: new Date().toISOString(),\n command: this.config.command,\n originalConfig: this.config.config,\n dependencyGraph: {\n packages: Array.from(this.graph.packages.values()).map(pkg => ({\n name: pkg.name,\n version: pkg.version,\n path: pkg.path,\n dependencies: Array.from(pkg.dependencies)\n })),\n edges: Array.from(this.graph.edges.entries()).map(([pkg, deps]) => [\n pkg,\n Array.from(deps)\n ])\n },\n buildOrder: [\n ...this.state.pending,\n ...this.state.ready,\n ...this.state.running.map(r => r.name),\n ...this.state.completed,\n ...this.state.failed.map(f => f.name),\n ...this.state.skipped\n ],\n executionMode: 'parallel',\n maxConcurrency: this.config.maxConcurrency,\n state: this.state,\n publishedVersions: this.publishedVersions.map(pv => ({\n packageName: pv.name,\n version: pv.version,\n publishTime: pv.time.toISOString()\n })),\n retryAttempts: Object.fromEntries(this.retryAttempts),\n lastRetryTime: {},\n packageStartTimes: Object.fromEntries(\n Array.from(this.packageStartTimes.entries()).map(([k, v]) => [k, v.toISOString()])\n ),\n packageEndTimes: Object.fromEntries(\n Array.from(this.packageEndTimes.entries()).map(([k, v]) => [k, v.toISOString()])\n ),\n packageDurations: Object.fromEntries(this.packageDurations),\n totalStartTime: this.startTime.toISOString(),\n recoveryHints: [],\n canRecover: true\n };\n\n await this.checkpointManager.save(checkpoint);\n this.emit('checkpoint:saved', { timestamp: new Date() });\n }\n\n /**\n * Load checkpoint\n */\n private async loadCheckpoint(): Promise<void> {\n const checkpoint = await this.checkpointManager.load();\n\n if (!checkpoint) {\n this.logger.warn('CHECKPOINT_NOT_FOUND: No checkpoint file found | Action: Starting fresh execution | Path: ' + this.config.checkpointPath);\n return;\n }\n\n this.logger.info('CHECKPOINT_LOADING: Loading execution checkpoint | Purpose: Resume previous execution | Path: ' + this.config.checkpointPath);\n this.logger.info(`CHECKPOINT_EXECUTION_ID: Checkpoint execution identifier | ID: ${checkpoint.executionId}`);\n this.logger.info(`CHECKPOINT_STATE_COMPLETED: Completed packages from checkpoint | Count: ${checkpoint.state.completed.length} packages`);\n this.logger.info(`CHECKPOINT_STATE_FAILED: Failed packages from checkpoint | Count: ${checkpoint.state.failed.length} packages`);\n\n // Restore state\n this.executionId = checkpoint.executionId;\n this.startTime = new Date(checkpoint.totalStartTime);\n this.state = checkpoint.state;\n\n // Restore timing data\n for (const [pkg, time] of Object.entries(checkpoint.packageStartTimes)) {\n this.packageStartTimes.set(pkg, new Date(time));\n }\n for (const [pkg, time] of Object.entries(checkpoint.packageEndTimes)) {\n this.packageEndTimes.set(pkg, new Date(time));\n }\n for (const [pkg, duration] of Object.entries(checkpoint.packageDurations)) {\n this.packageDurations.set(pkg, duration);\n }\n\n // Restore retry attempts\n for (const [pkg, attempts] of Object.entries(checkpoint.retryAttempts)) {\n this.retryAttempts.set(pkg, attempts);\n }\n\n // Clear running state (cannot resume mid-execution)\n for (const running of this.state.running) {\n this.state.pending.push(running.name);\n }\n this.state.running = [];\n\n // CRITICAL FIX: Re-evaluate skipped packages\n // After loading checkpoint (especially with --mark-completed), packages that were\n // skipped due to failed dependencies might now be eligible to run if those\n // dependencies are now completed. Move them back to pending for reassessment.\n const unblocked: string[] = [];\n for (const packageName of this.state.skipped) {\n // Check if all dependencies are now completed\n const dependencies = this.graph.edges.get(packageName) || new Set();\n const allDepsCompleted = Array.from(dependencies).every(dep =>\n this.state.completed.includes(dep) || this.state.skippedNoChanges.includes(dep)\n );\n\n // Check if any dependencies are still failed\n const anyDepsFailed = Array.from(dependencies).some(dep =>\n this.state.failed.some(f => f.name === dep)\n );\n\n if (allDepsCompleted && !anyDepsFailed) {\n unblocked.push(packageName);\n }\n }\n\n // Move unblocked packages back to pending\n if (unblocked.length > 0) {\n this.logger.info(`PACKAGES_UNBLOCKED: Dependencies satisfied, packages now ready | Count: ${unblocked.length} | Packages: ${unblocked.join(', ')} | Status: ready-to-execute`);\n for (const packageName of unblocked) {\n this.state.skipped = this.state.skipped.filter(p => p !== packageName);\n this.state.pending.push(packageName);\n }\n }\n }\n\n /**\n * Build execution result\n */\n private buildExecutionResult(): ExecutionResult {\n const totalDuration = Date.now() - this.startTime.getTime();\n const completedDurations = Array.from(this.packageDurations.values());\n const averageDuration = completedDurations.length > 0\n ? completedDurations.reduce((a, b) => a + b, 0) / completedDurations.length\n : 0;\n\n const metrics: ExecutionMetrics = {\n totalDuration,\n averagePackageDuration: averageDuration,\n peakConcurrency: this.resourceMonitor.getMetrics().peakConcurrency,\n averageConcurrency: this.resourceMonitor.getMetrics().averageConcurrency\n };\n\n return {\n success: this.state.failed.length === 0,\n totalPackages: this.graph.packages.size,\n completed: this.state.completed,\n failed: this.state.failed,\n skipped: this.state.skipped,\n skippedNoChanges: this.state.skippedNoChanges,\n metrics\n };\n }\n\n /**\n * Check if error is retriable\n */\n private isRetriableError(error: Error): boolean {\n const errorText = error.message || String(error);\n const stackText = error.stack || '';\n const fullText = `${errorText}\\n${stackText}`;\n\n const retriablePatterns = [\n // Network errors\n /ETIMEDOUT/i,\n /ECONNRESET/i,\n /ENOTFOUND/i,\n /ECONNREFUSED/i,\n /rate limit/i,\n /temporary failure/i,\n /try again/i,\n /gateway timeout/i,\n /service unavailable/i,\n\n // Git lock file errors (common in parallel execution)\n /index\\.lock/i,\n /\\.git\\/index\\.lock/i,\n /unable to create.*lock/i,\n /lock file.*exists/i,\n\n // npm install race conditions\n /ENOENT.*npm-cache/i,\n /EBUSY.*npm/i,\n /npm.*EEXIST/i,\n\n // GitHub API temporary errors\n /abuse detection/i,\n /secondary rate limit/i,\n /GitHub API.*unavailable/i,\n\n // Timeout errors (might be transient)\n /timeout waiting for/i,\n /timed out after/i\n ];\n\n const isRetriable = retriablePatterns.some(pattern =>\n pattern.test(fullText)\n );\n\n // Non-retriable errors that should fail immediately\n const nonRetriablePatterns = [\n /test.*failed/i,\n /coverage.*below.*threshold/i,\n /compilation.*failed/i,\n /build.*failed/i,\n /merge.*conflict/i,\n /uncommitted changes/i,\n /working.*dirty/i,\n /authentication.*failed/i,\n /permission denied/i\n ];\n\n const isNonRetriable = nonRetriablePatterns.some(pattern =>\n pattern.test(fullText)\n );\n\n // If explicitly non-retriable, don't retry\n if (isNonRetriable) {\n return false;\n }\n\n return isRetriable;\n }\n\n /**\n * Calculate retry delay with exponential backoff\n */\n private calculateRetryDelay(attemptNumber: number): number {\n const initialDelay = this.config.initialRetryDelay || 5000;\n const maxDelay = this.config.maxRetryDelay || 60000;\n const multiplier = this.config.backoffMultiplier || 2;\n\n const delay = Math.min(\n initialDelay * Math.pow(multiplier, attemptNumber - 1),\n maxDelay\n );\n\n // Add jitter\n const jitter = Math.random() * 0.1 * delay;\n\n return delay + jitter;\n }\n\n /**\n * Format duration in human-readable format\n */\n private formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n return `${seconds}s`;\n }\n\n /**\n * Extract detailed error information from error message and stack\n */\n private extractErrorDetails(error: Error, packageName: string): { type?: string; context?: string; logFile?: string; suggestion?: string } | undefined {\n const errorMsg = error.message || '';\n const errorStack = error.stack || '';\n const fullText = `${errorMsg}\\n${errorStack}`;\n\n // Get log file path from error if attached, otherwise use default\n const logFile = (error as any).logFilePath || this.getLogFilePath(packageName);\n\n // Test coverage failure\n if (fullText.match(/coverage.*below.*threshold|coverage.*insufficient/i)) {\n const coverageMatch = fullText.match(/(\\w+):\\s*(\\d+\\.?\\d*)%.*threshold:\\s*(\\d+\\.?\\d*)%/i);\n return {\n type: 'test_coverage',\n context: coverageMatch\n ? `${coverageMatch[1]}: ${coverageMatch[2]}% (threshold: ${coverageMatch[3]}%)`\n : 'Coverage below threshold',\n logFile,\n suggestion: `cd ${this.getPackagePath(packageName)} && npm test -- --coverage`\n };\n }\n\n // Build/compile errors\n if (fullText.match(/compilation.*failed|build.*failed|tsc.*error/i)) {\n return {\n type: 'build_error',\n context: this.extractFirstErrorLine(fullText),\n logFile,\n suggestion: `cd ${this.getPackagePath(packageName)} && npm run build`\n };\n }\n\n // Merge conflicts\n if (fullText.match(/merge.*conflict|conflict.*marker|<<<<<<<|>>>>>>>/i)) {\n return {\n type: 'merge_conflict',\n context: 'Unresolved merge conflicts detected',\n logFile,\n suggestion: `cd ${this.getPackagePath(packageName)} && git status`\n };\n }\n\n // Test failures\n if (fullText.match(/test.*failed|tests.*failed|\\d+\\s+failing/i)) {\n const failMatch = fullText.match(/(\\d+)\\s+failing/i);\n return {\n type: 'test_failure',\n context: failMatch ? `${failMatch[1]} test(s) failing` : 'Tests failed',\n logFile,\n suggestion: `cd ${this.getPackagePath(packageName)} && npm test`\n };\n }\n\n // Timeout errors\n if (fullText.match(/timeout|timed.*out/i)) {\n return {\n type: 'timeout',\n context: this.extractFirstErrorLine(fullText),\n logFile,\n suggestion: 'Consider increasing timeout or checking for stuck processes'\n };\n }\n\n // PR/Git errors\n if (fullText.match(/pull request|pr|github/i) && fullText.match(/not mergeable|conflict/i)) {\n return {\n type: 'pr_conflict',\n context: 'Pull request has merge conflicts',\n logFile,\n suggestion: 'Resolve conflicts in the PR and re-run with --continue'\n };\n }\n\n // Git state errors\n if (fullText.match(/uncommitted changes|working.*dirty|not.*clean/i)) {\n return {\n type: 'git_state',\n context: 'Working directory has uncommitted changes',\n logFile,\n suggestion: `cd ${this.getPackagePath(packageName)} && git status`\n };\n }\n\n // npm install / dependency errors\n if (fullText.match(/npm.*install|ERESOLVE|Cannot find module/i)) {\n return {\n type: 'dependency_error',\n context: this.extractFirstErrorLine(fullText),\n logFile,\n suggestion: `cd ${this.getPackagePath(packageName)} && rm -rf node_modules package-lock.json && npm install`\n };\n }\n\n // Git lock file errors\n if (fullText.match(/index\\.lock|\\.git\\/index\\.lock|unable to create.*lock/i)) {\n return {\n type: 'git_lock',\n context: 'Git lock file conflict - another git process running',\n logFile,\n suggestion: `cd ${this.getPackagePath(packageName)} && rm -f .git/index.lock`\n };\n }\n\n // No changes detected (not really an error, but handle it)\n if (fullText.match(/no.*changes|already.*published|nothing.*to.*publish/i)) {\n return {\n type: 'no_changes',\n context: 'No changes detected - package already published',\n logFile,\n suggestion: 'This is expected if package was previously published'\n };\n }\n\n // Generic error with log file\n return {\n type: 'unknown',\n context: errorMsg.split('\\n')[0].substring(0, 200),\n logFile\n };\n }\n\n private extractFirstErrorLine(text: string): string {\n const lines = text.split('\\n');\n for (const line of lines) {\n if (line.match(/error|failed|exception/i) && line.trim().length > 10) {\n return line.trim().substring(0, 200);\n }\n }\n return text.split('\\n')[0].substring(0, 200);\n }\n\n private getPackagePath(packageName: string): string {\n const pkgInfo = this.graph.packages.get(packageName);\n return pkgInfo?.path || '.';\n }\n\n private getLogFilePath(packageName: string): string {\n const pkgPath = this.getPackagePath(packageName);\n const outputDir = this.config.config.outputDirectory || 'output/kodrdriv';\n // Return wildcard pattern as fallback (log file should be attached to error directly)\n // This is used as a fallback when log file path isn't attached to the error\n return `${pkgPath}/${outputDir}/publish_*.log`;\n }\n}\n"],"names":["DynamicTaskPool","EventEmitter","execute","logger","info","config","maxConcurrency","emit","totalPackages","graph","packages","size","continue","loadCheckpoint","updateReadyQueue","isComplete","availableSlots","resourceMonitor","getAvailableSlots","state","ready","length","toSchedule","scheduler","getNext","packageName","schedulePackage","runningTasks","Error","completedTask","waitForNext","handleTaskCompletion","shouldCheckpoint","saveCheckpoint","allCompleted","failed","skipped","checkpointManager","cleanup","result","buildExecutionResult","error","initializeState","buildOrder","Array","from","keys","pending","running","completed","skippedNoChanges","filter","p","allocate","packageStartTimes","set","Date","controller","AbortController","promise","executePackage","signal","task","startTime","push","name","toISOString","elapsedTime","verbose","_packageName","_signal","entries","promises","map","then","catch","Promise","race","delete","r","release","endTime","packageEndTimes","get","duration","getTime","packageDurations","handleFailure","handleSuccess","formatDuration","publishedVersion","publishedVersions","version","time","attemptNumber","retryAttempts","isRetriable","isRetriableError","maxRetries","canRetry","warn","delay","calculateRetryDelay","resolve","setTimeout","dependencies","edges","dependents","findAllDependents","errorDetails","extractErrorDetails","failureInfo","message","stack","failedAt","cascadeFailure","failedPackage","toSkip","dependent","includes","reason","nowReady","dependencyChecker","isReady","checkpoint","executionId","createdAt","lastUpdated","command","originalConfig","dependencyGraph","values","pkg","path","deps","f","executionMode","pv","publishTime","Object","fromEntries","lastRetryTime","k","v","totalStartTime","recoveryHints","canRecover","save","timestamp","load","checkpointPath","attempts","unblocked","Set","allDepsCompleted","every","dep","anyDepsFailed","some","join","totalDuration","now","completedDurations","averageDuration","reduce","a","b","metrics","averagePackageDuration","peakConcurrency","getMetrics","averageConcurrency","success","errorText","String","stackText","fullText","retriablePatterns","pattern","test","nonRetriablePatterns","isNonRetriable","initialDelay","initialRetryDelay","maxDelay","maxRetryDelay","multiplier","backoffMultiplier","Math","min","pow","jitter","random","ms","seconds","floor","minutes","errorMsg","errorStack","logFile","logFilePath","getLogFilePath","match","coverageMatch","type","context","suggestion","getPackagePath","extractFirstErrorLine","failMatch","split","substring","text","lines","line","trim","pkgInfo","pkgPath","outputDir","outputDirectory","getLogger","Map","randomUUID","DependencyChecker","ResourceMonitor","Scheduler","CheckpointManager","process","cwd"],"mappings":"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"}
|
|
@@ -39,7 +39,7 @@ function _define_property(obj, key, value) {
|
|
|
39
39
|
* Mark packages as completed
|
|
40
40
|
* Accepts either package names (e.g., "@eldrforge/git-tools") or directory names (e.g., "git-tools")
|
|
41
41
|
*/ async markCompleted(packages) {
|
|
42
|
-
this.logger.info(`Marking ${packages.length}
|
|
42
|
+
this.logger.info(`RECOVERY_MARKING_COMPLETED: Marking packages as completed | Package Count: ${packages.length} | Action: Update checkpoint state | Purpose: Manual recovery`);
|
|
43
43
|
for (const pkgIdentifier of packages){
|
|
44
44
|
// Resolve identifier to package name
|
|
45
45
|
const pkg = this.resolvePackageName(pkgIdentifier);
|
|
@@ -50,25 +50,41 @@ function _define_property(obj, key, value) {
|
|
|
50
50
|
}
|
|
51
51
|
// Validate not already completed
|
|
52
52
|
if (this.checkpoint.state.completed.includes(pkg)) {
|
|
53
|
-
this.logger.warn(`Package ${pkg} already
|
|
53
|
+
this.logger.warn(`RECOVERY_ALREADY_COMPLETED: Package already marked as completed | Package: ${pkg} | Action: Skipping | Status: already-completed`);
|
|
54
54
|
continue;
|
|
55
55
|
}
|
|
56
56
|
// Remove from other states
|
|
57
57
|
this.removeFromAllStates(pkg);
|
|
58
58
|
// Add to completed
|
|
59
59
|
this.checkpoint.state.completed.push(pkg);
|
|
60
|
-
this.logger.info(
|
|
60
|
+
this.logger.info(`RECOVERY_PACKAGE_COMPLETED: Package marked as completed | Package: ${pkg} | Status: completed | Checkpoint: Updated`);
|
|
61
61
|
}
|
|
62
|
-
// Update ready queue
|
|
62
|
+
// Update ready queue and count what got unblocked
|
|
63
|
+
const beforeSkipped = this.checkpoint.state.skipped.length;
|
|
64
|
+
const beforeReady = this.checkpoint.state.ready.length;
|
|
63
65
|
this.updateReadyState();
|
|
66
|
+
const afterSkipped = this.checkpoint.state.skipped.length;
|
|
67
|
+
const afterReady = this.checkpoint.state.ready.length;
|
|
68
|
+
const unblockedCount = beforeSkipped - afterSkipped;
|
|
69
|
+
const newReadyCount = afterReady - beforeReady;
|
|
64
70
|
// Save checkpoint
|
|
65
71
|
await this.saveCheckpoint();
|
|
66
72
|
this.logger.info('State updated successfully');
|
|
73
|
+
if (unblockedCount > 0) {
|
|
74
|
+
this.logger.info(`✓ Unblocked ${unblockedCount} package(s)`);
|
|
75
|
+
}
|
|
76
|
+
if (newReadyCount > 0) {
|
|
77
|
+
this.logger.info(`✓ ${newReadyCount} package(s) ready to execute`);
|
|
78
|
+
}
|
|
79
|
+
if (unblockedCount === 0 && newReadyCount === 0 && this.checkpoint.state.skipped.length > 0) {
|
|
80
|
+
this.logger.warn(`⚠️ No packages unblocked. ${this.checkpoint.state.skipped.length} packages still blocked by dependencies.`);
|
|
81
|
+
this.logger.warn(' Use --status to see what\'s blocking them.');
|
|
82
|
+
}
|
|
67
83
|
}
|
|
68
84
|
/**
|
|
69
85
|
* Mark packages as failed
|
|
70
86
|
*/ async markFailed(packages, reason = 'Manually marked as failed') {
|
|
71
|
-
this.logger.info(`Marking ${packages.length}
|
|
87
|
+
this.logger.info(`RECOVERY_MARKING_FAILED: Marking packages as failed | Package Count: ${packages.length} | Action: Update checkpoint state | Purpose: Skip dependent packages`);
|
|
72
88
|
for (const pkg of packages){
|
|
73
89
|
// Validate package exists
|
|
74
90
|
if (!this.graph.packages.has(pkg)) {
|
|
@@ -87,13 +103,13 @@ function _define_property(obj, key, value) {
|
|
|
87
103
|
dependents: Array.from(findAllDependents(pkg, this.graph))
|
|
88
104
|
};
|
|
89
105
|
this.checkpoint.state.failed.push(failureInfo);
|
|
90
|
-
this.logger.info(
|
|
106
|
+
this.logger.info(`RECOVERY_PACKAGE_FAILED: Package marked as failed | Package: ${pkg} | Status: failed | Checkpoint: Updated`);
|
|
91
107
|
// Cascade to dependents
|
|
92
108
|
const dependents = findAllDependents(pkg, this.graph);
|
|
93
109
|
for (const dep of dependents){
|
|
94
110
|
this.removeFromAllStates(dep);
|
|
95
111
|
this.checkpoint.state.skipped.push(dep);
|
|
96
|
-
this.logger.warn(
|
|
112
|
+
this.logger.warn(`RECOVERY_DEPENDENT_SKIPPED: Dependent package skipped | Package: ${dep} | Failed Dependency: ${pkg} | Reason: dependency-failed`);
|
|
97
113
|
}
|
|
98
114
|
}
|
|
99
115
|
await this.saveCheckpoint();
|
|
@@ -116,7 +132,7 @@ function _define_property(obj, key, value) {
|
|
|
116
132
|
if (!this.checkpoint.state.skipped.includes(pkg)) {
|
|
117
133
|
this.checkpoint.state.skipped.push(pkg);
|
|
118
134
|
}
|
|
119
|
-
this.logger.info(
|
|
135
|
+
this.logger.info(`RECOVERY_PACKAGE_SKIPPED: Package marked as skipped | Package: ${pkg} | Status: skipped | Checkpoint: Updated`);
|
|
120
136
|
}
|
|
121
137
|
await this.saveCheckpoint();
|
|
122
138
|
}
|
|
@@ -125,10 +141,10 @@ function _define_property(obj, key, value) {
|
|
|
125
141
|
*/ async retryFailed(options) {
|
|
126
142
|
const failed = this.checkpoint.state.failed;
|
|
127
143
|
if (failed.length === 0) {
|
|
128
|
-
this.logger.info('No failed packages to retry');
|
|
144
|
+
this.logger.info('RECOVERY_NO_FAILED: No failed packages found | Action: Nothing to retry | Status: All packages succeeded or skipped');
|
|
129
145
|
return;
|
|
130
146
|
}
|
|
131
|
-
this.logger.info(`
|
|
147
|
+
this.logger.info(`RECOVERY_RETRY_STARTING: Initiating retry for failed packages | Failed Count: ${failed.length} | Action: Reset to pending and retry`);
|
|
132
148
|
const retriable = [];
|
|
133
149
|
const nonRetriable = [];
|
|
134
150
|
for (const failedPkg of failed){
|
|
@@ -157,36 +173,36 @@ function _define_property(obj, key, value) {
|
|
|
157
173
|
if (this.checkpoint.state.skipped.includes(dependent)) {
|
|
158
174
|
this.checkpoint.state.skipped = this.checkpoint.state.skipped.filter((p)=>p !== dependent);
|
|
159
175
|
this.checkpoint.state.pending.push(dependent);
|
|
160
|
-
this.logger.info(
|
|
176
|
+
this.logger.info(`RECOVERY_DEPENDENT_RESTORED: Dependent package moved back to pending | Package: ${dependent} | Previous Status: skipped | New Status: pending | Reason: Retry parent package`);
|
|
161
177
|
}
|
|
162
178
|
}
|
|
163
|
-
this.logger.info(
|
|
179
|
+
this.logger.info(`RECOVERY_PACKAGE_PENDING: Package moved to pending for retry | Package: ${failedPkg.name} | Previous Status: failed | New Status: pending | Action: Will retry`);
|
|
164
180
|
}
|
|
165
181
|
// Keep only non-retriable failures in failed state
|
|
166
182
|
this.checkpoint.state.failed = nonRetriable;
|
|
167
183
|
// Update ready queue
|
|
168
184
|
this.updateReadyState();
|
|
169
185
|
await this.saveCheckpoint();
|
|
170
|
-
this.logger.info(
|
|
186
|
+
this.logger.info(`RECOVERY_RETRY_READY: Packages reset and ready for retry | Package Count: ${retriable.length} | Status: pending | Next: Will execute`);
|
|
171
187
|
}
|
|
172
188
|
/**
|
|
173
189
|
* Skip failed packages and continue with remaining
|
|
174
190
|
*/ async skipFailed() {
|
|
175
191
|
const failed = this.checkpoint.state.failed.map((f)=>f.name);
|
|
176
192
|
if (failed.length === 0) {
|
|
177
|
-
this.logger.info('No failed packages to skip');
|
|
193
|
+
this.logger.info('RECOVERY_NO_FAILED_TO_SKIP: No failed packages found | Action: Nothing to skip | Status: Clean state');
|
|
178
194
|
return;
|
|
179
195
|
}
|
|
180
|
-
this.logger.info(`Skipping ${failed.length}
|
|
196
|
+
this.logger.info(`RECOVERY_SKIP_FAILED: Skipping failed packages and dependents | Failed Count: ${failed.length} | Action: Mark as skipped | Purpose: Continue with remaining packages`);
|
|
181
197
|
await this.skipPackages(failed);
|
|
182
198
|
// Clear failed state
|
|
183
199
|
this.checkpoint.state.failed = [];
|
|
184
|
-
this.logger.info('Failed packages skipped
|
|
200
|
+
this.logger.info('RECOVERY_SKIP_COMPLETE: Failed packages skipped successfully | Status: Execution can continue | Next: Process remaining packages');
|
|
185
201
|
}
|
|
186
202
|
/**
|
|
187
203
|
* Reset specific package to initial state
|
|
188
204
|
*/ async resetPackage(packageName) {
|
|
189
|
-
this.logger.info(`Resetting package: ${packageName}`);
|
|
205
|
+
this.logger.info(`RECOVERY_PACKAGE_RESETTING: Resetting package to initial state | Package: ${packageName} | Action: Clear all state | Purpose: Fresh start`);
|
|
190
206
|
if (!this.graph.packages.has(packageName)) {
|
|
191
207
|
throw new Error(`Package not found: ${packageName}`);
|
|
192
208
|
}
|
|
@@ -200,7 +216,7 @@ function _define_property(obj, key, value) {
|
|
|
200
216
|
delete this.checkpoint.packageEndTimes[packageName];
|
|
201
217
|
delete this.checkpoint.packageDurations[packageName];
|
|
202
218
|
await this.saveCheckpoint();
|
|
203
|
-
this.logger.info(
|
|
219
|
+
this.logger.info(`RECOVERY_PACKAGE_RESET: Package reset to initial state | Package: ${packageName} | Status: pending | Checkpoint: Updated`);
|
|
204
220
|
}
|
|
205
221
|
/**
|
|
206
222
|
* Validate checkpoint state integrity
|
|
@@ -361,6 +377,49 @@ function _define_property(obj, key, value) {
|
|
|
361
377
|
}
|
|
362
378
|
lines.push('');
|
|
363
379
|
}
|
|
380
|
+
// Skipped packages with dependency details
|
|
381
|
+
if (skipped > 0) {
|
|
382
|
+
lines.push('🔒 Blocked Packages (dependency issues):');
|
|
383
|
+
for (const pkgName of this.checkpoint.state.skipped){
|
|
384
|
+
const deps = this.graph.edges.get(pkgName) || new Set();
|
|
385
|
+
const depStatus = Array.from(deps).map((dep)=>{
|
|
386
|
+
if (this.checkpoint.state.completed.includes(dep) || this.checkpoint.state.skippedNoChanges.includes(dep)) {
|
|
387
|
+
return `${dep} ✓`;
|
|
388
|
+
} else if (this.checkpoint.state.failed.some((f)=>f.name === dep)) {
|
|
389
|
+
return `${dep} ❌`;
|
|
390
|
+
} else if (this.checkpoint.state.running.some((r)=>r.name === dep)) {
|
|
391
|
+
return `${dep} ⏳`;
|
|
392
|
+
} else if (this.checkpoint.state.skipped.includes(dep)) {
|
|
393
|
+
return `${dep} 🔒`;
|
|
394
|
+
} else if (this.checkpoint.state.pending.includes(dep) || this.checkpoint.state.ready.includes(dep)) {
|
|
395
|
+
return `${dep} ⏳`;
|
|
396
|
+
} else {
|
|
397
|
+
return `${dep} ❓`;
|
|
398
|
+
}
|
|
399
|
+
});
|
|
400
|
+
lines.push(` • ${pkgName}`);
|
|
401
|
+
if (depStatus.length > 0) {
|
|
402
|
+
lines.push(` Dependencies: ${depStatus.join(', ')}`);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
lines.push('');
|
|
406
|
+
lines.push('Legend: ✓ = complete, ❌ = failed, ⏳ = pending/running, 🔒 = blocked');
|
|
407
|
+
lines.push('');
|
|
408
|
+
}
|
|
409
|
+
// Ready to execute
|
|
410
|
+
if (this.checkpoint.state.ready.length > 0) {
|
|
411
|
+
lines.push('⏳ Ready to Execute:');
|
|
412
|
+
for (const pkgName of this.checkpoint.state.ready){
|
|
413
|
+
const deps = this.graph.edges.get(pkgName) || new Set();
|
|
414
|
+
if (deps.size === 0) {
|
|
415
|
+
lines.push(` • ${pkgName} (no dependencies)`);
|
|
416
|
+
} else {
|
|
417
|
+
const depList = Array.from(deps).join(', ');
|
|
418
|
+
lines.push(` • ${pkgName} (depends on: ${depList})`);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
lines.push('');
|
|
422
|
+
}
|
|
364
423
|
// Recovery hints
|
|
365
424
|
const hints = this.generateRecoveryHints();
|
|
366
425
|
if (hints.length > 0) {
|
|
@@ -395,7 +454,7 @@ function _define_property(obj, key, value) {
|
|
|
395
454
|
/**
|
|
396
455
|
* Apply multiple recovery options at once
|
|
397
456
|
*/ async applyRecoveryOptions(options) {
|
|
398
|
-
this.logger.info('Applying recovery options
|
|
457
|
+
this.logger.info('RECOVERY_OPTIONS_APPLYING: Applying recovery options to checkpoint | Purpose: Modify execution state | Options: Complete, fail, skip, retry, reset');
|
|
399
458
|
if (options.markCompleted && options.markCompleted.length > 0) {
|
|
400
459
|
await this.markCompleted(options.markCompleted);
|
|
401
460
|
}
|
|
@@ -416,7 +475,7 @@ function _define_property(obj, key, value) {
|
|
|
416
475
|
if (options.resetPackage) {
|
|
417
476
|
await this.resetPackage(options.resetPackage);
|
|
418
477
|
}
|
|
419
|
-
this.logger.info('Recovery options applied successfully');
|
|
478
|
+
this.logger.info('RECOVERY_OPTIONS_APPLIED: Recovery options applied successfully | Status: Checkpoint updated | Next: Resume execution or exit');
|
|
420
479
|
}
|
|
421
480
|
/**
|
|
422
481
|
* Get checkpoint for external access
|
|
@@ -434,11 +493,30 @@ function _define_property(obj, key, value) {
|
|
|
434
493
|
this.checkpoint.state.skippedNoChanges = this.checkpoint.state.skippedNoChanges.filter((p)=>p !== packageName);
|
|
435
494
|
}
|
|
436
495
|
updateReadyState() {
|
|
496
|
+
// CRITICAL FIX: First, re-evaluate skipped packages
|
|
497
|
+
// Packages that were skipped due to failed dependencies might now be eligible
|
|
498
|
+
// to run if those dependencies have been completed (e.g., via --mark-completed)
|
|
499
|
+
const unblocked = [];
|
|
500
|
+
for (const pkg of this.checkpoint.state.skipped){
|
|
501
|
+
const deps = this.graph.edges.get(pkg) || new Set();
|
|
502
|
+
const allDepsCompleted = Array.from(deps).every((dep)=>this.checkpoint.state.completed.includes(dep) || this.checkpoint.state.skippedNoChanges.includes(dep));
|
|
503
|
+
// Check if any dependencies are still failed
|
|
504
|
+
const anyDepsFailed = Array.from(deps).some((dep)=>this.checkpoint.state.failed.some((f)=>f.name === dep));
|
|
505
|
+
if (allDepsCompleted && !anyDepsFailed) {
|
|
506
|
+
unblocked.push(pkg);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
// Move unblocked packages back to pending
|
|
510
|
+
for (const pkg of unblocked){
|
|
511
|
+
this.checkpoint.state.skipped = this.checkpoint.state.skipped.filter((p)=>p !== pkg);
|
|
512
|
+
this.checkpoint.state.pending.push(pkg);
|
|
513
|
+
this.logger.info(`RECOVERY_PACKAGE_UNBLOCKED: Package unblocked due to satisfied dependencies | Package: ${pkg} | Previous Status: skipped | New Status: pending | Reason: Dependencies satisfied`);
|
|
514
|
+
}
|
|
437
515
|
// Move packages from pending to ready if dependencies met
|
|
438
516
|
const nowReady = [];
|
|
439
517
|
for (const pkg of this.checkpoint.state.pending){
|
|
440
518
|
const deps = this.graph.edges.get(pkg) || new Set();
|
|
441
|
-
const allDepsCompleted = Array.from(deps).every((dep)=>this.checkpoint.state.completed.includes(dep));
|
|
519
|
+
const allDepsCompleted = Array.from(deps).every((dep)=>this.checkpoint.state.completed.includes(dep) || this.checkpoint.state.skippedNoChanges.includes(dep));
|
|
442
520
|
if (allDepsCompleted) {
|
|
443
521
|
nowReady.push(pkg);
|
|
444
522
|
}
|