Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 17 additions & 17 deletions .github/instructions/osdcloud-catalog-update.instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ Catalog snapshots live under the repository's OSDCloud/core tree. OS metadata is
### File naming

```
<build>.<revision>-<windows-name>-<version>.xml
<major>.<ubr>.<yyMMdd>-<HHmm>.xml
```

Examples:
- `26200.8037-win11-25h2.xml`
- `26100.4349-win11-24h2.xml`
- `19045.3803-win10-22h2.xml`
- `26200.9457.260913-0221.xml`
- `26100.4349.250607-1500.xml`
- `19045.3803.231204-0204.xml`

The filename encodes the full servicing build (`build.revision`) and maps to the OS name and version. The first five digits (`build`) are extracted programmatically to identify the OS; the full `build.revision` becomes `OSBuildVersion`.
The filename encodes the full servicing build (`major.ubr`) and the media release timestamp. The complete identity must match the common `<major>.<ubr>.<yyMMdd>-<HHmm>` prefix of the ESD filenames in the catalog. The validated numeric build metadata identifies the OS through `ConvertTo-OSDCoreOperatingSystemInfo`; the full `major.ubr` becomes `OSBuildVersion`.

### XML structure

Expand All @@ -35,7 +35,7 @@ Each `<File>` element contains:

| Element | Description |
|---|---|
| `FileName` | ESD filename — must start with `<build>.<revision>.` |
| `FileName` | ESD filename — must start with the catalog's `<major>.<ubr>.<yyMMdd>-<HHmm>.` identity |
| `LanguageCode` | BCP-47 code, e.g. `en-us`, `fr-fr` |
| `Language` | Human-readable language name |
| `Edition` | PowerShell edition ID, e.g. `Professional`, `Education`, `Core` |
Expand All @@ -53,24 +53,24 @@ Each `<File>` element contains:

1. **Add the XML file** to `OSDCloud/core/operatingsystems/` following the naming convention above.

2. **Register the build number** in `OSDCloud/private/core/Get-OSDCloudCoreOperatingSystems.ps1`.
2. **Register the build number** in `OSDCloud/private/core-operatingsystem/ConvertTo-OSDCoreOperatingSystemInfo.ps1`.
Locate the `switch ($OSBuild)` block and add a new case:

```powershell
switch ($OSBuild) {
'19045' { $OperatingSystem = 'Windows 10 22H2'; $OSName = 'Windows 10'; $OSVersion = '22H2' }
'22621' { $OperatingSystem = 'Windows 11 22H2'; $OSName = 'Windows 11'; $OSVersion = '22H2' }
'22631' { $OperatingSystem = 'Windows 11 23H2'; $OSName = 'Windows 11'; $OSVersion = '23H2' }
'26100' { $OperatingSystem = 'Windows 11 24H2'; $OSName = 'Windows 11'; $OSVersion = '24H2' }
'26200' { $OperatingSystem = 'Windows 11 25H2'; $OSName = 'Windows 11'; $OSVersion = '25H2' }
'28000' { $OperatingSystem = 'Windows 11 26H1'; $OSName = 'Windows 11'; $OSVersion = '26H1' }
'19045' { $OSName = 'Windows 10'; $OSVersion = '22H2' }
'22621' { $OSName = 'Windows 11'; $OSVersion = '22H2' }
'22631' { $OSName = 'Windows 11'; $OSVersion = '23H2' }
'26100' { $OSName = 'Windows 11'; $OSVersion = '24H2' }
'26200' { $OSName = 'Windows 11'; $OSVersion = '25H2' }
'28000' { $OSName = 'Windows 11'; $OSVersion = '26H1' }
# add new build here:
'<build>' { $OperatingSystem = 'Windows 11 <Ver>'; $OSName = 'Windows 11'; $OSVersion = '<Ver>' }
default { continue }
'<build>' { $OSName = 'Windows 11'; $OSVersion = '<Ver>' }
default { return }
}
```

Without this entry, the build's ESD entries are silently skipped.
The converter composes `OperatingSystem` from `OSName` and `OSVersion`. Without a mapping entry, the build's ESD entries are silently skipped.

3. **Update workflow OS configs** — for every channel that should offer the new build, add the version string to `OSDCloud/workflow/<channel>/os-amd64.json` and `OSDCloud/workflow/<channel>/os-arm64.json`:

Expand Down Expand Up @@ -216,7 +216,7 @@ Key differences:

## Common mistakes

- **Omitting the build switch case** — a new OS XML will load without errors but produce zero OS options in the UX because every `<File>` hits the `default { continue }` branch.
- **Omitting the converter switch case** — a new OS XML will load without errors but produce zero OS options in the UX because the converter returns no release information for the build.
- **Stale `surface.json` driver URLs** — `Get-OSDCoreDriverPackCatalogSurface` serves MSI URLs from `OSDCloud/core/driverpacks/surface.json`; if `UpdatePage` links change and the automated workflow has not run, deployed drivers may point to outdated or removed files. Run `.github/scripts/Update-MicrosoftCatalog.ps1` manually to refresh.
- **Editing OEM XML snapshots manually** — Dell/HP/Lenovo XML is replaced wholesale from upstream; manual edits will be lost on the next snapshot refresh.
- **Adding a Windows version string to workflow configs without the catalog XML** — the UX will offer the version but `Get-OSDCloudCoreOperatingSystems` will return no matching ESD entries, causing `Initialize-DeployOSDCloud` to throw.
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,22 @@

All notable changes to this project will be documented in this file.

## 26.9.25.1 - September 25, 2026

### Added

- Added private operating system catalog refresh support that downloads and validates the current Windows products catalog, publishes it to the module, and synchronizes it to eligible OSDCloud drives.
- Added centralized Windows build conversion for operating system name and release metadata, including Windows 11 26H1 build `28000`.
- Added author and profile environment variables to the bundled OSDCloud WinPE startup profile.

### Changed

- Module version bumped to `26.9.25.1` and the preview designation was removed from the module description.
- Renamed bundled operating system catalogs to include their build and media release timestamp, corrected the Windows 11 25H2 catalog snapshot mapping, and updated catalog maintenance guidance for the new naming format.
- Updated operating system catalog initialization to validate timestamped identities, expose build metadata on catalog records, and use the centralized build conversion helper.
- Updated module loading to exclude Pester test files from function discovery.
- Standardized deployment version, system clock, TPM, Autopilot, and Secure Boot status messages.

## 26.9.24.1 - September 24, 2026

### Added
Expand Down
4 changes: 2 additions & 2 deletions OSDCloud/OSDCloud.psd1
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
@{
# --- Identity ---
RootModule = 'OSDCloud.psm1'
ModuleVersion = '26.9.24.1'
ModuleVersion = '26.9.25.1'
CompatiblePSEditions = @('Core','Desktop')
GUID = '2fbd5c65-79c7-4561-9a2e-c4a4eebc89c7'

Expand All @@ -17,7 +17,7 @@
CompanyName = 'Recast Software'
Copyright = '(c) 2026 Recast Software. All rights reserved.'
Description = @'
Recast OSDCloud PowerShell Module - Preview
Recast OSDCloud PowerShell Module
Workplace Ninja Summit Release
PowerShell module for OSDCloud v2 deployment automation and WinPEStartup from recastsoftware.com.
Includes operating system, driver pack, and device provisioning workflows.
Expand Down
8 changes: 4 additions & 4 deletions OSDCloud/OSDCloud.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ $global:OSDCloudModule = Get-Content -Path (Join-Path $script:OSDCloudModuleBase
$script:OSDCloudPSDefaultParameterValuesPath = Join-Path $script:OSDCloudModuleBase 'core\PSDefaultParameterValues.json'

# Get public and private function definition files.
$Classes = @(Get-ChildItem -Path "$PSScriptRoot\classes\*.ps1")
$Private = @( Get-ChildItem -Path $PSScriptRoot\private\*.ps1 -ErrorAction SilentlyContinue -Recurse )
$PublicWinOS = @( Get-ChildItem -Path $PSScriptRoot\public\WinOS\*.ps1 -ErrorAction SilentlyContinue -Recurse )
$PublicWinPE = @( Get-ChildItem -Path $PSScriptRoot\public\WinPE\*.ps1 -ErrorAction SilentlyContinue -Recurse )
$Classes = @(Get-ChildItem -Path "$PSScriptRoot\classes\*.ps1" -Exclude '*.Tests.ps1')
$Private = @( Get-ChildItem -Path $PSScriptRoot\private\*.ps1 -Exclude '*.Tests.ps1' -ErrorAction SilentlyContinue -Recurse )
$PublicWinOS = @( Get-ChildItem -Path $PSScriptRoot\public\WinOS\*.ps1 -Exclude '*.Tests.ps1' -ErrorAction SilentlyContinue -Recurse )
$PublicWinPE = @( Get-ChildItem -Path $PSScriptRoot\public\WinPE\*.ps1 -Exclude '*.Tests.ps1' -ErrorAction SilentlyContinue -Recurse )

try {
if (!([System.Management.Automation.PSTypeName]'HtmlAgilityPack.HtmlDocument').Type) {
Expand Down
Loading
Loading