Generated banner for Microsoft Store Publisher
Generated logo for Microsoft Store Publisher

Microsoft Store Publisher

GitHubOfficialFirst committed by burkehollandDistributed by GitHub

  • Skill
  • Workflow
  • Cloud and DevOps
  • MIT
  • Low risk
  • Has scripts

From the author

Prepare, validate, submit, and monitor Windows desktop apps in Microsoft Partner Center. Use for MSIX packaging, Store identity, listings, WACK, Partner Center automation, certification, and publishing.
— the description by burkeholland

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides a structured end-to-end workflow for publishing Windows desktop applications, including packaged Win32 apps, to the Microsoft Store. It covers the entire lifecycle from MSIX packaging and identity reservation to Windows App Certification Kit (WACK) validation and automated submission to Partner Center. The skill emphasizes safety by requiring explicit user confirmation for all state-changing actions and provides tools for inspecting packages and automating browser interactions with the Partner Center portal.

What it does

  • Validates MSIX package identity, versioning, and manifest requirements.
  • Automates WACK execution and parses XML/HTML reports for certification readiness.
  • Provides a controller for interacting with the Microsoft Partner Center web interface.
  • Manages the submission lifecycle, including product reservation and certification monitoring.
  • Maintains a durable record of submission states and validation results.
  • Ensures compliance with Store requirements for restricted capabilities and listing content.

When to use it

  • When preparing a new Windows desktop application for initial Microsoft Store release.
  • When updating an existing Store app with a new package version.
  • When troubleshooting certification failures or responding to Store policy findings.
  • When automating repetitive submission tasks to ensure consistency and reduce manual errors.

Advantages

  • Reduces manual effort in navigating complex Partner Center submission forms.
  • Ensures consistent package validation through standardized inspection scripts.
  • Provides clear audit trails for every submission action taken.
  • Prevents accidental publishing or agreement acceptance through mandatory confirmation steps.
  • Simplifies the interpretation of WACK results for faster iteration.

Usage examples

“Validate my new MSIX package against the reserved identity in Partner Center.”
The agent runs the inspection script to verify the package identity, publisher, and display name against the provided Partner Center values, reporting any discrepancies.
“Run the Windows App Certification Kit on my packaged app and summarize the results.”
The agent executes the WACK tool, parses the resulting XML report, and provides a summary of passed tests, warnings, and any failures that need to be addressed before submission.
“Submit my validated package for certification in Partner Center.”
The agent navigates to the submission page, verifies the 'Complete' status of all sections, asks for explicit user confirmation, and then triggers the 'Submit for certification' action.

Install

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/github/microsoft-store-publisher/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip microsoft-store-publisher.zip -d .agents/skills

Documentation by burkeholland

Microsoft Store Publisher

Use this skill when the user wants to publish a Windows application to the Microsoft Store, create or validate an MSIX, complete a Partner Center submission, respond to certification findings, or monitor publishing status.

This skill is for Windows desktop applications, including packaged classic Win32 apps that use runFullTrust. It is based on a successful end-to-end submission using Partner Center, an unsigned Store MSIX, the Windows App Certification Kit, and browser automation against Partner Center's current web components.

Required safeguards

Treat Partner Center as a production publishing system.

  1. Never accept the Microsoft Application Developer Agreement or another binding agreement without fresh, action-specific user confirmation.

  2. Never press Submit for certification without fresh, action-specific user confirmation after every section is complete and the final package is validated.

  3. Never cancel certification, delete a submission, change pricing, change market availability, publish manually, or send Partner Center feedback without confirmation for that exact action.

  4. Never enter, retrieve, print, save, or expose passwords, passkeys, tokens, recovery codes, MFA codes, or payment information. Let the user complete credential and operating-system authentication prompts.

  5. Do not use the user's everyday browser profile for automation. Use a dedicated persistent profile and let the user authenticate interactively.

  6. Do not infer legal, trademark, patent, privacy, export-control, or open-source compliance. Identify the concern and state when professional review is prudent.

  7. Do not claim WACK passed from an exit code alone. Find and read the generated report and verify its overall result.

  8. Do not upload a package until its identity, publisher, display name, architecture, version, and signing state have been inspected.

Files in this skill

  • references/submission-playbook.md - complete submission sequence.

  • references/msix-checklist.md - package and manifest requirements.

  • references/partner-center-dom.md - known routes, text, roles, custom elements, selectors, and automation quirks.

  • references/worked-example.md - concrete lessons from a successful full-trust desktop app submission.

  • scripts/partner-center-control.mjs - Playwright controller for a dedicated Edge profile.

  • scripts/inspect-msix.ps1 - unpack and inspect an MSIX before upload.

  • scripts/invoke-wack.ps1 - run WACK, then find, verify, and save its XML and HTML reports.

  • templates/run-full-trust-rationale.md - restricted-capability explanation.

  • templates/certification-notes.md - tester instructions.

  • templates/store-listing.md - listing content worksheet.

  • templates/submission-record.json - durable identity, package, validation, and certification handoff record.

Read the relevant reference before performing that phase. Do not rely on remembered Partner Center labels because Microsoft changes the UI.

End-to-end workflow

1. Establish scope and readiness

Collect or determine:

  • Application name and reserved Store product name.

  • Repository and build command.

  • Application version and intended MSIX version.

  • Supported architectures and minimum Windows version.

  • Whether the app is WinUI, UWP, packaged Win32, Electron, Wails, Tauri, .NET, or another desktop technology.

  • Native executables, helper processes, services, drivers, startup tasks, protocol handlers, file associations, codecs, and restricted capabilities.

  • Privacy policy, support URL, website, licensing, notices, and corresponding source obligations.

  • Real device and network requirements for certification.

  • The Microsoft account the user wants selected during sign-in.

Inspect the repository before proposing package changes. Search for existing manifest templates, package scripts, signing scripts, app icons, version sources, privacy documents, third-party notices, and startup behavior.

2. Reserve the product and capture identity

In Partner Center, reserve an available product name. Avoid trademarked terms in the product name unless the user has a documented right to use them.

After reservation, capture the exact values under:

Product management > Product identity

  • Store product ID

  • Package identity name

  • Publisher ID, usually a CN=... value

  • Publisher display name

  • Package family name

  • Reserved product display name

  • Public Store URL

Never guess these values. The MSIX must use the Partner Center values exactly.

3. Build the Store package

Follow references/msix-checklist.md.

Important defaults:

  • A Microsoft Store submission MSIX should be unsigned. Microsoft signs it after certification.

  • A package distributed outside the Store must be signed with a certificate whose subject exactly matches the manifest publisher.

  • The fourth version component must be 0 before Store submission because it is reserved for Microsoft.

  • The first version component must be nonzero.

  • Package/Properties/DisplayName must exactly match a reserved product name. Matching only the application's visual display name is not sufficient.

Prefer a repeatable build script that:

  1. Validates input versions and identity values.

  2. Builds or receives the production executable.

  3. Stages the manifest, executable, assets, licenses, privacy information, notices, and source links.

  4. Packs with makeappx.exe.

  5. Unpacks the generated MSIX into a verification directory.

  6. Verifies the unpacked executable hash.

  7. Emits a JSON receipt with identity values and SHA-256 hashes.

4. Inspect and test the MSIX

Run:

.\scripts\inspect-msix.ps1 `
  -PackagePath '<path-to-package.msix>' `
  -ExpectedIdentityName '<Partner Center identity name>' `
  -ExpectedPublisher '<Partner Center publisher ID>' `
  -ExpectedDisplayName '<reserved product name>'

The script belongs to this skill directory, not necessarily the application repository. Resolve its full path before invoking it.

Install and exercise the packaged app under real package identity when possible. Test:

  • First launch and upgrade.

  • Startup tasks and persisted settings.

  • Helper process launch.

  • Tray behavior and clean exit.

  • Network discovery and firewall behavior.

  • File and registry access under package identity.

  • Uninstall and data retention behavior.

  • Restricted capability behavior.

5. Run WACK

Run:

# Run this command from an elevated PowerShell terminal.
.\scripts\invoke-wack.ps1 `
  -PackagePath '<path-to-package.msix>' `
  -ReportPath '<artifact-directory>\WACK-report.xml'

The WACK command-line runner requires elevation. The model must not approve the operating-system authentication prompt for the user.

WACK accepts a report path only when it ends in .xml. Any other extension fails with exit code -1 and The report output file path should point to a XML file. Current kits write the XML report to the requested path and an HTML rendering of it to %LOCALAPPDATA%\Microsoft\AppCertKit\<same base name>.htm. One earlier run left only an HTML report in that folder and no XML report.

The script:

  • Always passes WACK an .xml path. A -ReportPath ending in .htm or .html names the saved HTML report, and the XML report is saved beside it with the same base name.

  • Uses the XML report from this run at the requested path, or else the newest WACK report in %LOCALAPPDATA%\Microsoft\AppCertKit. It skips files from earlier runs and the unrelated XML files WACK keeps in that folder, and keeps waiting while the report is still an unfinished interim report.

  • Pairs the HTML report with the XML report by report time, then saves both beside -ReportPath.

  • Reports the XML OVERALL_RESULT the way the HTML report shows it: PASS is PASSED, FAIL is FAILED, WARNING is PASSED WITH WARNINGS, and an interim report is INCOMPLETE. The HTML result is used only when there is no XML report.

  • Fails when the result is not PASSED, not every test ran, the XML and HTML reports disagree, appcert.exe exited with an error, or the report's package identity name or version does not match the package. For a bundle, it warns instead, so check the name and version by hand.

  • Lists every test that did not pass in nonPassingTests, with WACK's messages for it. An HTML-only result leaves this list empty.

When it finds a report, the script prints a JSON summary, then throws if passed is false. Do not continue to submission unless passed is true. PASSED WITH WARNINGS is not PASSED: fix the tests it names and rerun WACK. Read every entry in warnings. Optional test failures do not block Store onboarding, but investigate them.

Record the result in the submission record: overallResult as wack.result, xmlReport as wack.reportPath, kitVersion as wack.kitVersion, and reportTime as wack.testedAt. When resultSource is html, use htmlReport as the report path and copy the kit version and report time from the HTML report's header.

To parse and verify an existing report without running WACK again:

.\scripts\invoke-wack.ps1 `
  -PackagePath '<path-to-package.msix>' `
  -ReportPath '<artifact-directory>\verified-WACK-report.xml' `
  -ExistingReportPath '<existing-WACK-report.xml>'

Pass an .htm report only when no XML report exists. Given an XML report, the script looks for the HTML report with the same base name, beside it or in %LOCALAPPDATA%\Microsoft\AppCertKit, and uses it when the report times match. Given an HTML report, it uses the XML report beside it when the two match.

6. Automate Partner Center carefully

Prefer app-native browser or computer-use tools when they can inspect and act on the page reliably. Use scripts/partner-center-control.mjs as a fallback when Partner Center web components or file uploads are unreliable.

Setup:

Set-Location '<skill-directory>\scripts'
npm install
$env:PARTNER_CENTER_PROFILE = '<dedicated-profile-directory>'
node .\partner-center-control.mjs launch

Run launch as an attached background process. The user completes Microsoft authentication in the dedicated Edge window. In a separate command process, use read-only commands such as:

node .\partner-center-control.mjs status
node .\partner-center-control.mjs pages
node .\partner-center-control.mjs text
node .\partner-center-control.mjs anchors
node .\partner-center-control.mjs overview-state
node .\partner-center-control.mjs agreement-state
node .\partner-center-control.mjs button-state "Submit for certification"

State-changing controller commands require:

$env:PARTNER_CENTER_ALLOW_WRITE = '1'

Set it only after the user has authorized the exact action. Remove it after the action so later commands fail closed.

Read references/partner-center-dom.md before using selectors.

7. Complete every submission section

Read references/submission-playbook.md. Typical sections are:

  • Pricing and availability

  • Properties

  • Age ratings

  • Packages

  • Store listings

  • Submission options

  • Additional Testing Information

After saving each section, reload it and verify persistence. Partner Center can temporarily omit completion states while its APIs are still loading. Wait and reload before deciding a section is incomplete.

Do not make unsupported marketing or accessibility claims. Use genuine app screenshots. Describe network, hardware, account, and protected-content limitations plainly.

For runFullTrust, explain the exact native functionality, helper processes, Windows APIs, startup integration, and why a sandboxed app model is insufficient. State whether the app uses elevation, services, drivers, system-wide settings, or a cloud backend.

8. Final readiness review

Before asking for submission approval, verify:

  • Every Partner Center section says Complete.

  • The package says Validated.

  • invoke-wack.ps1 reported passed: true for the final package: the WACK overall result is PASSED, and the report's identity name and version match the package.

  • Package identity and display name match Partner Center.

  • Package is unsigned for Store submission.

  • Privacy, support, website, license, and notices are reachable.

  • Certification notes are saved and include reproducible test instructions.

  • Restricted capabilities have explanations.

  • Publishing timing is what the user intends.

  • No known blocker is being hidden.

9. Agreement acceptance

If Partner Center displays an updated agreement:

  1. Open the agreements page and identify the exact agreement name and version.

  2. Tell the user it is a binding legal agreement governing the developer account and Store submissions.

  3. Ask for explicit approval to accept that exact version.

  4. Reinspect the page after approval.

  5. Accept only the intended row once.

  6. Verify the status changed from Not Accepted to an acceptance date.

Do not reuse approval from another agreement or earlier action.

10. Submit for certification

When the button is enabled:

  1. State that submission sends the product to Microsoft certification and whether it will publish automatically if approved.

  2. Ask for explicit approval to press Submit for certification.

  3. Reinspect the button after approval.

  4. Click it once.

  5. Do not submit the optional feedback survey without separate approval.

  6. Verify the overview says In certification and shows the certification pipeline.

11. Monitor and respond

Certification commonly completes within a few hours but can take several business days. Monitor:

  • Submission

  • Pre-processing

  • Certification

  • Publishing

If certification fails, quote the finding exactly, map it to the package, listing, policy, or test behavior, make the smallest complete correction, rebuild with a higher package version when required, rerun inspection and WACK, and obtain fresh submission approval.

If the product is approved, verify the public Store URL from an unauthenticated context. Do not claim it is live solely because Partner Center says publishing completed.

Output standard

Report concrete state:

  • Product ID and reserved name.

  • Package path, package version, architecture, signing state, and SHA-256.

  • WACK result and report path.

  • Completed Partner Center sections.

  • Agreement name and acceptance state.

  • Certification pipeline stage.

  • Exact blockers and next action.

Never report a mutation as complete unless the resulting state was read back from Partner Center or the generated artifact was inspected.

For long-running submissions, copy templates/submission-record.json into a session artifact directory and update it after each meaningful state change. Do not commit account identifiers, private URLs, credentials, or browser profile data into the application repository.

Files

references/worked-example.md

Worked example: full-trust desktop receiver

This example records decisions and failures from a successful Microsoft Store submission. It is prior art, not a template to copy without checking the new application.

Product and package

  • Product: Mirror Me Phone Display

  • Store product ID, package identity name, publisher ID, publisher display name, and package family name: copied exactly from Partner Center Product identity. They are specific to one developer account, so they are not repeated here. The publisher ID has the form CN=<GUID>, and the package family name is the identity name, an underscore, and a 13-character publisher hash.

  • Application version: 0.2.4

  • MSIX version: 1.2.4.0

  • Architecture: x64

  • Minimum Windows version: 10.0.22000.0

The application version was below 1.0, but MSIX does not allow a zero first component. The build mapped 0.2.4 to 1.2.4.0. The fourth component remained zero for Store use.

Package model

The application was a Wails and Win32 desktop app with:

  • packagedClassicApp

  • mediumIL

  • runFullTrust

  • A packaged windows.startupTask

  • A same-executable --receiver-worker mode

  • Native DNS-SD, Media Foundation, GDI, and WASAPI integration

  • No elevation

  • No service

  • No driver

  • No system-wide settings

  • No cloud backend

The Store MSIX was intentionally unsigned. Microsoft signs Store packages after certification.

First package rejection

The initial upload used the correct application visual name but retained:

<Properties>
  <DisplayName>MirrorMe</DisplayName>
</Properties>

MirrorMe was not a reserved Store name. Partner Center rejected the package.

The fix was to parameterize every display-name surface and rebuild with:

<Properties>
  <DisplayName>Mirror Me Phone Display</DisplayName>
</Properties>

The application visual display name and StartupTask display name were changed to the same reserved name.

Lesson: validate Package/Properties/DisplayName, not only uap:VisualElements/@DisplayName.

Name and trademark decision

Names containing AirPlay were considered, but Apple naming guidance made a protocol trademark in the product name undesirable without permission.

The reserved name avoided the trademark. Compatibility language appeared in the listing instead:

Compatible with screen mirroring from AirPlay-enabled devices.

The listing also stated:

AirPlay is a trademark of Apple Inc. This app is not affiliated with or endorsed by Apple.

Lesson: use protocol compatibility language in the description when the trademark should not appear in the product name.

Partner Center configuration

Pricing and availability:

  • Free

  • All current and future markets

  • Public and discoverable

  • Publish automatically after certification

Properties:

  • Primary category: Utilities + tools

  • Secondary category: Photo + video

  • Personal information use: Yes

  • Privacy, website, and support URLs supplied

  • Unsupported capability and accessibility claims left disabled

Age rating:

  • App type: All Other App Types

  • Online content: Yes, because the app displays live content from a paired phone

  • Seller-curated mature content: No

  • User communication: No

  • Purchases and rewards: No

  • Precise location sharing: No

  • Browser behavior: No

  • Result: all-ages ratings, including ESRB Everyone and Microsoft 3+

Lesson: displaying external live content can count as online content without making the app a browser, communications service, or mature-content catalog.

Full-trust explanation

The explanation covered:

  • The Wails and native Win32 desktop architecture

  • The same-executable receiver worker

  • DNS-SD discovery

  • Media Foundation, GDI, and WASAPI

  • Packaged startup-task behavior

  • Tray and lifecycle integration

  • No elevation, driver, service, system-wide setting, or cloud backend

Lesson: name the concrete native behavior and explicitly rule out higher-risk system integration that the app does not use.

Store listing

The listing included:

  • Concrete connection steps

  • Same-network requirement

  • Pairing PIN behavior

  • Local privacy behavior

  • Firewall and multicast requirements

  • Protected and DRM content limitations

  • Apple trademark attribution

  • GPL v3-or-later and corresponding-source information

  • Genuine light and dark application screenshots

Two screenshots were resized to a Store-recommended width before upload.

Screenshot upload quirk

Partner Center created a new hidden file input after every screenshot upload. Uploading both screenshots through input index 0 targeted or replaced the first screenshot. The second screenshot had to use the next input index.

Lesson: recount input[type="file"] after every upload and use the newly created input for the next image.

Certification instructions

The testing notes explained:

  • Same-network setup

  • iPhone Control Center and Screen Mirroring connection flow

  • PIN pairing

  • Full-screen and tray behavior

  • Packaged StartupTask behavior

  • Same-executable worker architecture

  • Firewall and multicast requirements

  • Protected-content limitations

  • Trademark and non-affiliation language

No credentials were required.

WACK

The WACK command returned exit code zero, but the requested XML report was not found. The real report was generated as:

%LOCALAPPDATA%\Microsoft\AppCertKit\MirrorMe-WACK-report.htm

The HTML report said:

Overall result: PASSED

Required and optional tests passed.

Lesson: locate and parse the generated report. Do not trust the process exit code by itself.

A later submission of another full-trust desktop app used WACK 10.0.26100.8249:

  • A report path ending in .htm failed with exit code -1 and The report output file path should point to a XML file.

  • A path ending in .xml worked. WACK wrote the XML report to that path and an HTML rendering to %LOCALAPPDATA%\Microsoft\AppCertKit\<same base name>.htm, both before it exited.

  • The XML root element, REPORT, carries OVERALL_RESULT, VERSION (the kit version), APP_NAME (the package identity name, not the display name), APP_VERSION, PARTIAL_RUN, and ReportGenerationTime. The HTML report shows the same report time, which ties the two files together.

  • OVERALL_RESULT is PASS, FAIL, or WARNING. The HTML report shows these as PASSED, FAILED, and PASSED WITH WARNINGS. The original invoke-wack.ps1 read only the first word after Overall result:, so it would have reported PASSED WITH WARNINGS as PASSED.

  • The optional Blocked executables test failed while the overall result was still PASS. WACK flagged a reference to the process-launch API kernel32.dll!CreateProcessW and references to blocked executables such as Cmd, powershell, and REG in the main executable, and bash and reg in a bundled helper executable. The report says optional tests "are informational only and will not be used to evaluate your app during Microsoft Store onboarding."

  • %LOCALAPPDATA%\Microsoft\AppCertKit also held about 30 unrelated XML files, such as logs and a task schedule. Only a file whose root element is REPORT is a WACK report.

Lesson: treat the XML report as the source of truth, match its identity name and version to the package, and fall back to the HTML report only when no XML report exists.

Agreement and final submission

Partner Center required:

  • App Developer Agreement - Windows Store

  • Version 8.11

The exact agreement was presented to the user as a binding legal agreement. After explicit approval, the Windows agreement row was accepted and verified by its acceptance date.

After a reload, every section returned to Complete, the package returned to Validated, and Submit for certification became enabled.

The user was told that approval would publish the product automatically. After fresh explicit approval, the button was pressed once. Partner Center changed to:

In certification
Submission
Pre-processing
Certification
Publishing

An optional feedback survey appeared after submission and was left untouched.

Remaining risks at submission time

  • Broad physical-device and network testing was incomplete.

  • A rare quit hang had not been conclusively eliminated.

  • Legal review of protocol interoperability, trademarks, codec patents, and GPL distribution remained prudent.

  • runFullTrust still required Microsoft's certification approval.

Lesson: passing package validation and WACK does not erase product, interoperability, legal, or restricted-capability risk.

Requirements and compatibility

Written for: GitHub Copilot

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs Node.js

Security

What our scanner noticed· Low risk

  • Scripts that your agent may run

This skill includes scripts that your agent may run. Read them before you use it.

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

First committed by
GitHub avatar of burkehollandburkeholland
Publisher
GitHub (Official)
Distributed by
GitHub
Source
github/awesome-copilot · skills/microsoft-store-publisher · commit 797337f
Licence
MIT License (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced
Contributors
burkeholland

AutoGineer is not affiliated with or endorsed by burkeholland or GitHub.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download microsoft-store-publisher.zip