extensions/specrew-speckit/scripts/intake/helpers/Load-PersonaCatalog.ps1

<#
.SYNOPSIS
Load persona catalog from YAML data.
 
.DESCRIPTION
Loads persona definitions from .specify/intake/personas.yml.
Returns array of persona objects with id, name, description, and question_bank_path.
 
Implements FR-028, FR-029 for Feature 049 Iteration 003.
 
.PARAMETER IntakeDataRoot
Root path for intake data catalogs. Defaults to .specify/intake/
 
.EXAMPLE
$personas = Load-PersonaCatalog -IntakeDataRoot ".specify/intake"
 
.NOTES
Mirror parity: This file must remain functionally identical to:
  .specify/extensions/specrew-speckit/scripts/intake/helpers/Load-PersonaCatalog.ps1
#>


Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'

function Load-PersonaCatalog {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $false)]
        [string]$IntakeDataRoot
    )

    $parserPath = Join-Path $PSScriptRoot 'Read-IntakeYaml.ps1'
    if (-not (Get-Command Read-IntakeYamlDocument -ErrorAction SilentlyContinue) -and (Test-Path -LiteralPath $parserPath -PathType Leaf)) {
        . $parserPath
    }

    if ([string]::IsNullOrEmpty($IntakeDataRoot)) {
        $IntakeDataRoot = Join-Path (Get-Location) '.specify\intake'
    }

    $personasPath = Join-Path $IntakeDataRoot 'personas.yml'

    if (-not (Test-Path $personasPath)) {
        Write-Warning "Personas catalog not found: $personasPath"
        return @()
    }

    try {
        $personasContent = Get-Content $personasPath -Raw

        if (Get-Command ConvertFrom-Yaml -ErrorAction SilentlyContinue) {
            $personasData = $personasContent | ConvertFrom-Yaml
            return $personasData.personas
        }

        if (Get-Command Read-IntakeYamlDocument -ErrorAction SilentlyContinue) {
            return Read-IntakeYamlDocument -Path $personasPath -Kind 'personas'
        }

        Write-Verbose "No YAML parser available, returning empty persona list"
        return @()
    } catch {
        Write-Error "Failed to load persona catalog: $_"
        return @()
    }
}