WingetBatch.psd1

@{
    # Script module or binary module file associated with this manifest.
    RootModule = 'WingetBatch.psm1'

    # Version number of this module.
    ModuleVersion = '2.10.0'

    # ID used to uniquely identify this module
    GUID = 'b9e8f5d2-4c3f-4a6b-8d9e-2f7a8b5c6e4f'

    # Author of this module
    Author = 'Matthew Bubb'

    # Company or vendor of this module
    CompanyName = 'OnYaChamp.com'

    # Copyright statement for this module
    Copyright = '(c) 2025-2026 Matthew Bubb. All rights reserved.'

    # Description of the functionality provided by this module
    Description = 'Advanced batch operations for Windows Package Manager (winget). Features: interactive multi-select installation, GitHub new package discovery with 30-day caching, background update monitoring with profile integration, registry-based recent package removal, API rate limiting, and comprehensive package details including pricing, licensing, and release notes. Requires PwshSpectreConsole for enhanced UI.'

    # Minimum version of the PowerShell engine required by this module
    PowerShellVersion = '7.4'

    # PwshSpectreConsole (required) only runs on PowerShell 7.4+
    CompatiblePSEditions = @('Core')

    # Required modules
    RequiredModules = @('Microsoft.WinGet.Client', 'PwshSpectreConsole')

    # Functions to export from this module
    FunctionsToExport = @('Start-WingetUpdateCheck',
        'Install-WingetAll',
        'Get-WingetNewPackages',
        'Get-WingetUpdates',
        'Enable-WingetUpdateNotifications',
        'Disable-WingetUpdateNotifications',
        'Set-WingetBatchGitHubToken',
        'New-WingetBatchGitHubToken',
        'Remove-WingetRecent',
        'Export-WingetBatchConfig',
        'Import-WingetBatchConfig',
        'Set-WingetBatchConfig',
        'Get-WingetBatchConfig',
        'Invoke-WingetBatchCleanup',
        'Update-WingetBatch',
        'Invoke-WinGetBatch',
        'Repair-WingetBatchManager',
        'Get-WingetMachineState',
        'Get-WingetPackageInfo',
        'Get-WingetHistory',
        'Watch-WingetPackages',
        'Find-WingetDuplicate',
        'Register-WingetMaintenance',
        'Get-WingetDependencyGraph',
        'Start-WingetServer',
        'Get-WingetRecommend',
        'Invoke-WingetFleet',
        'Restore-WingetSnapshot',
        'Test-WingetCompliance',
        'Get-WingetHealthScore',
        'Send-WingetWebhook',
        'Export-WingetOffline',
        'Install-WingetProfile',
        'Get-WingetChangelog'
    )

    # Cmdlets to export from this module
    CmdletsToExport = @()

    # Variables to export from this module
    VariablesToExport = @()

    # Aliases to export from this module
    AliasesToExport = @()

    # Private data to pass to the module specified in RootModule/ModuleToProcess
    PrivateData = @{
        PSData = @{
            # Tags applied to this module for module discovery.
            Tags = @('winget', 'package-manager', 'windows', 'batch-install', 'utility', 'github-api', 'interactive', 'cache', 'updates', 'PwshSpectreConsole')

            # A URL to the license for this module.
            LicenseUri = 'https://github.com/thebubbsy/WingetBatch/blob/main/LICENSE'

            # A URL to the main website for this project.
            ProjectUri = 'https://github.com/thebubbsy/WingetBatch'

            # A URL to an icon representing this module.
            # IconUri = ''

            # ReleaseNotes of this module
            ReleaseNotes = @'
v2.10.0 - Reliability Release
- REQUIREMENT: PowerShell 7.4+ is now declared (PwshSpectreConsole already required it; 11 commands never parsed on 5.1).
- FIXED: Installs/updates/uninstalls reported success when the installer failed. WinGet returns a Status instead of throwing; every command now checks it and shows the real error and reboot requirement.
- FIXED: Modules that export the same command names (e.g. Cobalt) hijacked Get-WinGetPackage, so Get-WingetUpdates always said "up to date". All WinGet calls are now module-qualified.
- FIXED: Get-WingetMachineState failed on every call (helpers defined after use). -RemoveExtraneous now only touches WinGet-sourced packages and lists them first; pinned versions are honored; new -Force and -IncludeUnmanaged.
- FIXED: Get-WingetDependencyGraph failed on every call (wrong parameter name); tree output and Mermaid labels fixed.
- FIXED: Get-Date -ToString (invalid) broke Restore-WingetSnapshot -Take, Invoke-WingetFleet, Send-WingetWebhook (Discord), Test-WingetCompliance reports, Export-WingetOffline and the maintenance task.
- FIXED: Register-WingetMaintenance tasks never updated anything (called the interactive Get-WingetUpdates). -IncludeStore, NotifyOnly (webhooks) and Monthly schedules now work.
- FIXED: Start-WingetServer used a non-existent Pode cmdlet (Add-PodeRouteMiddleware); routes no longer call interactive commands; crypto-random API key; -Https uses a self-signed certificate.
- FIXED: Get-WingetNewPackages used local time as UTC, shifting the search window by the UTC offset; background detail jobs never received the parser, losing descriptions and licenses.
- FIXED: Get-WingetPackageInfo -ShowManifest/-ShowVersions, Get-WingetChangelog release notes and Get-WingetHealthScore manifest checks read the wrong files; version lists sorted as text (9.x above 10.x).
- FIXED: Get-WingetHealthScore flagged almost every package as pre-release ("Source" contains "rc") and scored freshness by version count; it now uses the real last-commit date.
- FIXED: Install-WingetProfile -Path could not load its own -Export output; 20 built-in profile/recommendation IDs did not exist in winget.
- FIXED: Enable-WingetUpdateNotifications overwrote config.json (losing webhooks and search settings). Config writes now merge.
- FIXED: Invoke-WinGetBatch ignored version pins and ran a download phase whose files were never used (and which always failed). -ThrottleLimit is now ignored.
- FIXED: Remove-WingetRecent could attach the wrong install date via loose name matching; now uses the COM API and exact/registry-key matching.
- FIXED: Export-WingetOffline ignored -Architecture and ran MSIs without msiexec; now built on Export-WinGetPackage with hash verification and per-installer silent switches.
- FIXED: Invoke-WingetFleet lost machine names on failure and -RetryFailed ignored -UseSSH; timeouts reported.
- FIXED: Test-WingetCompliance -NewPolicy -PolicyPath could not bind; Send-WingetWebhook -SaveConfig prompted for -Event; Teams now uses Adaptive Cards.
- FIXED: Watch-WingetPackages -Once crashed when output was redirected; showed 0 updates and misaligned borders.
- NEW: Get-WingetUpdates -ListOnly, Get-WingetHistory -PassThru, Restore-WingetSnapshot -RestoreVersions/-Force, Install-WingetProfile -Force.
- NEW: -AutoSnapshot now actually snapshots before every WingetBatch install/update/uninstall; -UndoLast 1 undoes the latest one.
- NEW: Update notifications share the update cache with Get-WingetUpdates, so it opens instantly after a background check.
- LIVE-TESTED against real installs, updates, uninstalls, downloads and a running API server. Fixes from that pass:
  * Results are verified, not trusted: an update that leaves the old version reports NotUpdated, an uninstall that leaves the program reports StillInstalled (both happen in practice with WinGet 1.30).
  * Pinning/rollback to an older version uninstalls first, then installs and verifies (installing over the top left two registered copies of VLC).
  * ARP\ and MSIX\ packages (Add/Remove Programs entries) can be updated/uninstalled; WinGet's ID search rejects those IDs.
  * Install-WingetAll -Id is an exact match (VideoLAN.VLC also installed VideoLAN.VLC.Nightly); summary table renders colors.
  * Start-WingetServer: never started ($using in the main Pode block), API-key check read a non-existent property, /api/health crashed, rate limit was per-thread, result counts were wrong. Errors now log to ~/.wingetbatch/server_errors_*.log; responses carry X-RateLimit-Remaining.
  * Invoke-WingetFleet: an edit had left the old implementation in place; machine names and per-package errors now reported.
  * Install-Offline.ps1 accepts "-PackageId a,b" from powershell.exe -File / cmd.
  * winget show parsing handles multi-line Description, Tags and Release Notes.
  * Pode/WinGet.Client/WingetBatch installs and Update-WingetBatch work with PSResourceGet without prompting.
  * Get-WingetChangelog processes every piped package ID.
- TESTS: 30 new regression tests (78 total).
 
Full history: https://github.com/thebubbsy/WingetBatch/blob/main/CHANGELOG.md
'@

        }
    }
}