[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M69BVYVZ0YYRMDY1WPVJ98VV":3,"skill-same:01M69BVYVZ0YYRMDY1WPVJ98VV":61},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":31,"linkOnly":32,"markdownContent":33,"markdownBody":34,"frontMatter":35,"refName":37,"commitSha":38,"skillDirectory":39,"forksCount":40,"repositoryHtmlUrl":41,"repositoryHomepageUrl":42,"ownerHtmlUrl":43,"ownerBlogUrl":44,"ownerDescription":45,"updatedAt":46,"install":47,"resources":60},"01M69BVYVZ0YYRMDY1WPVJ98VV","share",null,"Shares (or unshares) a Microsoft App with users via `ms app share` \u002F `ms app unshare`. Use when updating app access control.","microsoft\u002Fmanaged-apps","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M69BTSR13CCGCPK40C03N7CN",36,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmanaged-apps\u002Fblob\u002Fmain\u002Fplugins\u002Fmicrosoft-managed-apps\u002Fskills\u002Fshare\u002FSKILL.md",[],[5,9,19,20,21,22,23,24,25,26,27,28,29,30],"Bash","access","grep","read","use","ms","Access Control","control","app","via","users","with","2026-11-10 10:12:30",false,"---\nname: share\ndescription: Shares (or unshares) a Microsoft App with users via `ms app share` \u002F `ms app unshare`. Use when updating app access control.\nallowed-tools: Read Grep Glob Bash AskUserQuestion\n---\n\n**? Shared Instructions: [shared-instructions.md](..\u002F..\u002Fshared\u002Fshared-instructions.md)** — Cross-cutting concerns. **Always confirm before share\u002Funshare.**\n\n# Share \u002F Unshare\n\nAdds or removes user access to the app in the current directory. The CLI resolves emails via Microsoft Graph; entries that don't resolve are returned as warnings (the RP call still succeeds for the resolved entries).\n\n## Workflow\n\n1. Memory Bank → 2. Verify Project + Env → 3. Mode (share \u002F unshare) → 4. Collect Emails → 5. Confirm → 6. Run → 7. Surface Partial-Success Envelope\n\n---\n\n### Step 1: Check Memory Bank\n\nRead `memory-bank.md` for app slug, GUID, and environment.\n\n### Step 2: Verify Project + Env\n\n```bash\ntest -f ms.config.json || { echo \"Not in a Microsoft App workspace.\"; exit 1; }\nBIN=ms\n$BIN auth status                                         # must report the expected UPN\n```\n\n### Step 3: Mode\n\nAsk whether the user wants to **share** (add access) or **unshare** (remove access). Default to share unless the prompt obviously indicates removal.\n\n### Step 4: Collect Emails\n\nAccept a comma-separated email list. Validate basic shape (`user@domain`) before passing through; don't try to resolve them yourself — `ms` handles Graph resolution and will return warnings for unresolved entries.\n\nIf the user passes Object GUIDs (already-resolved principals), pass them through as-is — the CLI accepts both forms.\n\n### Step 5: Confirm\n\nShow the user exactly what will run, then ask for confirmation:\n\n> \"About to **share** `\u003Capp-name>` with: `alice@contoso.com, bob@contoso.com`. Confirm?\"\n\nWait for explicit yes. Never auto-proceed — ACL changes affect production users.\n\n### Step 6: Run\n\n**Share:**\n\n```bash\n$BIN app share \"alice@contoso.com,bob@contoso.com\"\n```\n\n**Unshare:**\n\n```bash\n$BIN app unshare \"alice@contoso.com,bob@contoso.com\"\n```\n\nThe command reads the app ID from `ms.config.json`.\n\n### Step 7: Surface Partial-Success Envelope\n\nThe CLI returns a JSON envelope with `partialFailure: boolean` and `warnings: []`. When `partialFailure: true`:\n\n- The RP call succeeded — share state is updated for resolved users.\n- Warnings list the unresolved entries (typo'd email, account doesn't exist in the tenant, Graph couldn't find them, etc.).\n\nPrint warnings verbatim and ask the user whether to re-run with corrected entries:\n\n```\nShare completed with warnings:\n  - 'bob@contso.com' could not be resolved (Graph returned 404).\n  - 'charlie@partner.com' is not a member of this tenant.\n\nShare state updated for: alice@contoso.com (1 of 3 resolved).\n\nWould you like to retry the 2 unresolved entries with corrections?\n```\n\nIf the user confirms, loop back to Step 4 with the corrected list. Don't retry automatically — typos and tenant-membership issues need human resolution.\n\n---\n\n## Edge Cases\n\n| Situation                                                       | Action                                                                                                         |\n| --------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |\n| User passes a single email                                       | Run as-is; the envelope still applies (just with one entry).                                                   |\n| User passes a mix of emails and Object GUIDs                     | Pass through as one comma-separated list — the CLI accepts both.                                               |\n| `ms app share` returns non-zero (not a partial-failure envelope) | A hard error (auth, env, app-not-found). Surface verbatim and STOP. Do not retry.                              |\n| User says \"share with everyone\"                                  | Decline — there is no \"everyone\" semantic. Ask for an explicit list.                                            |\n","**? Shared Instructions: [shared-instructions.md](..\u002F..\u002Fshared\u002Fshared-instructions.md)** — Cross-cutting concerns. **Always confirm before share\u002Funshare.**\n\n# Share \u002F Unshare\n\nAdds or removes user access to the app in the current directory. The CLI resolves emails via Microsoft Graph; entries that don't resolve are returned as warnings (the RP call still succeeds for the resolved entries).\n\n## Workflow\n\n1. Memory Bank → 2. Verify Project + Env → 3. Mode (share \u002F unshare) → 4. Collect Emails → 5. Confirm → 6. Run → 7. Surface Partial-Success Envelope\n\n---\n\n### Step 1: Check Memory Bank\n\nRead `memory-bank.md` for app slug, GUID, and environment.\n\n### Step 2: Verify Project + Env\n\n```bash\ntest -f ms.config.json || { echo \"Not in a Microsoft App workspace.\"; exit 1; }\nBIN=ms\n$BIN auth status                                         # must report the expected UPN\n```\n\n### Step 3: Mode\n\nAsk whether the user wants to **share** (add access) or **unshare** (remove access). Default to share unless the prompt obviously indicates removal.\n\n### Step 4: Collect Emails\n\nAccept a comma-separated email list. Validate basic shape (`user@domain`) before passing through; don't try to resolve them yourself — `ms` handles Graph resolution and will return warnings for unresolved entries.\n\nIf the user passes Object GUIDs (already-resolved principals), pass them through as-is — the CLI accepts both forms.\n\n### Step 5: Confirm\n\nShow the user exactly what will run, then ask for confirmation:\n\n> \"About to **share** `\u003Capp-name>` with: `alice@contoso.com, bob@contoso.com`. Confirm?\"\n\nWait for explicit yes. Never auto-proceed — ACL changes affect production users.\n\n### Step 6: Run\n\n**Share:**\n\n```bash\n$BIN app share \"alice@contoso.com,bob@contoso.com\"\n```\n\n**Unshare:**\n\n```bash\n$BIN app unshare \"alice@contoso.com,bob@contoso.com\"\n```\n\nThe command reads the app ID from `ms.config.json`.\n\n### Step 7: Surface Partial-Success Envelope\n\nThe CLI returns a JSON envelope with `partialFailure: boolean` and `warnings: []`. When `partialFailure: true`:\n\n- The RP call succeeded — share state is updated for resolved users.\n- Warnings list the unresolved entries (typo'd email, account doesn't exist in the tenant, Graph couldn't find them, etc.).\n\nPrint warnings verbatim and ask the user whether to re-run with corrected entries:\n\n```\nShare completed with warnings:\n  - 'bob@contso.com' could not be resolved (Graph returned 404).\n  - 'charlie@partner.com' is not a member of this tenant.\n\nShare state updated for: alice@contoso.com (1 of 3 resolved).\n\nWould you like to retry the 2 unresolved entries with corrections?\n```\n\nIf the user confirms, loop back to Step 4 with the corrected list. Don't retry automatically — typos and tenant-membership issues need human resolution.\n\n---\n\n## Edge Cases\n\n| Situation                                                       | Action                                                                                                         |\n| --------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |\n| User passes a single email                                       | Run as-is; the envelope still applies (just with one entry).                                                   |\n| User passes a mix of emails and Object GUIDs                     | Pass through as one comma-separated list — the CLI accepts both.                                               |\n| `ms app share` returns non-zero (not a partial-failure envelope) | A hard error (auth, env, app-not-found). Surface verbatim and STOP. Do not retry.                              |\n| User says \"share with everyone\"                                  | Decline — there is no \"everyone\" semantic. Ask for an explicit list.                                            |\n",{"name":5,"description":7,"allowed-tools":36},"Read Grep Glob Bash AskUserQuestion","main","5e4bd47de38c9ae0327efb7c0003d250afff31b6","plugins\u002Fmicrosoft-managed-apps\u002Fskills\u002Fshare",12,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmanaged-apps","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FCopilot-Managed-Runtime","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-06 04:02:23",{"source":8,"skillName":5,"commands":48,"prompt":58,"zipAvailable":59},[49,52,55],{"tool":50,"command":51},"npx","npx skills add microsoft\u002Fmanaged-apps --skill share",{"tool":53,"command":54},"bunx","bunx skills add microsoft\u002Fmanaged-apps --skill share",{"tool":56,"command":57},"pnpm","pnpm dlx skills add microsoft\u002Fmanaged-apps --skill share","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmanaged-apps\u002Fblob\u002Fmain\u002Fplugins\u002Fmicrosoft-managed-apps\u002Fskills\u002Fshare\u002FSKILL.md",true,[],[62,84,101,118,134,145],{"skillNo":63,"name":64,"nameZh":6,"description":65,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":68,"publishedAt":31},"01M69BW0D2HDW3YFJJX4QEYJF2","state","Store and query a Microsoft Managed App's built-in state and file attachments with `ms project state` CLI schema commands and generated TypeScript clients. First, with the user signed in to the CLI, run `ms feature status --name state --json`; if `feature.enabled` is not `true`, recommend an alternative connector or data source.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmanaged-apps\u002Fblob\u002Fmain\u002Fplugins\u002Fmicrosoft-managed-apps\u002Fskills\u002Fstate\u002FSKILL.md",[],[64,69,70,71,72,27,24,73,74,75,19,76,22,77,78,79,80,81,82,83],"status","cli","run","typescript","project","generated","query","Connector","write","edit","recommend","commands","data","source","feature",{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":31},"01M69BVX6TTS1A17ZA2BDP13KP","share-link","Manages tenant-wide share links for a Microsoft App via `ms app share link create`, `ms app share link list`, and `ms app share link revoke`. Use when you want to distribute app access via a URL instead of named principals.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmanaged-apps\u002Fblob\u002Fmain\u002Fplugins\u002Fmicrosoft-managed-apps\u002Fskills\u002Fshare-link\u002FSKILL.md",[],[91,5,92,93,9,27,94,24,95,23,20,96,97,19,28,98,22,21,99,100],"share link","link","create","links","for","URL","you","distribute","wide","list",{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":107,"publishedAt":31},"01M69BVVFK3WFDMJW2R5CYCRD4","play","Opens a Microsoft App in the browser via `ms app play`. Use when opening the live deployed version or a cloud-hosted preview (main branch or specific commit SHA) without starting a local dev server.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmanaged-apps\u002Fblob\u002Fmain\u002Fplugins\u002Fmicrosoft-managed-apps\u002Fskills\u002Fplay\u002FSKILL.md",[],[103,108,109,9,110,27,111,24,112,37,23,113,19,114,115,116,117,28,22,21],"dev","commit","local dev","branch","local","version","preview","local dev server","browser","server",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":124,"publishedAt":31},"01M69BVSSESTPDA4Z5WP8WEN01","list-connectors","Lists connectors available in the active environment — including whether each is allowed or blocked by your organization's policy — plus the connection-bound data sources already wired into a Microsoft App. Use when discovering connectors and their operations before adding data sources.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmanaged-apps\u002Fblob\u002Fmain\u002Fplugins\u002Fmicrosoft-managed-apps\u002Fskills\u002Flist-connectors\u002FSKILL.md",[],[125,126,100,9,127,27,128,129,23,19,130,131,132,22,81,133],"list connectors","connectors","policy","sources","environment","organization","operations","active","connection",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":140,"publishedAt":31},"01M69BVRDCYENNS8XXM1E5RBYQ","list-apps","Discovers managed apps in the active environment via `ms app list --json` and optional `ms app show --json`. Use when listing or locating apps.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmanaged-apps\u002Fblob\u002Fmain\u002Fplugins\u002Fmicrosoft-managed-apps\u002Fskills\u002Flist-apps\u002FSKILL.md",[],[141,142,100,27,143,24,129,23,19,28,132,144,22,21],"list apps","apps","show","json",{"skillNo":146,"name":108,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":150,"publishedAt":31},"01M69BVPVP9SPEY44ZG7PBDPQF","Runs a Microsoft App locally with hot reload via `ms app dev`. Use when starting or restarting local development and surfacing the App Player URL.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fmanaged-apps\u002Fblob\u002Fmain\u002Fplugins\u002Fmicrosoft-managed-apps\u002Fskills\u002Fdev\u002FSKILL.md",[],[108,151,9,27,24,152,153,112,23,96,19,30,28,22,21],"development","local development","player"]