src/Engine/Conflict.ps1

# Conflict.ps1 — validation issues, duplicate names, command shadowing.

function Get-PSMMConflict {
    [CmdletBinding()]
    param([AllowNull()][AllowEmptyCollection()] $Entries)   # empty set = normal (zero configs)
    $Entries = @($Entries)

    $validation = foreach ($e in $Entries) {
        if ($e.Issues.Count) {
            [pscustomobject]@{ Name = $e.Name; Source = $e.Source; Issues = ($e.Issues -join '; '); Writable = $e.Writable }
        }
    }

    $dupes = $Entries | Group-Object Name | Where-Object Count -gt 1 | ForEach-Object {
        [pscustomobject]@{
            Name    = $_.Name
            Count   = $_.Count
            Sources = (($_.Group.Source | ForEach-Object {
                if ($_ -eq '<profile inline>') { 'profile inline' } else { Split-Path $_ -Leaf }
            } | Select-Object -Unique) -join ', ')
        }
    }

    $loadedNames = (Get-Module).Name
    $shadow = @()
    if ($loadedNames) {
        $shadow = Get-Command -Module $loadedNames -CommandType Cmdlet, Function, Alias -ErrorAction SilentlyContinue |
            Group-Object Name | Where-Object { @($_.Group.Source | Select-Object -Unique).Count -gt 1 } |
            ForEach-Object {
                [pscustomobject]@{ Command = $_.Name; Modules = (@($_.Group.Source | Select-Object -Unique) -join ', ') }
            }
    }

    [pscustomobject]@{ Validation = @($validation); Duplicates = @($dupes); Shadowed = @($shadow) }
}