setup-solution
Creates a Dataverse publisher and solution, then adds Power Pages site components to the solution for ALM and deployment management
Install / Use
npx skills add microsoft/power-platform-skills --skill setup-solutionInstalls into whichever agent you are using.
SKILL.md
Installable skill definition
Quality Score
Category
OperationsSupported Platforms
Our assessment of setup-solution
setup-solution scores 85/100 on our quality scale, 510th of 736 Operations skills we index.
Its SKILL.md is 69 KB long, well organised into 26 sections with 21 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-solution 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-solution compared with similar skills
All 4 of these similar skills score higher than setup-solution; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| setup-solution (this skill)by microsoft | 85 | 919 | 12d ago | SKILL.md |
| Agent-Reachby Panniantong | 100 | 92.4k | 21d ago | CLAUDE.md |
| headroomby headroomlabs-ai | 100 | 74.5k | today | CLAUDE.md |
| CowAgentby zhayujie | 100 | 47.2k | today | CLAUDE.md |
| Scraplingby D4Vinci | 100 | 85.9k | today | MCP Server |
Frequently asked questions
- How do I install setup-solution?
- Run
npx skills add microsoft/power-platform-skills --skill setup-solution. The install tabs above show the steps for each supported agent. - Which AI agents does setup-solution 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-solution 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-solution still maintained?
- The repository was last updated 12 days ago, so setup-solution is actively maintained.
Skill content
View source on GitHubname: setup-solution description: >- Creates a Dataverse publisher and solution, then adds Power Pages site components to the solution for ALM and deployment management. Use when asked to: "create solution", "set up solution", "add to solution", "package site into solution", "create publisher", "solutionize my site", or "set up ALM for my site". user-invocable: true argument-hint: "Optional: solution unique name (e.g., 'ContosoSite')" 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-solution
Creates a Dataverse publisher and solution, then adds Power Pages site components. Writes .solution-manifest.json for use by export-solution, import-solution, and setup-pipeline skills.
Prerequisites
- PAC CLI installed and authenticated (
pac env whoreturns an environment URL) - Azure CLI installed and logged in (
az account showsucceeds) powerpages.config.jsonexists in the project root (site must be deployed at least once so.powerpages-site/exists with component records)
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 "."
The helper returns JSON with { exists, deferred, stale, staleness: { reason, detail }, generatedAt, planStatus, ... }. Sync mode (when .solution-manifest.json already exists) may additionally pass --envUrl, --token, --solutionId once Phase 1 has acquired them, but for the initial gate the existence-only check is sufficient.
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-solution: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-solution: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-solution: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-solution: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 setup-solution builds (or syncs) a solution without consulting the orchestrator's plan. If a plan already exists and recommends a multi-solution split, running this skill standalone may consolidate components into the wrong base solution. If no plan exists yet, plan-alm would have surfaced split recommendations, the asset-size advisory, and missing-component gaps before any solution was created — running setup-solution first burns through those decisions silently. The gate ensures setup-solution runs in the right context, while still leaving an explicit bypass for users who genuinely know they want a one-off solution.
Phase 1 — Verify Prerequisites
Create all tasks upfront at the start of this phase.
Tasks to create:
- "Verify prerequisites"
- "Gather solution configuration"
- "Check existing publishers and solutions"
- "Create publisher and solution"
- "Add site components to solution"
- "Verify and write manifest"
- "Present summary"
Steps:
-
Run
pac env who— extractenvironmentUrl,organizationId(shown to user for confirmation) -
Run
verify-alm-prerequisites.jsto confirm PAC CLI auth, acquire a token, and verify API access:node "${PLUGIN_ROOT}/scripts/lib/verify-alm-prerequisites.js" --envUrl "{environmentUrl}"Capture output as JSON; extract
.envUrl(store asenvUrl) and.token(store astoken). If the script exits non-zero, stop and explain what is missing (reference${PLUGIN_ROOT}/references/dataverse-prerequisites.md). -
Locate
powerpages.config.json— readsiteNameandwebsiteRecordId -
Confirm
.powerpages-site/folder exists (required to find component records) -
Check for ALM plan context — look for
<!-- gate: setup-solution:1.preloaded | category=plan | cancel-leaves=nothing -->docs/alm/alm-plan-context.json:🚦 Gate (plan · setup-solution:1.preloaded): Use pre-loaded plan classifications, or re-discover. No write happens before this choice.
- If found, ask via
AskUserQuestion:"An ALM plan was previously generated for this site. It includes a pre-classified list of site settings (keepAsIs, promoteToEnvVar, authNoValue, excluded). Would you like to use those choices, or re-discover and re-classify everything now?"
- Options: "Use pre-loaded choices from plan" / "Re-discover and re-classify"
- If user chooses pre-loaded: read
docs/alm/alm-plan-context.json, store thesiteSettingsobject aspreloadedSettings. When Step 5.3 is reached, skip the query and classification logic — usepreloadedSettingsdirectly. - If user chooses re-discover: proceed normally (Steps 5.3–5.4 query Dataverse and reclassify).
- If found, ask via
-
Detect sync mode — check whether
.solution-manifest.jsonexists in the project root.-
If present: read it and verify the
solutionIdstill exists in the target environment viaGET {envUrl}/api/data/v9.2/solutions({solutionId})?$select=solutionid,uniquename,version,ismanaged.- If the solution is still present and unmanaged in this environment: set
syncMode = trueand storeexistingSolution= the manifest contents.
🚦 Gate (consent · setup-solution:1.stale-manifest): Manifest references a solution missing from the current env. Start fresh (back up the manifest and create a new solution) or abort.
- If the solution was not found, is managed, or is in a different environment: treat as a stale manifest, inform the user, and ask via
AskUserQuestion:"The existing
.solution-manifest.jsonpoints to solution{uniqueName}v{version} which I could not find in the current environment. Would you like to: 1) Start fresh (back up the manifest and create a new solution), 2) Abort so you can investigate?" Proceed only after an explicit choice.
- If the solution is still present and unmanaged in this environment: set
-
If absent: set
syncMode = false— this is a fresh setup.
-
-
Report the chosen mode to the user:
syncMode = true: "Found existing solution{uniqueName}v{version}. Running in sync mode — I'll discover the current site inventory, diff against what's already in the solution, and only add missing components."syncMode = false: "No existing solution manifest found. Running a fresh setup — I'll create a publisher and solution, then add all site components."
-
Check for split plan (multi-solution mode) — look for
docs/alm/alm-split-plan.json(written byplan-almPhase 1 Step 10):- If found and
proposedSolutions.length > 1, setMULTI_SOLUTION_MODE = trueand store the array asPROPOSED_SOLUTIONS. - In multi-solution mode:
- Phase 2 asks for publisher details once (shared across all solutions) and presents the proposed solution names/versions for confirmation (user can override each before proceeding).
- Phase 4 creates the publisher first (single serial step — every solution binds to it), then creates the solutions in
PROPOSED_SOLUTIONSin parallel. Theorderfield is data for downstream pipeline-stage ordering — it does NOT constrain creation order, since each solution is independent (distinctuniqueName, sharedpublisherId, no inter-solution dependency). - Phase 5 partitions
AddSolutionComponentcalls per solution based onproposedSolutions[i].componentTypesandtableLogicalNames(for Strategy 3). - Phase 6 writes manifest v2 (see below).
- If not found or
proposedSolutions.length === 1, proceed in single-solution mode (existing flow).
- If found and
Phase 1.5 — Ground in current ALM documentation
Reference:
${PLUGIN_ROOT}/references/alm-docs-grounding.md
Cap this step at ~30 seconds. If MCP search / fetch errors out, log a one-line note and continue — this skill must remain runnable offline.
- Run
microsoft_docs_searchwith the query:Power Pages solution publisher creation Dataverse component types ALM. - Fetch `https:
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.
headroom
74.5kCompress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.
CowAgent
47.2kOpen-source personal AI assistant & Agent Harness. Plans tasks, runs tools and skills, self-evolves with memory and knowledge. Multi-agent, multi-model, multi-channel. Lightweight, extensible, one-line install.
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
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.
