setup-pipeline
Sets up a Power Platform Pipeline for automated Power Pages deployments. Power Platform Pipelines is Microsoft's native CI/CD tool built into the Power Platform — no external infrastructure required
Install / Use
npx skills add microsoft/power-platform-skills --skill setup-pipelineInstalls into whichever agent you are using.
SKILL.md
Installable skill definition
Quality Score
Category
AutomationSupported Platforms
Our assessment of setup-pipeline
setup-pipeline scores 85/100 on our quality scale, 1961st of 2,892 Automation skills we index.
Its SKILL.md is 42 KB long, well organised into 19 sections with 15 code examples: long enough that it reads more like full documentation than a focused instruction file, which agents can find harder to follow.
It has 919 GitHub stars, a meaningful sign that others use it.
Maintenance, license and trust
- The repository was last updated 12 days ago, so setup-pipeline is actively maintained.
- It is released under the MIT license, a permissive license that allows use, modification and commercial use with attribution.
- Its trust signals score 100/100, with no cautions. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
setup-pipeline compared with similar skills
All 4 of these similar skills score higher than setup-pipeline; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| setup-pipeline (this skill)by microsoft | 85 | 919 | 12d ago | SKILL.md |
| Agent-Reachby Panniantong | 100 | 92.4k | 21d ago | CLAUDE.md |
| Scraplingby D4Vinci | 100 | 85.9k | today | MCP Server |
| rufloby ruvnet | 100 | 74.0k | today | MCP Server |
| algorithmic-artby anthropics | 100 | 177.9k | 14d ago | SKILL.md |
Frequently asked questions
- How do I install setup-pipeline?
- Run
npx skills add microsoft/power-platform-skills --skill setup-pipeline. The install tabs above show the steps for each supported agent. - Which AI agents does setup-pipeline work with?
- It is written for Universal, as a SKILL.md file. Other agents that read the same format can often use it too.
- Is setup-pipeline safe to use?
- It is MIT-licensed and scores 100/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is setup-pipeline still maintained?
- The repository was last updated 12 days ago, so setup-pipeline is actively maintained.
Skill content
View source on GitHubname: setup-pipeline description: >- Sets up a Power Platform Pipeline for automated Power Pages deployments. Power Platform Pipelines is Microsoft's native CI/CD tool built into the Power Platform — no external infrastructure required. Use when asked to: "set up ci/cd", "create pipeline", "setup pipeline", "set up power platform pipelines", "create power pipelines", "automate deployments", "set up automated deployment", "create deployment pipeline", "use power pipelines". Also handles: "set up github actions" or "set up azure devops pipeline" (shows coming-soon guidance for those platforms). user-invocable: true argument-hint: "Optional: 'power-platform', 'github', or 'ado' to skip platform selection" allowed-tools: Read, Write, Edit, Bash, Glob, Grep, TaskCreate, TaskUpdate, TaskList, AskUserQuestion, mcp__plugin_power-pages_microsoft-learn__microsoft_docs_search, mcp__plugin_power-pages_microsoft-learn__microsoft_docs_fetch model: opus
Plugin check: Run
node "${PLUGIN_ROOT}/scripts/check-version.js"— if it outputs a message, show it to the user before proceeding.
setup-pipeline
Sets up a Power Platform Pipeline for automated Power Pages solution deployments. Creates the pipeline configuration directly in Dataverse using the PP Pipelines OData API — no YAML files, no external CI/CD infrastructure needed.
GitHub Actions and Azure DevOps Pipeline options are shown in the platform menu as coming soon.
Refer to
${PLUGIN_ROOT}/references/cicd-pipeline-patterns.mdfor all HAR-confirmed API patterns used in this skill.
Prerequisites
powerpages.config.jsonexists in the project root.solution-manifest.jsonexists (solution must be created first viasetup-solution)- Azure CLI logged in (
az account showsucceeds) - PAC CLI logged in (
pac env whosucceeds) - A Power Platform environment with Pipelines package installed (the "host" environment)
Phases
Phase 0 — ALM plan gate
plan-almis the front door. When the user expresses an ALM intent (promote / ship / deploy / set up CI-CD / move to staging / push to prod), the orchestrator (/power-pages:plan-alm) should run first. This Phase 0 enforces that and is meant to fail closed when there's no plan, not to be a one-time check the user can dismiss forever.
Skip rule. If this skill was invoked as part of an active plan-alm orchestration, skip Phase 0 entirely and proceed to Phase 1. The gate helper exposes this via its inExecution block — pass through silently to Phase 1 when:
inExecution.status === "active"
The helper computes this from docs/.alm-plan-data.json — PLAN_STATUS === "In Execution" AND LAST_INVOCATION_AT within the last 60 minutes. check-alm-plan.js refreshes LAST_INVOCATION_AT automatically on every invocation that finds the plan in execution, so each in-chain skill keeps the chain alive for the next one — even multi-hour deploys (deploy-pipeline alone can take 60 min per stage) survive the window without the chain incorrectly de-classifying. Stalled chains (no heartbeat for > 60 min) reclassify as stale-heartbeat and Phase 0 gates fire normally so an abandoned plan doesn't silently bypass user confirmation.
When inExecution.status is anything other than "active" ("not-running", "stale-heartbeat", "no-plan"), run the Phase 0 gate flow below. Branch on the remaining helper fields:
Step 1 — Run the gate helper.
node "${PLUGIN_ROOT}/scripts/lib/check-alm-plan.js" \
--projectRoot "." \
--envUrl "{devEnvUrl}" \
--token "{token}" \
--solutionId "{solutionId from .solution-manifest.json, if available}"
The helper returns JSON with { exists, stale, staleness: { reason, detail }, generatedAt, planStatus, ... }. The freshness check requires env credentials + solutionId; without those the helper does an existence-only check.
Step 2 — Branch on the result.
| Result | Behavior |
|---|---|
| deferred: true | The user has explicitly deferred ALM for this project (.alm-deferred marker present). Pass through silently to Phase 1 — do not nag. |
| exists: false | The user hasn't run plan-alm yet. See Step 3. |
| exists: true, stale: false | Plan is current. Pass through silently to Phase 1. |
| exists: true, stale: true (reason: solution-modified) | The solution changed after the plan was generated. See Step 4. |
Step 3 — No plan. Tell the user:
<!-- gate: setup-pipeline:0.no-plan | category=intent | cancel-leaves=nothing -->"No ALM plan exists for this project.
/power-pages:plan-almbuilds one — it detects the project state, asks about your promotion strategy (PP Pipelines vs Manual export/import), and orchestrates the right skills (including this one) in the right order. Want me to run plan-alm now?"
🚦 Gate (intent · setup-pipeline:0.no-plan): Fail-closed entry gate when
check-alm-plan.jsreturnsexists:false. Helper-script-backed.
AskUserQuestion:
| Question | Header | Options |
|---|---|---|
| Run /power-pages:plan-alm first? | ALM plan gate | Yes — run /power-pages:plan-alm now (Recommended), Continue without a plan (advanced — I know what I'm doing), Cancel |
- Yes (Recommended) → invoke
/power-pages:plan-alm. It builds the plan and returns —plan-almis a planner and does not deploy. This skill then re-runs the Phase 0 check (nowexists:true) and proceeds to Phase 1. - Continue without a plan → set
BYPASSED_PLAN_GATE = trueand proceed to Phase 1. - Cancel → exit cleanly.
Step 4 — Stale plan. Tell the user:
<!-- gate: setup-pipeline:0.stale-plan | category=intent | cancel-leaves=nothing -->"ALM plan exists from
{generatedAt}but the source solution has been modified since (at{solution.modifiedon}). Components may have changed. Re-runningplan-almwill refresh the analysis and the rendered HTML."
🚦 Gate (intent · setup-pipeline:0.stale-plan): Fail-closed entry gate when
check-alm-plan.jsreturnsstale:true. Helper-script-backed.
AskUserQuestion:
| Question | Header | Options | |---|---|---| | Refresh the plan first? | ALM plan freshness | Refresh — re-run /power-pages:plan-alm (Recommended), Continue with the existing plan, Cancel |
- Refresh (Recommended) → invoke
/power-pages:plan-alm. After completion, re-run the Phase 0 helper once to confirm freshness; if still stale, surface the detail and proceed to Phase 1 anyway (don't infinite-loop). - Continue → set
STALE_PLAN_ACK = trueand proceed to Phase 1. - Cancel → exit cleanly.
Why this gate exists. Direct invocation of this skill bypasses the orchestrator's pre-deploy completeness check, host-resolution decision, deployment-strategy selection, and rendered HTML plan. Users who run setup-pipeline directly often miss components that should have been added to the solution, miss the asset advisory for large web files, or build a pipeline against the wrong host environment. The gate ensures plan-alm either ran (so all of those decisions are surfaced and recorded) or the user explicitly chose to bypass it.
Phase 1 — Detect Project Context
Create all tasks upfront at the start of this phase.
Tasks to create:
- "Detect project context"
- "Select CI/CD platform"
- "Confirm pipeline configuration"
- "Run preflight checks"
- "Create deployment environments"
- "Create pipeline and stages"
- "Verify and write artifacts"
Steps:
-
Read project context using
detect-project-context.js:node "${PLUGIN_ROOT}/scripts/lib/detect-project-context.js"Capture output as JSON; extract
.siteName(store assiteName),.websiteRecordId,.environmentUrl(store asdevEnvUrl), and.solutionManifest(store assolutionManifest).devEnvUrlisnullfor declarative / data-model (EDM) sites —detect-project-context.jsreads the env URL only frompowerpages.config.json, which those sites don't have. Do not treat a nulldevEnvUrlas an error here; Step 2 resolves the authoritative dev env URL frompac env who. IfsiteNameis absent, stop and advise running/power-pages:create-sitefirst — a downloaded/deployed site (code or declarative) always resolves asiteName(frompowerpages.config.jsonor.powerpages-site/website.yml), so a missingsiteNamemeans there is no site checked out here, not merely "nopowerpages.config.json". IfsolutionManifestis null (no.solution-manifest.json), stop and advise running/power-pages:setup-solutionfirst.Manifest version check:
- If
solutionManifest.schemaVersion === 2(multi-solution layout), setMULTI_SOLUTION_MODE = trueand storesolutionManifest.solutions[]asSOLUTIONS_LIST. See Phase 6b — a SINGLE pipeline ships all solutions through per-solution stage runs (the pre-v1.3.x "one pipeline per solution" layout was reverted because it cluttered the Pipelines UI). - If
schemaVersionis absent or1(single solution), readsolutionManifest.solution.uniqueNameandsolutionManifest.solution.solutionId. One pipeline will be created (existing flow).
- If
-
Run
verify-alm-prerequisites.jsto confirm PAC CLI auth, acquire a token, and verify API access. Pass--envUrlonly whendevEnvUrlis non-null (code sites). WhendevEnvUrlis null (declarative / data-model sites from Step 1), omit--envUrlentirely — do not pass--envUrl "null"or an empty value:# Code sites — devEnvUrl resolved from powerpages.config.json in Step 1: node "${PLUGIN_ROOT}/scripts/lib/verify-alm-prerequisites.js" --envUrl "{devEnvUrl}" # Declarative / data-model (EDM) sites — devEnvUrl is null, omit the flag: node "${PLUGIN_ROOT}/scripts/lib/verify-alm-prerequisites.js"verify-alm-prerequisites.jstreats--envUrlas optional and resolves the environment frompac env whowhen it's omitted (the flag only overrides the PAC CLI env). Capture output as JSON; extract.envUrland.token(store asDEV_TOKEN), then setdevEnvUrl = .envUrl— this verified value (frompac env who) is the authoritative dev env URL for every later step: it backfills the null for declarative sites and confirms it for code sites. If.envUrlis still empty after this, stop and advise the user to runpac auth create/ select an environment (pac org select) before retrying. -
Run silently:
node "${PLUGIN_ROOT}/scripts/lib/list-environments.js"Store the JSON array as
ENV_LIST(entries:{ displayName, environmentId, environmentUrl, uniqueName, active }). This helper parsespac env list— the oldpac env list --output jsonis invalid on current PAC CLI (pac env listonly accepts--filter). It prints[]and exits 0 when PAC is unauthenticated, so this step degrades gracefully. -
Resolve the Pipelines host via
ensure-pipelines-host-detect.js(the same flow/power-pages:ensure-pipelines-hostruns internally — it reads any cacheddocs/alm/last-host-check.json, then walks the resolution order: org-setting binding → BAP env GET → tenant default custom host → tenant-wide enumeration. Read-only; never prompts the user):BAP_TOKEN=$(az account get-access-token --resource "https://service.powerapps.com/" --query accessToken -o tsv) node "${PLUGIN_ROOT}/scripts/lib/ensure-pipelines-host-detect.js" \ --envUrl "{devEnvUrl}" \ --token "{DEV_TOKEN}" \ --userId "{userId}" \ --bapToken "{BAP_TOKEN}" \ --projectRoot "."Capture stdout as JSON:
const hostResult = JSON.parse(output). ReadhostResult.resolutionStatus,hostResult.finalHostEnvUrl,hostResult.ready.Branch on
resolutionStatus:AvailableUsingPlatformHost/AvailableUsingCustomHost/AvailableUsingCustomHostByAdminDefault— host is already established andready: true. StoreHOST_ENV_URL = hostResult.finalHostEnvUrland continue. Phase 3 confirms with the user.- **`Ava
Truncated for display — read the full file on GitHub.
Related Skills
Agent-Reach
92.4kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
Scrapling
85.9k🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scrapling_dev
ruflo
74.0k🌊 The original agent harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI systems. Features adaptive memory, self-learning intelligence, federation, vector RAG integration, and native Claude Code / Codex / Hermes and many more Integrated
algorithmic-art
177.9kCreating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems.
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
