g-capabilities.ps1

# Scans all g-*.ps1 scripts in $PSScriptRoot; extracts git/gh capabilities sequentially
# and scores each script against open gap requirements to surface extension candidates.
# Limitation: splatted calls (gh @args) are not resolved by static analysis.

. (Join-Path $PSScriptRoot "g-error-vectors.ps1")

$scripts = Get-ChildItem -Path $PSScriptRoot -Filter 'g-*.ps1' |
    Where-Object { $_.Name -notin 'g-capabilities.ps1','g-error-vectors.ps1','g-registry.ps1' } |
    Sort-Object Name

$capMap = @{}
foreach ($s in $scripts) {
    $capMap[$s.Name] = Get-ScriptCapabilities -Path $s.FullName
}

# --- Script capabilities ---
Write-Host 'Script capabilities:'
foreach ($name in ($capMap.Keys | Sort-Object)) {
    $caps    = $capMap[$name]
    $capsStr = if ($caps.Count) { $caps -join ' -> ' } else { '(read-only)' }
    Write-Host (" {0,-32} {1}" -f $name, $capsStr)
}

# --- Gap coverage ---
Write-Host "`nGap coverage:"
foreach ($dim in ($GapRequirements.Keys | Sort-Object)) {
    $required = $GapRequirements[$dim]
    Write-Host ("`n GAP[{0}] requires: {1}" -f $dim, ($required -join ', '))

    $unsorted = foreach ($name in $capMap.Keys) {
        $caps  = [string[]]$capMap[$name]
        $hit   = @($required | Where-Object { $_ -in $caps })
        $miss  = @($required | Where-Object { $_ -notin $caps })
        $score = if ($required.Count) { [double]$hit.Count / $required.Count } else { 0 }
        if ($score -gt 0) {
            [pscustomobject]@{ Script = $name; Score = $score; Hit = $hit; Miss = $miss }
        }
    }
    $scored = @($unsorted | Sort-Object Score -Descending)

    if (-not $scored) {
        Write-Host ' (no match -- new script needed)'
    } else {
        foreach ($c in $scored) {
            $pct     = [int]($c.Score * 100)
            $hitStr  = ($c.Hit  | ForEach-Object { "$_`:+" }) -join ' '
            $missStr = ($c.Miss | ForEach-Object { "$_`:-" }) -join ' '
            $detail  = (@($hitStr, $missStr) | Where-Object { $_ }) -join ' '
            Write-Host (" {0,-32} {1,4}% {2}" -f $c.Script, $pct, $detail)
        }
        if ($scored[0].Score -lt 1.0) {
            Write-Host ' (no full match -- new script or multi-script extension)'
        } else {
            Write-Host " (extend $($scored[0].Script))"
        }
    }
}
exit 0