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://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/partner-center-dom.md

Partner Center DOM and automation reference

Partner Center is a single-page application built with custom web components. Treat the details below as observed patterns, not permanent contracts. Inspect the live DOM before every state-changing action.

Routes

Store developer home
https://storedeveloper.microsoft.com/

Product overview
https://partner.microsoft.com/en-US/dashboard/products/{productId}/overview

Agreements
https://partner.microsoft.com/en-US/dashboard/account/v3/settings/agreements

Submission sections
https://partner.microsoft.com/en-US/dashboard/products/{productId}/submissions/{submissionId}/availability
https://partner.microsoft.com/en-US/dashboard/products/{productId}/submissions/{submissionId}/properties
https://partner.microsoft.com/en-US/dashboard/products/{productId}/submissions/{submissionId}/ageratings
https://partner.microsoft.com/en-US/dashboard/products/{productId}/submissions/{submissionId}/packages
https://partner.microsoft.com/en-US/dashboard/products/{productId}/submissions/{submissionId}/managelanguages?producttype=app
https://partner.microsoft.com/en-US/dashboard/products/{productId}/submissions/{submissionId}/options

Additional testing information (product level, not under a submission)
https://partner.microsoft.com/en-US/dashboard/products/{productId}/suppinfo/additionaltestinginfo

Discover the current submissionId from overview-page anchors rather than guessing it.

Product overview

Observed card anchors use accessible labels similar to:

Pricing and availability Status: - Complete
Properties Status: - Complete
Age ratings Status: - Complete
Packages Status: - Complete
Store listings Status: - Complete
Submission Options

Use anchors to capture their current href values.

The final control is normally discoverable as:

page.getByRole("button", {
  name: "Submit for certification",
  exact: true
})

Always read disabled immediately before asking for approval and again after approval.

Successful submission changes overview text to:

In certification
Certification status
Submission
Pre-processing
Certification
Publishing

Each of the four steps is an he-subway-stop element. The current step has the current attribute. This lists the steps and marks the current one:

[...document.querySelectorAll("he-subway-stop")].map(
  (stop) =>
    stop.innerText.trim() + (stop.hasAttribute("current") ? " (current)" : ""),
);

After submission, the section-card labels can change from Complete to Read only. The package filename and Validated text may no longer appear on the overview. This is expected while the submitted revision is locked. Do not interpret the absence of Validated as a package regression after the product is already In certification.

An optional feedback dialog can appear immediately after submission. Do not select a rating or press its Submit button without separate approval.

While the product is in certification, the overview also offers Cancel certification. Never click it without approval for that exact action.

Agreements

Current agreement rows have been observed inside:

<accexp_he-data-grid>

The acceptance control has been observed as:

<accexp_he-button
  appearance="link"
  testid="agreement-accept-now-button"
  type="button">
  Accept
</accexp_he-button>

Useful locator:

page.getByText("Accept", { exact: true })

Multiple Accept controls can exist, including agreements for different programs. Inspect the grid order and the row context. Do not click solely by text when more than one match exists.

After acceptance, the row may update immediately without a confirmation dialog. Verify:

  • Not Accepted disappeared for the intended row.

  • The agreement version remains visible.

  • An acceptance date is shown.

Age ratings

Once a questionnaire draft exists, the ageratings route redirects to ageratings/summary. That page shows the rating preview and an he-checkbox that agrees to the IARC Terms of Use and states that the user is of the age of majority. Ticking it accepts a binding agreement, so get approval first.

Observed behavior of that checkbox:

  • Its real input is in shadow DOM with an empty label. getByLabel times out, and clicking the inner input did not tick it.

  • Its label contains a link to the IARC terms, so clicking the label text can open the link instead of ticking the box.

  • Clicking the he-checkbox host element 8 pixels in from its left edge and no more than 12 pixels down from its top, where the box is drawn, ticked it.

Save is an he-button that stays disabled until the box is ticked. After a successful save, the heading changes from Age ratings preview to Age ratings, and Current Rating ID shows Pending until certification.

Pricing

Until a base price is saved, the Pricing and availability page warns:

No PriceSchedule created for purchasable product. You must configure a price for this product.

The base price uses two he-select elements:

  • he-select[label="Currency"] lists markets with their currency, such as USD - United States (value US). Its roughly 240 options load only after the list opens.

  • he-select[label="Retail price"] stays disabled until a currency is chosen. It then lists price tiers: 0, 0.99, and so on. There is no Free option. Tier 0 makes the product free.

Each he-select keeps an input[role="combobox"] in shadow DOM, so the controller's comboboxes command lists them. Their indexes depend on the page, so list them again right before using an index. To pick an option, search only inside the intended he-select, for example:

page
  .locator('he-select[label="Retail price"]')
  .getByRole("option", { name: "0", exact: true });

Save is input[type="submit"][value="Save draft"]. A successful save redirects to the product overview. Reopen the page to verify the price and markets. Changing pricing needs approval for that exact change.

Saving sections

  • Properties, Packages, and Submission options: click-role button Save saves and redirects to the product overview.

  • Pricing and availability: Save draft, as described above.

  • Additional testing information: the certification notes field is textarea#certificationNotesDescription (6000-character limit). Its save control is a link, <a aria-label="Save description">, so click-role button Save does not find it. Use click-text-ancestor "Save description".

After every save, reopen the section and verify that the values persisted.

Inputs and web components

Partner Center uses standard inputs mixed with custom elements such as:

he-button
he-checkbox
he-select
he-subway-stop
accexp_he-button
accexp_he-data-grid

Playwright role, label, and exact-text locators generally work across these components. When they do not, inspect:

  • tagName

  • role

  • aria-label

  • aria-labelledby

  • href

  • disabled

  • testid

  • ancestor text

  • outerHTML

Avoid brittle generated CSS class names.

Observed input quirks:

  • he-checkbox keeps its real input in shadow DOM with an empty label, so getByLabel and the controller's check-label and uncheck-label time out. click-text with the exact label text toggles most of them. The age-ratings terms box is an exception, described under Age ratings.

  • A span inside radio labels intercepts pointer events, so Playwright's check() can fail. Clicking the label works.

  • Exact-text matching must include curly apostrophes (U+2019) where Partner Center uses them.

File uploads

Package and screenshot uploads use hidden:

input[type="file"]

Observed screenshot behavior:

  1. Uploading a screenshot creates another hidden file input.

  2. Reusing input index 0 may replace the first screenshot.

  3. Upload each additional screenshot through the next file-input index.

  4. After every upload, wait for processing and count inputs again.

  5. Verify every intended screenshot is visible before saving.

Use genuine app screenshots. Resize them outside Partner Center when required.

Loading and stale state

Partner Center can temporarily show:

  • Section labels without Complete.

  • Package cards without the package filename.

  • A disabled submission button after agreement acceptance.

  • Only navigation chrome after reload.

Do not edit immediately. Wait, reload, and reread the page. A successful pattern is:

  1. Navigate directly to the product overview.

  2. Wait 8 to 15 seconds.

  3. Read body text.

  4. Reload once if section state is missing.

  5. Wait again and verify.

Authentication redirects

Partner Center can redirect an authenticated product page to Microsoft's account picker when a session expires. Before reading product or agreement state, verify the current URL still belongs to partner.microsoft.com.

If the user previously specified the exact account to use, select only that account. Never enter or retrieve credentials. Stop for user action if Microsoft requests a password, passkey, MFA, CAPTCHA, or operating-system authentication. After sign-in, navigate directly back to the intended product or agreement URL and reread the page.

Multiple tabs

Multiple Partner Center tabs can cause automation to target the wrong page. The supplied controller:

  • Lists all pages with pages.

  • Prefers the most recently opened Partner Center page.

  • Accepts PARTNER_CENTER_PAGE_INDEX to select an exact page.

Check status before every state-changing command.

Safe inspection commands

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 inputs
node .\partner-center-control.mjs radios
node .\partner-center-control.mjs comboboxes
node .\partner-center-control.mjs find-text "Accept"
node .\partner-center-control.mjs match-context "Accept"
node .\partner-center-control.mjs button-state "Submit for certification"

combo-options <index> is listed as read-only in the controller's help, but it clicks the combobox to open its list. It does not choose an option or save, but it does change the page. Run comboboxes first to confirm the index, and run reload afterward if the open list gets in the way.

State-changing commands

The controller rejects these unless PARTNER_CENTER_ALLOW_WRITE=1:

  • click-role

  • click-text

  • click-text-index

  • click-text-ancestor

  • fill-label

  • fill-selector

  • check-label

  • uncheck-label

  • check-name (types a product name and clicks Check availability)

  • select-combo

  • add-combo-token

  • upload-file

  • upload-file-index

The environment variable is a technical guard, not user approval. Obtain approval first when required, set it for the single action, perform the action, then clear it.

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