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…
Internal mobile-app workflow read and executed only by mobile orchestrators to change one table's scope, columns, or sync settings in a Mobile Offline Profile.
Claude Code
$ npx -y skills add microsoft/power-platform-skills --skill edit-offline-profile --agent claude-code
Codex
$ npx skills add microsoft/power-platform-skills --skill edit-offline-profile -a codex -y
Cursor
$ npx skills add microsoft/power-platform-skills --skill edit-offline-profile -a cursor -y
Gemini CLI
$ npx skills add microsoft/power-platform-skills --skill edit-offline-profile -a gemini-cli -y
GitHub Copilot
$ npx skills add microsoft/power-platform-skills --skill edit-offline-profile -a github-copilot -y
OpenCode
$ npx skills add microsoft/power-platform-skills --skill edit-offline-profile -a opencode -y
Windsurf
$ npx skills add microsoft/power-platform-skills --skill edit-offline-profile -a windsurf -y
name: edit-offline-profile description: Internal mobile-app workflow read and executed only by mobile orchestrators to change one table's scope, columns, or sync settings in a Mobile Offline Profile. user-invocable: false disable-model-invocation: true allowed-tools: Read, Edit, Write, Grep, Glob, Bash, AskUserQuestion model: sonnet
**Shared instructions: [shared-instructions.md](${PLUGIN_ROOT}/shared/shared-instructions.md)** — read first.
**References:**
Re-run a single piece of an existing profile — change one table's row scope, update the column list, adjust sync frequency, or rename the profile. Avoids the cognitive cost of walking the full /setup-offline-profile wizard for a one-line change.
Scope: existing profile (read from `<working_dir>/offline-profile.json` or `--profile-id`); edits at the table-item granularity. To ADD a new table return to the owner for `/add-table-to-offline-profile`; deleting an entire profile is outside this helper's scope, not an automatic recovery.
This internal helper is always a **child invocation**. Before any project read or command, execute [app-working-directory.md](${PLUGIN_ROOT}/shared/references/app-working-directory.md). Require the owner's absolute `working_dir`; `--working-dir`, when supplied, must identify that same native-canonical root. Missing, relative, or conflicting root context returns `NEEDS_CONTEXT` before project access; an inaccessible directory is `BLOCKED`. Never use the launch cwd or introduce another root resolver.
Receive `MOBILE_APP_ORCHESTRATING=1`, `orchestrator`, `working_dir`, `phase`, `approved_scope`, and supplied answers from the owner. Preserve the selected environment ID/URL/tenant, profile ID, table allowlist, item IDs, and exact scope/column/sync/name/description changes. Missing or conflicting scope returns `NEEDS_CONTEXT`, not another environment/profile/table selection. The marker is not approval: schema approval alone does not authorize profile edits, publication, deletion, or membership edits. Retain Step 3's single confirm unless supplied answers already approve that same current offline change. For `--plan-only` or a planning-phase handoff, return the current/proposed diff after read-only discovery and STOP before Apply, PATCH, publication, or artifact writes. A gate response cannot lift proposal-only mode.
Apply the canonical contract to **every shell call and file tool**, including version/auth checks, manifest/screen reads, commands copied from references, verification, recovery, and retries. Re-supply the absolute `PLUGIN_ROOT` and required context on each call; no prior `cd`, export, or shell variable persists. Use the canonical Bash guard below or its PowerShell equivalent. Replace placeholders with validated, shell-quoted invocation values; missing values return `NEEDS_CONTEXT`, never execute an unresolved placeholder. File tools use absolute `<working_dir>/...` paths; plugin reads/scripts use `${PLUGIN_ROOT}/...`. Never search another app when a file is absent.
1. Verify project + locate profile → 2. Resolve target (which table / what to change) → 3. Show current vs proposed → Single confirm → 4. PATCH → 5. Publish → 6. Update artifacts → 7. Summary
---
cd -- '<working_dir>' || { echo "BLOCKED: cannot enter working_dir" >&2; exit 1; }
if [ ! -f power.config.json ] || [ ! -f app.config.js ]; then
echo "BLOCKED: working_dir is not an initialized app" >&2
exit 1
fiRead `<working_dir>/power.config.json` and require a nonempty `environmentId` matching the owner's selected environment. Reuse matching complete environment context, or perform this non-persisting lookup from the bound root:
cd -- '<working_dir>' || { echo "BLOCKED: cannot enter working_dir" >&2; exit 1; }
environment_id=$(node -p "require('./power.config.json').environmentId || ''") || {
echo "BLOCKED: unreadable power.config.json" >&2; exit 1;
}
if [ -z "$environment_id" ] || [ "$environment_id" != "<selected-environment-id>" ]; then
echo "NEEDS_CONTEXT: selected environment does not match working_dir" >&2
exit 1
fi
node "${PLUGIN_ROOT}/scripts/resolve-environment.js" "$environment_id" --no-cache --require-tenantRequire the returned environment ID, HTTPS URL, and tenant to match the owner; incomplete or conflicting context returns `NEEDS_CONTEXT`. Never drop `--no-cache --require-tenant`, change configuration, or switch auth/environment to recover a failure. Use that exact `<envUrl>` and `<tenantId>` for every request.
Profile ID resolution (same priority as `/assign-offline-profile` Step 1):
| Source | Used when | |---|---| | `$ARGUMENTS` `--profile-id <guid>` | Explicit selection matching the owner's profile context | | `<working_dir>/offline-profile.json` top-level `profileId` | Default for `/setup-offline-profile`-created projects, matching the owner's profile context | | Otherwise | Return `NEEDS_CONTEXT` to the owner to select the intended profile; never pick another profile silently |
STOP if no profile found: "Run `/setup-offline-profile` first."
Verify the selected live profile belongs to the selected environment. A conflicting snapshot/argument returns `NEEDS_CONTEXT`; a 404 or permission failure is `BLOCKED`, not permission to discover a substitute. Resolve each `<itemId>` only within this profile and verify its table matches the exact requested logical name.
> **`<working_dir>/power.config.json` is intentionally NOT consulted for the profile ID.** > That file is owned by `pa app init`. The local profile ID lives in > `<working_dir>/offline-profile.jso
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.