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
28 changes: 28 additions & 0 deletions .github/skills/add-surface-model/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
---
name: add-surface-model
description: "Use when adding or validating a Microsoft Surface model in OSDCloud surface.json, resolving System SKU/SystemId, Surface driver pack UpdatePage, direct MSI Url, FileName, ReleaseDate, OSArchitecture, and catalog properties."
argument-hint: "Surface model name, for example: Surface Laptop 8 Intel"
---

# Add Surface Model

Use this skill to add or validate Microsoft Surface driver pack entries in `OSDCloud/core/driverpacks/surface.json`.

## Workflow

1. Review the current catalog entry shape in `OSDCloud/core/driverpacks/surface.json` and use [the template](./assets/surface-model-template.json) for field order.
2. Follow [the Surface catalog rules](./references/surface-catalog-rules.md) to resolve each property from Microsoft sources and local catalog conventions.
3. Add or update one JSON object in `surface.json`, keeping entries sorted by `Model`.
4. Run `.\.github\scripts\Update-MicrosoftCatalog.ps1 -JsonPath 'OSDCloud\core\driverpacks\surface.json'` to refresh `FileName`, `Url`, and `ReleaseDate` from `UpdatePage`.
5. Validate JSON parsing, direct MSI URL shape, `FileName`/`Url` consistency, and runtime loading through `Get-OSDCloudCatalogSurface` when practical.

## Required Sources

- System model and System SKU reference: `https://learn.microsoft.com/en-us/surface/surface-system-sku-reference`
- Surface driver and firmware update pages: `https://learn.microsoft.com/en-us/surface/manage-surface-driver-and-firmware-updates`
- Support model pages linked from Microsoft Surface driver pages when they expose clearer Download Center IDs.
- Repo updater behavior in `.github/scripts/Update-MicrosoftCatalog.ps1`.

## Stop Conditions

Do not leave placeholder values in `surface.json`. If the Microsoft Download Center page cannot yield a direct `.msi` URL through the updater or manual verification, pause and report the blocked fields instead of committing guessed values.
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"CatalogVersion": "<yy.MM.dd date added to surface.json>",
"ReleaseDate": "<yy.MM.dd DriverPack Date Published>",
"Name": "<Model> [<ReleaseDate>]",
"Manufacturer": "Microsoft",
"Model": "<Surface model display name used by this catalog>",
"SystemId": "<System SKU string, or array of System SKU strings>",
"FileName": "<direct DriverPack MSI file name>",
"Url": "https://download.microsoft.com/download/<path>/<direct DriverPack MSI file name>",
"OperatingSystem": "Windows 11",
"OSArchitecture": "<amd64 or arm64>",
"HashMD5": null,
"UpdatePage": "https://www.microsoft.com/download/details.aspx?id=<download-center-id>"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Surface Catalog Rules

## Field Resolution

Use the current `surface.json` object order for every entry:

1. `CatalogVersion` is the date the entry is added or manually changed in the catalog, formatted as `yy.MM.dd`.
2. `ReleaseDate` is the DriverPack release date from the Microsoft Download Center page Date Published value, formatted as `yy.MM.dd`. If the page does not expose Date Published but the direct MSI is verified, use the MSI response `Last-Modified` date and note that fallback in validation.
3. `Name` is exactly `<Model> [<ReleaseDate>]`.
4. `Manufacturer` is always `Microsoft`.
5. `Model` comes from the System Model column at `https://learn.microsoft.com/en-us/surface/surface-system-sku-reference`, adapted only when the existing catalog uses a shorter family name such as `Surface Laptop 7 Intel`.
6. `SystemId` comes from the System SKU column at the same reference page. Use a string for one SKU and an array when multiple SKUs share the same driver pack.
7. `FileName` is the final path segment of the direct DriverPack MSI URL.
8. `Url` is the direct `https://download.microsoft.com/download/.../*.msi` DriverPack URL.
9. `OperatingSystem` is `Windows 11` for current Surface driver packs unless Microsoft only publishes a Windows 10 pack for that model.
10. `OSArchitecture` is `amd64` for Intel or AMD Surface models and `arm64` for Snapdragon or ARM Surface models.
11. `HashMD5` is `null` unless Microsoft provides a verified MD5 hash.
12. `UpdatePage` is the best matching Microsoft Download Center details page for the model.

## Finding UpdatePage, FileName, and Url

Start at `https://learn.microsoft.com/en-us/surface/manage-surface-driver-and-firmware-updates`. If the table does not expose the direct Download Center details URL clearly, follow the support page for the Surface family and choose the row that best matches the model and processor family.

After adding or updating `UpdatePage`, run `.\.github\scripts\Update-MicrosoftCatalog.ps1 -JsonPath 'OSDCloud\core\driverpacks\surface.json'`. The script is the source of truth for picking the direct MSI:

- Scrape `UpdatePage` for `https://download.microsoft.com/download/.../*.msi` links.
- If none are present on the details page, try `https://www.microsoft.com/en-us/download/confirmation.aspx?id=<id>`.
- Prefer MSI links containing `Win11`.
- Among candidates, pick the highest Windows build number in the MSI filename, based on the `_(\d{5})_` pattern.
- Use the page Date Published value for `ReleaseDate` when it is valid; if it is absent, use the verified direct MSI `Last-Modified` date.

## Validation Checklist

- `surface.json` parses with `ConvertFrom-Json`.
- The entry contains all template fields in order.
- `Name` uses the same `ReleaseDate` as the object.
- `Manufacturer` is `Microsoft`.
- `SystemId` values exactly match Microsoft System SKU values.
- `FileName` equals the final path segment of `Url`.
- `Url` matches `https://download.microsoft.com/download/[^\"'<>\s]+\.msi`.
- `OSArchitecture` matches the processor family.
- `UpdatePage` remains populated for future scheduled refreshes.

## Runtime Notes

`Get-OSDCloudCatalogSurface` reads `surface.json`, enriches entries with live data from `UpdatePage`, and caches results in `$env:TEMP\osdcloud-driverpack-surface.json`. During deployment, Surface matching depends on `SystemId`, so incorrect System SKU values prevent the correct driver pack from being selected.
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,22 @@ All notable changes to this project will be documented in this file.

## Unreleased

## 26.8.3.1 - August 3, 2026

### Added

- Added Microsoft Surface driver pack catalog entries for Surface Laptop 8 Intel, Surface Laptop 8 Snapdragon, and Surface Laptop 13in 1st Intel.
- Added the `add-surface-model` Copilot skill, Surface model template, and catalog validation guidance for maintaining `surface.json`.

### Changed

- Module version bumped to `26.8.3.1`.
- Renamed the Surface Laptop Snapdragon 13-inch catalog entry to Surface Laptop 13in 1st Snapdragon to align with Surface catalog naming.

### Removed

- Removed the legacy `surface.xml` driver pack snapshot now superseded by `surface.json`.

## 26.8.1.1 - August 1, 2026

### Changed
Expand Down
2 changes: 1 addition & 1 deletion 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.8.1.1'
ModuleVersion = '26.8.3.1'
CompatiblePSEditions = @('Core','Desktop')
GUID = '2fbd5c65-79c7-4561-9a2e-c4a4eebc89c7'

Expand Down
60 changes: 58 additions & 2 deletions OSDCloud/core/driverpacks/surface.json
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,48 @@
"HashMD5": null,
"UpdatePage": "https://www.microsoft.com/download/details.aspx?id=108014"
},
{
"CatalogVersion": "26.08.03",
"ReleaseDate": "26.06.19",
"Name": "Surface Laptop 8 Intel [26.06.19]",
"Manufacturer": "Microsoft",
"Model": "Surface Laptop 8 Intel",
"SystemId": [
"Surface_Laptop_for_Business_13_8in_8th_Ed_Intel_2107",
"Surface_Laptop_for_Business_13_8in_8th_Ed_Intel_2135",
"Surface_Laptop_for_Business_15in_8th_Ed_Intel_2108",
"Surface_Laptop_for_Business_15in_8th_Ed_Intel_2136"
],
"FileName": "SurfaceLaptop8withIntel_Win11_26200_26.052.17609.0.msi",
"Url": "https://download.microsoft.com/download/74b2d3cc-d205-41ed-8784-59ceba1411f0/SurfaceLaptop8withIntel_Win11_26200_26.052.17609.0.msi",
"OperatingSystem": "Windows 11",
"OSArchitecture": "amd64",
"HashMD5": null,
"UpdatePage": "https://www.microsoft.com/download/details.aspx?id=108669"
},
{
"CatalogVersion": "26.08.03",
"ReleaseDate": "26.06.16",
"Name": "Surface Laptop 8 Snapdragon [26.06.16]",
"Manufacturer": "Microsoft",
"Model": "Surface Laptop 8 Snapdragon",
"SystemId": [
"Surface_Laptop_13_8in_8th_Ed_Snapdragon_2036",
"Surface_Laptop_13_8in_8th_Ed_Snapdragon_2138",
"Surface_Laptop_15in_8th_Ed_Snapdragon_2037",
"Surface_Laptop_15in_8th_Ed_Snapdragon_2139",
"Surface_Laptop_for_Business_13_8in_8th_Ed_Snapdragon_2036",
"Surface_Laptop_for_Business_13_8in_8th_Ed_Snapdragon_2138",
"Surface_Laptop_for_Business_15in_8th_Ed_Snapdragon_2037",
"Surface_Laptop_for_Business_15in_8th_Ed_Snapdragon_2139"
],
"FileName": "SurfaceLaptop8withSnapdragon_Win11_28000_26.051.8481.0.msi",
"Url": "https://download.microsoft.com/download/912431b4-2920-4990-8b62-50b573263fda/SurfaceLaptop8withSnapdragon_Win11_28000_26.051.8481.0.msi",
"OperatingSystem": "Windows 11",
"OSArchitecture": "arm64",
"HashMD5": null,
"UpdatePage": "https://www.microsoft.com/download/details.aspx?id=108705"
},
{
"CatalogVersion": "26.04.06",
"ReleaseDate": "24.10.15",
Expand Down Expand Up @@ -444,9 +486,9 @@
{
"CatalogVersion": "26.07.31",
"ReleaseDate": "26.02.24",
Comment on lines 487 to 488
"Name": "Surface Laptop Snapdragon 13-inch [26.02.24]",
"Name": "Surface Laptop 13in 1st Snapdragon [26.02.24]",
"Manufacturer": "Microsoft",
"Model": "Surface Laptop Snapdragon 13-inch",
"Model": "Surface Laptop 13in 1st Snapdragon",
"SystemId": [
"Surface_Laptop_13in_1st_Ed_with_Snapdragon_2095",
"Surface_Laptop_for_Business_13in_1st_Ed_with_Snapdragon_2095"
Expand All @@ -458,6 +500,20 @@
"HashMD5": null,
"UpdatePage": "https://www.microsoft.com/download/details.aspx?id=108198"
},
{
"CatalogVersion": "26.08.03",
"ReleaseDate": "26.06.19",
"Name": "Surface Laptop 13in 1st Intel [26.06.19]",
"Manufacturer": "Microsoft",
"Model": "Surface Laptop 13in 1st Intel",
"SystemId": "Surface_Laptop_for_Business_13in_1st_Ed_Intel_2156",
"FileName": "SurfaceLaptopforBusiness13in1stEdIntel_Win11_26200_26.051.10324.0.msi",
"Url": "https://download.microsoft.com/download/30629874-b55d-4c3d-aed7-fbc7cb093cbd/SurfaceLaptopforBusiness13in1stEdIntel_Win11_26200_26.051.10324.0.msi",
"OperatingSystem": "Windows 11",
"OSArchitecture": "amd64",
"HashMD5": null,
"UpdatePage": "https://www.microsoft.com/download/details.aspx?id=108670"
},
{
"CatalogVersion": "26.07.31",
"ReleaseDate": "26.01.16",
Expand Down
Loading