Skill v1.0.0
currentTrusted Publisher100/100version: "1.0.0" name: create-code-app description: Creates Power Apps code apps using React and Vite. Use when building code apps, scaffolding projects, or deploying to Power Platform. user-invocable: true allowed-tools: Read, Edit, Write, Grep, Glob, Bash, LSP, TaskCreate, TaskUpdate, TaskList, TaskGet, AskUserQuestion, Skill, EnterPlanMode, ExitPlanMode model: opus
📋 Shared Instructions: [shared-instructions.md](${PLUGIN_ROOT}/shared/shared-instructions.md) - Cross-cutting concerns.
References:
- prerequisites-reference.md - Prerequisites and required permissions
- troubleshooting.md - Common issues, npm scripts, resources
Create Power Apps Code App
Workflow
- Prerequisites → 2. Gather Requirements → 3. Plan → 4. Scaffold → 5. Initialize → 6. Build & Deploy (baseline) → 7. Add Data Sources → 8. Implement App → 9. Final Build & Deploy → 10. Summary
Step 0: Check Memory Bank
Check for memory-bank.md per shared-instructions.md. Skip completed steps.
Step 1: Validate Prerequisites
Run prerequisite checks first -- no point gathering requirements if the environment isn't ready. See prerequisites-reference.md for details.
Check Node.js and Git (runs natively in bash):
node --version # Must be v22+git --version # Optional but recommended
- Missing Node.js: Report "Install Node.js v22+ from https://nodejs.org/" and STOP.
- Node.js below v22: Report "Node.js 22+ is required. Please upgrade or switch with
nvm use 22." and STOP. - Missing Git: Report "Recommended but optional." Continue if approved.
- All present: Report versions and proceed.
Step 2: Gather Requirements
Skip questions the user already answered in their initial instruction.
If the user has not described what they want to build (i.e., /create-code-app was invoked with no arguments or a vague prompt), start with a single open-ended question before asking anything else:
"What would you like to build? Describe it in your own words — what it does, who uses it, and what problem it solves."
Wait for their answer. Use it to frame all follow-up questions. Do NOT present a multiple-choice list of app types before the user has described their idea.
Once you have their description:
- Confirm the app name and clarify the purpose if needed
- Ask about data -- focus on what the app needs to do, not specific technologies:
- "What data does your app need to work with?" (e.g., company emails, project tasks, custom business records)
- "Does your app need to search existing information, manage its own data, or both?"
- Based on their answers, recommend the best approach:
- Store and manage custom business data (tables, forms, CRUD) → Dataverse (
/add-dataverse) - Interact with specific services (send emails, post messages, manage files) → the appropriate connector
- If they mention existing Dataverse tables, SharePoint lists, or connectors by name, use those directly
- Ask about UI requirements: key screens, layout, interactions, theme preference
- Ask any clarifying questions now -- resolve all ambiguity before entering plan mode
Step 3: Plan
- Enter plan mode with
EnterPlanMode - Design the full implementation approach:
- Which
/add-*skills to run for data sources - App architecture: components, pages, state management
- Feature list with priority order
- Present plan for approval, include
allowedPromptsfrom prerequisites-reference.md - Exit plan mode with
ExitPlanModewhen approved
Step 4: Scaffold
Ask the user for a folder name. Default to powerapps-{app-name-slugified}-{timestamp} if they don't have a preference.
IMPORTANT: Use `npx degit` to download the template. Do NOT use `git clone`, do NOT manually create files, do NOT download from GitHub UI. `degit` downloads the template without git history.
npx degit microsoft/PowerAppsCodeApps/templates/vite {folder} --forcecd {folder}npm install
Notes:
- Use
--forceto overwrite if the directory already has files (e.g.,.claudefrom a planning session) - If targeting an existing directory, use
.as the folder name:npx degit microsoft/PowerAppsCodeApps/templates/vite . --force - If
npx degitfails (network issues, npm not found), retry once, then ask the user to run manually
Verify: package.json exists, node_modules/ created.
Step 5: Initialize
npx power-apps init -n '{user-provided-app-name}' -e <environment-id>
Finding the environment ID: It's the GUID in the make.powerapps.com URL: https://make.powerapps.com/environments/<env-id>/home. If you don't pass -e, the CLI will prompt for it interactively.
Authentication: On first run, a browser window opens for Microsoft sign-in. Complete the login and the command continues. No separate auth setup is needed.
See preferred-environment.md for environment selection details.
`npx power-apps init` failure:
- Non-zero exit: Report the exact output and STOP. Do not continue to Step 6.
- "environmentId not found" or environment validation error: Verify the environment ID is correct and the user has maker permissions in that environment, then retry.
- Example: _"The
npx power-apps initcommand failed:[error text]. Please check that environment ID32a51012-...is correct and that you have maker permissions in that environment."_
Critical: Read power.config.json after init and verify environmentId is set correctly.
Step 6: Build & Deploy (baseline)
Pre-approved: This baseline deploy is part of the scaffold flow and does not require a separate confirmation prompt.
Build and deploy the bare template to verify the pipeline works before adding data sources.
npm run build
Verify dist/ folder created with index.html and assets/.
npx power-apps push
Capture app URL from output: https://apps.powerapps.com/play/e/{env-id}/app/{app-id}
Common deploy errors: See troubleshooting.md.
Create or update `memory-bank.md` in the project root now -- don't wait until the end. Include:
- Project path, app name, environment ID, app URL
- Completed steps: scaffold, init, baseline deploy
- Data sources planned (from Step 2)
This ensures progress is saved even if the session ends unexpectedly.
Step 7: Add Data Sources
Invoke the /add-* skills identified in the plan (Step 3). Run each in sequence. Pass context as arguments so sub-skills skip redundant questions (project path, connector name, etc.):
| App needs to... | Invoke | |
|---|---|---|
| Store/manage custom business data | /add-dataverse | |
| Track work items, bugs, pipelines | /add-azuredevops | |
| Send or read Teams messages | /add-teams | |
| Read/write Excel spreadsheet data | /add-excel | |
| Upload, download, or manage files | /add-onedrive | |
| Work with SharePoint lists or docs | /add-sharepoint | |
| Send emails, read inbox, manage calendar | /add-office365 | |
| Invoke a Copilot Studio agent | /add-mcscopilot | |
| Connect to another service | /add-connector |
Each /add-* skill runs npm run build to catch errors. Do NOT deploy yet.
If no data sources needed: Skip to Step 8.
Step 8: Implement App
This is the core step. Build the actual app features described in the plan from Step 3.
- Review generated services: Use
Grepto find methods in generated service files (they can be very large -- see connector-reference.md). Do NOT read entire generated files. - Build components: Create React components for each screen/feature in the plan
- Connect data: Wire components to generated services (use
*Service.getAll(),*Service.create(), etc.) - Apply theme: Use the user's theme preference (default: dark theme per development standards)
- Iterate with user: Show progress, ask for feedback, adjust as needed
Key rules:
- Use generated services for all data access -- never use fetch/axios directly
- Read dataverse-reference.md if working with Dataverse (picklist fields, virtual fields, lookups have critical gotchas)
- Remove unused imports before building (TS6133 strict mode)
- Don't edit files in
src/generated/unless fixing known issues
Step 9: Final Build & Deploy
npm run build
Fix any TypeScript errors. Verify dist/ contains the updated app.
Ask the user: _"Ready to deploy to [environment name]? This will update the live app."_ Wait for explicit confirmation before proceeding.
npx power-apps push
Step 10: Summary
Provide:
- App name, environment, app URL, project location
- What was built: features, data sources, components
- Next steps: how to iterate (
npm run build && npx power-apps push), how to add more data sources - Suggest what else the app could do:
/add-datasource-- add another data source (describe what you need, and the plugin will recommend the best approach)/add-dataverse-- store and manage custom business data/add-azuredevops-- track work items, bugs, and pipelines/add-teams-- send and read Teams messages/add-sharepoint-- work with SharePoint lists or documents/add-office365-- send emails, manage calendar/add-connector-- connect to any other service- Manage at https://make.powerapps.com/environments/<environment-id>/home
Update Memory Bank
Update the memory bank (created in Step 6) with final state:
- All completed steps (scaffold, data sources, implementation, deploy)
- Features implemented and components created
- Data sources connected
- Suggested next steps
Example Walkthroughs
These walkthroughs show the full sequence from user request to final output — commands run, files changed, and the verbatim summary format the assistant should use.
Example 1: Create a Task Tracker App with Dataverse
User request:
"Build me a simple task tracker that stores tasks in Dataverse. I want to add tasks, mark them complete, and see a list."
Commands run (in order):
# Step 1: Prerequisitesnode --version # → v22.4.0# Step 4: Scaffoldnpx degit microsoft/PowerAppsCodeApps/templates/vite powerapps-task-tracker-20260302 --forcecd powerapps-task-tracker-20260302npm install# Step 5: Initialize (browser login prompt on first run; CLI prompts for env ID if -e omitted)npx power-apps init -n 'Task Tracker' -e <environment-id># Step 6: Baseline deploy (pre-approved as part of scaffold flow)npm run buildnpx power-apps push# → App URL: https://apps.powerapps.com/play/e/32a51012-.../app/<app-id># Step 7: Add Dataverse (via /add-dataverse)npx power-apps add-data-source -a dataverse -t cr123_tasknpm run build # verify connector — no deploy yet# Step 9: Final deploy (requires user confirmation)npm run buildnpx power-apps push
Files changed:
| File | Change | |
|---|---|---|
power.config.json | Created by npx power-apps init — contains environmentId | |
src/generated/models/Cr123_taskModel.ts | Generated by npx power-apps add-data-source | |
src/generated/services/Cr123_taskService.ts | Generated by npx power-apps add-data-source | |
src/components/TaskList.tsx | Created — renders task list with status filter | |
src/components/AddTaskForm.tsx | Created — form to add new tasks | |
src/App.tsx | Updated — wires components to Cr123_taskService | |
memory-bank.md | Created in Step 7, updated in Step 11 |
Final assistant summary (verbatim format):
Task Tracker is live.App: Task TrackerEnvironment: <your-environment-name> (<environment-id>)URL: https://apps.powerapps.com/play/e/<environment-id>/app/<app-id>Project: ~/powerapps-task-tracker-20260302/What was built:- Task list view with Active / Completed filter- Add task form (title, description, due date)- Mark complete / delete actions- Dataverse table `cr123_task` (Title, Description, DueDate, IsComplete)To redeploy: npm run build && npx power-apps push (from the project folder)What you can add next:- /add-teams — post task updates to a Teams channel- /add-office365 — send email notifications on completion
What to record in `memory-bank.md`:
# Task Tracker — Memory Bank## Project-Path: ~/powerapps-task-tracker-20260302/-App name: Task Tracker-Environment: <your-environment-name> (<environment-id>)-App URL: https://apps.powerapps.com/play/e/<environment-id>/app/<app-id>## Completed Steps-[x] Step 1: Prerequisites validated-[x] Step 4: Scaffold (npx degit)-[x] Step 5: Initialize (npx power-apps init)-[x] Step 6: Baseline deploy-[x] Step 7: Add Dataverse (cr123_task)-[x] Step 8: Implement app (TaskList, AddTaskForm)-[x] Step 9: Final deploy## Data Sources-Dataverse: cr123_task (Title, Description, DueDate, IsComplete)## Components-TaskList.tsx — filtered list, mark complete, delete-AddTaskForm.tsx — create new tasks## Next Steps-Consider /add-teams for task assignment notifications
Example 2: Add SharePoint Connector to an Existing App
User request:
"My app already exists. Add SharePoint so I can read items from a list called 'Project Milestones'."
Commands run (in order):
# Step 6: Get connection ID (via /list-connections)npx power-apps list-connections# → ConnectionId: conn-sp-xyz789 (SharePoint Online)# Step 7: Discover sitesnpx power-apps list-datasets -a sharepointonline -c conn-sp-xyz789# → https://contoso.sharepoint.com/sites/Projects# Step 8: Discover tablesnpx power-apps list-tables -a sharepointonline -c conn-sp-xyz789 -d 'https://contoso.sharepoint.com/sites/Projects'# → Project Milestones, Documents, Team Wiki# Step 9: Add connectornpx power-apps add-data-source -a sharepointonline -c conn-sp-xyz789 -d 'https://contoso.sharepoint.com/sites/Projects' -t 'Project Milestones'# Step 11: Build to verifynpm run build # → success
Files changed:
| File | Change | |
|---|---|---|
src/generated/services/SharePointOnlineService.ts | Generated — contains GetItems, PostItem, etc. | |
src/generated/models/SharePointOnlineModel.ts | Generated — TypeScript interfaces | |
.power/schemas/sharepointonline/ | Generated schema files | |
memory-bank.md | Updated — connector recorded |
Final assistant summary (verbatim format):
SharePoint Online connector added.Connector: SharePoint OnlineSite: https://contoso.sharepoint.com/sites/ProjectsList: Project MilestonesBuild: Passed ✓Usage:const result = await SharePointOnlineService.GetItems({dataset: "https://contoso.sharepoint.com/sites/Projects",table: "Project Milestones"});const milestones = result.data?.value || [];Next: Implement your UI components using the generated service, then run /deploy when ready.