Set-StrictMode -Version Latest $ErrorActionPreference = 'Stop' $repoRoot = Split-Path -Parent $PSScriptRoot $pluginsDir = Join-Path $repoRoot 'plugins\notify' $assemblies = @{ slack = 'StellaOps.Notify.Connectors.Slack.dll' teams = 'StellaOps.Notify.Connectors.Teams.dll' email = 'StellaOps.Notify.Connectors.Email.dll' webhook = 'StellaOps.Notify.Connectors.Webhook.dll' } $hasFailures = $false foreach ($channel in $assemblies.Keys) { $dir = Join-Path $pluginsDir $channel if (-not (Test-Path -LiteralPath $dir -PathType Container)) { Write-Host "ERROR: Missing plug-in directory '$dir'." $hasFailures = $true continue } $manifest = Join-Path $dir 'notify-plugin.json' $assembly = Join-Path $dir $assemblies[$channel] $baseName = [System.IO.Path]::GetFileNameWithoutExtension($assemblies[$channel]) $pdb = Join-Path $dir "$baseName.pdb" $deps = Join-Path $dir "$baseName.deps.json" if (-not (Test-Path -LiteralPath $manifest -PathType Leaf)) { Write-Host "ERROR: Missing manifest for '$channel' connector ($manifest)." $hasFailures = $true } if (-not (Test-Path -LiteralPath $assembly -PathType Leaf)) { Write-Host "ERROR: Missing assembly for '$channel' connector ($assembly)." $hasFailures = $true } Get-ChildItem -LiteralPath $dir -File | ForEach-Object { switch ($_.Name) { 'notify-plugin.json' { return } { $_.Name -eq $assemblies[$channel] } { return } { $_.Name -eq "$baseName.pdb" } { return } { $_.Name -eq "$baseName.deps.json" } { return } default { Write-Host "ERROR: Unexpected file '$($_.Name)' in '$dir'." $hasFailures = $true } } } } if ($hasFailures) { exit 1 } exit 0