Optera.LicenseReclaim.psd1

@{
    RootModule        = 'Optera.LicenseReclaim.psm1'
    ModuleVersion     = '0.2.1'
    GUID              = '57c72729-b254-4b9f-820a-b18715f99812'
    Author            = 'Optera AI'
    CompanyName       = 'Optera AI LLC'
    Copyright         = '(c) 2026 Optera AI LLC. All rights reserved.'
    Description       = 'Surfaces Microsoft 365 licenses you can reclaim - still assigned to disabled or stale on-premises Active Directory accounts - and reports the monthly dollars wasted. Read-only; the scan runs entirely inside your network. Hybrid (Entra Connect synced) tenants.'

    PowerShellVersion = '5.1'

    # Lean dependency footprint - no full Graph SDK, no RSAT ActiveDirectory module.
    # AD is read via .NET DirectorySearcher; Graph via Invoke-MgGraphRequest.
    #
    # Microsoft.Graph.Authentication is NOT declared in RequiredModules on purpose: a hard
    # requirement forces it to load at import time, which would break offline-fixture runs and CI
    # on machines without it installed. It is checked at runtime in Connect-ReclaimGraph instead.
    # It is also intentionally NOT listed in ExternalModuleDependencies: PowerShellGet requires any
    # module named there to also appear in RequiredModules/NestedModules, which would defeat the
    # lazy-load design. Connect-ReclaimGraph tells the user to Install-Module it when needed.

    FunctionsToExport = @(
        'Invoke-OpteraLicenseScan',
        'Get-OpteraReclaimableLicense',
        'Unlock-OpteraLicenseReclaim'
    )
    CmdletsToExport   = @()
    VariablesToExport = @()
    AliasesToExport   = @()

    FileList          = @(
        'Optera.LicenseReclaim.psm1',
        'src/Data/sku-pricelist.json'
    )

    PrivateData = @{
        PSData = @{
            Tags         = @(
                'M365', 'Microsoft365', 'Office365', 'License', 'Licensing', 'FinOps',
                'ActiveDirectory', 'Entra', 'Graph', 'Reporting', 'Audit', 'Unused',
                'Inactive', 'CostOptimization', 'Windows'
            )
            ProjectUri   = 'https://opteraai.com/products'
            LicenseUri   = 'https://opteraai.com/terms'
            ReleaseNotes = '0.2.1: documentation and packaging metadata update; no functional change. 0.2.0: correlation accuracy - a SID-first match ladder (anchor-agnostic, resolving an ms-DS-ConsistencyGuid undercount), grace for never-logged-on accounts, -ExcludeOu to suppress intentionally-licensed OUs, and the report reframed as review candidates with accuracy caveats. Public cmdlets: Invoke-OpteraLicenseScan, Get-OpteraReclaimableLicense, Unlock-OpteraLicenseReclaim. 0.1.2: fix the per-account Domain field (blank under -Forest). 0.1.1: -Forest multi-domain scanning. 0.1.0: initial read-only hybrid AD / Microsoft 365 license-reclaim scan.'
        }
    }
}