add-data-source
Guide the user to add a data source, connection, or API connector to a Canvas App via Power Apps Studio, then verify and…
Deploys an existing Power Pages site to a Power Pages environment using PAC CLI. Routes SPA sites to the existing build and upload-code-site workflow, and PAC-downloaded non-SPA (classic) sites to an isolated upload workflow with explicit data-model and website-identity checks.
Claude Code
$ npx -y skills add microsoft/power-platform-skills --skill deploy-site --agent claude-code
Codex
$ npx skills add microsoft/power-platform-skills --skill deploy-site -a codex -y
Cursor
$ npx skills add microsoft/power-platform-skills --skill deploy-site -a cursor -y
Gemini CLI
$ npx skills add microsoft/power-platform-skills --skill deploy-site -a gemini-cli -y
GitHub Copilot
$ npx skills add microsoft/power-platform-skills --skill deploy-site -a github-copilot -y
OpenCode
$ npx skills add microsoft/power-platform-skills --skill deploy-site -a opencode -y
Windsurf
$ npx skills add microsoft/power-platform-skills --skill deploy-site -a windsurf -y
name: deploy-site description: >- Deploys an existing Power Pages site to a Power Pages environment using PAC CLI. Routes SPA sites to the existing build and upload-code-site workflow, and PAC-downloaded non-SPA (classic) sites to an isolated upload workflow with explicit data-model and website-identity checks. Handles tooling verification, authentication, environment confirmation, upload approval, and verification. Use when the user wants to deploy, upload, publish, or push either site type. user-invocable: true allowed-tools: Read, Bash, AskUserQuestion, Glob, Grep, TaskCreate, TaskUpdate, TaskList model: sonnet
> **Plugin check**: Run `node "${PLUGIN_ROOT}/scripts/check-version.js"` — if it outputs a message, show it to the user before proceeding.
Route to the correct deployment workflow before running SPA build, attachment, or activation logic.
**Initial request:** $ARGUMENTS
---
Classify explicit request signals first:
or `website.yml` → **Non-SPA site**
When the request is not explicit, search the current workspace for:
`.powerpages-site/`.
Exclude dependency, build-output, temporary, generated-output, and version-control directories. Use request paths and the current directory to resolve one project. Never choose the first result arbitrarily.
<!-- gate: deploy-site:0.project-type | category=plan | cancel-leaves=nothing -->
> 🚦 **Gate (plan · deploy-site:0.project-type):** Select the exact project when SPA and > non-SPA sites, or multiple valid roots, remain possible. > > **Trigger:** Project type or root is ambiguous after discovery. > **Why:** The two site types require incompatible PAC upload commands. > **Cancel leaves:** Nothing; no build or upload has started.
If ambiguous, use `AskUserQuestion` to select the exact project root and detected type.
`${PLUGIN_ROOT}/skills/deploy-site/workflows/non-spa-site.md`. Do not continue into the SPA phases below.
The authoritative markers and prompts live in `workflows/non-spa-site.md`. Gate `deploy-site:non-spa-4.permissions-audit` handles permission-sensitive changes before upload. Gate `deploy-site:non-spa-5.upload` approves the exact root, environment, website identity, model, and local change summary immediately before upload.
The following phases retain the existing SPA behavior.
---
**Goal**: Ensure PAC CLI is installed and available on the system PATH
**Actions**:
1. Create todo list with all 6 phases (see [Progress Tracking](#progress-tracking) table) 2. Run `pac help` to check if the PAC CLI is installed and available on the system PATH.
pac help
3. **If the command succeeds**: PAC CLI is installed. Proceed to Phase 2.
4. **If the command fails** (command not found / not recognized):
1. Inform the user that PAC CLI is required but not installed. 2. Fetch installation instructions from `https://aka.ms/PowerPlatformCLI` using the following approach:
dotnet tool install --global Microsoft.PowerApps.CLI.Tool
3. After installation, verify by running `pac help` again. 4. If it still fails, stop and ask the user to resolve the installation manually.
**Output**: PAC CLI installed and verified
---
**Goal**: Ensure the user is authenticated with PAC CLI and has a valid session
**Actions**:
1. Run `pac auth who` to check the current authentication status.
pac auth who
2. **If authenticated**: Extract the following values from the output:
Proceed to Phase 3.
3. **If not authenticated**:
1. Inform the user they are not authenticated with PAC CLI.
<!-- not-a-gate: free-text env URL fallback when PAC CLI auth is missing — data-gathering, no destructive action -->
2. Use `AskUserQuestion` to ask for the environment URL:
| Question | Header | Options | |----------|--------|---------| | You are not authenticated with PAC CLI. Please provide your Power Pages environment URL (e.g., `https://org12345.crm.dynamics.com`) so I can authenticate you. | Auth | *(free text input via "Other")* |
Provide two placeholder options to guide the user:
3. Once the user provides the
Plugins from Microsoft that teach AI assistants, such as GitHub Copilot and Claude Code, to build on Power Platform.
Guide the user to add a data source, connection, or API connector to a Canvas App via Power Apps Studio, then verify and…
Creates or edits a Power Apps Canvas App through the Canvas Authoring MCP coauthoring session. Handles staged experience design,…
Configure the Canvas Authoring MCP server for the current coauthoring session. Use before starting to edit a canvas app with the…
Use this skill when the user wants to "report a bug", "file an issue", "report an issue", "submit a bug report", or report any…
Adds Azure DevOps connector to a Power Apps code app. Use when querying work items, creating bugs, managing pipelines, or making…
Adds any Power Platform connector to a Power Apps code app. Generic fallback for connectors not covered by a specific skill.
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.