{
  "markdown": "<p align=\"center\">\n  <img src=\"plugins/powerplatform-core/assets/logo.png\" alt=\"PowerPlatform-Core logo\" width=\"150\">\n</p>\n\n<h1 align=\"center\">PowerPlatform-Core</h1>\n\n<p align=\"center\">\n  <strong>A code-first coding-agent plugin that turns Microsoft Power Platform &amp; Dataverse work into a safe, source-controlled, repo-first workflow.</strong>\n</p>\n\n<p align=\"center\">\n  <em>The Dataverse MCP lets agents talk to your data. PowerPlatform-Core lets agents ship your solution.</em>\n</p>\n\n<p align=\"center\">\n  <a href=\"LICENSE\"><img alt=\"License: Apache-2.0\" src=\"https://img.shields.io/badge/License-Apache--2.0-blue.svg\"></a>\n  <a href=\"#install\"><img alt=\"Claude Code\" src=\"https://img.shields.io/badge/Claude%20Code-plugin-d97757.svg\"></a>\n  <a href=\"#install\"><img alt=\"OpenAI Codex\" src=\"https://img.shields.io/badge/OpenAI%20Codex-plugin-412991.svg\"></a>\n  <a href=\"#requirements\"><img alt=\"Cross-platform\" src=\"https://img.shields.io/badge/Cross--platform-Windows%20%C2%B7%20macOS%20%C2%B7%20Linux-2ea44f.svg\"></a>\n  <a href=\"#how-its-built\"><img alt=\"Built with\" src=\"https://img.shields.io/badge/Built%20with-Python%20%C2%B7%20.NET%208-149CA1.svg\"></a>\n</p>\n\n---\n\n## What & why\n\nPower Platform changes are easy to make and hard to make *safely* — a single stale ZIP or an accidental whole-solution import can quietly overwrite other people's work. PowerPlatform-Core gives a coding agent the judgment to avoid that: it reads your repo, understands your model-driven app and solution structure, picks the right development surface, makes reviewable source-controlled edits, and ships them through the narrowest delivery path behind a **mandatory live-mutation preflight**.\n\nIt is deliberately generic. It works across unfamiliar repos — layered code-centric, unpacked-solution, mixed, or near-empty — without assuming any one team's house convention, publisher prefix, or folder layout.\n\n### Better together with the Dataverse MCP\n\nMicrosoft's hosted **Dataverse MCP server** and this plugin do different jobs and complement each other, so **run both**:\n\n- The **Dataverse MCP** is the lowest-friction way for an agent to *talk to your data* — conversational search, `describe`, and small read-only lookups.\n- **PowerPlatform-Core** is how an agent *ships your solution* — repo-aware edits, paged/keyed/verified reads, flows, plug-ins, and every mutation behind a **preflight gate** the MCP has no equivalent for.\n\nWhen both are connected, the orchestrator skill routes by intent automatically (MCP for interactive exploration; plugin helpers for anything paged, keyed, verified, solution-aware, or mutating). Register the MCP alongside the plugin in Claude Code:\n\n```text\nclaude mcp add --transport http dataverse https://{your-org}.crm.dynamics.com/api/mcp\n```\n\nThe plugin works fully on its own if you don't add the MCP. See [docs/comparison-dataverse-mcp.md](docs/comparison-dataverse-mcp.md) for the full trade-off analysis.\n\n## Highlights\n\n- 🧭 **12 modular skills that trigger precisely** — an orchestrator routes each task (schema, data, flows, plug-ins, PCF, code apps, ALM, security, docs, connectors, admin) to exactly the right specialist.\n- 🛡️ **Safe by default** — every live mutation passes a preflight gate; stale artifacts are blocked; targeted delivery is preferred over whole-solution imports.\n- ⌨️ **Headless / code-first** — repo edits, SDK/Web API, solution files, and the `pac` CLI come first; browser automation is an opt-in last resort.\n- 🤝 **Multi-agent** — one shared source installs as both a **Claude Code** plugin and an **OpenAI Codex** plugin.\n- 🌐 **Cross-platform live path** — the runtime works on Windows *and* macOS/Linux (WAM broker sign-in on Windows, device-code flow elsewhere).\n\n## Install\n\nPowerPlatform-Core installs from one shared source into either agent.\n\n### Claude Code\n\n```text\n/plugin marketplace add satriotsubasa/PowerPlatform-Core\n/plugin install powerplatform-core@powerplatform-core\n```\n\n> The marketplace commands above resolve once the plugin is on the repo's default branch. To try a **local checkout** instead, launch with `claude --plugin-dir \"<path-to-repo>\"`, or run `/plugin marketplace add \"<path-to-repo>\"` pointed at your clone.\n\n### OpenAI Codex\n\n```text\ncodex plugin marketplace add satriotsubasa/PowerPlatform-Core\n```\n\nThen **install from inside Codex** — there is no `codex plugin add` shell command. Launch `codex`, run `/plugins`, open **powerplatform-core** in the list, choose **Install plugin**, then **restart Codex**.\n\n> `marketplace add` only *registers* the source; it never installs — installation happens in the `/plugins` browser. If the plugin doesn't appear there, run `codex plugin marketplace upgrade` and retry.\n\n### More agents (experimental)\n\nThe same source also ships manifests for more agents. **Cursor** and **Copilot** are confirmed against each platform's published plugin schema; **Gemini** and **OpenCode** are partial because their skill discovery expects a repo-root layout that the Codex-required `plugins/` subfolder doesn't match. None are end-to-end tested here yet, so treat them as experimental and please report issues.\n\n- **Cursor** - add this repo as a plugin marketplace (Settings -> Plugins -> Team Marketplaces -> Import from Repo), then install `powerplatform-core`. (Cursor installs from its marketplace UI; there is no `owner/repo` shell command.)\n- **GitHub Copilot CLI** - `copilot plugin marketplace add satriotsubasa/PowerPlatform-Core` then `copilot plugin install powerplatform-core@powerplatform-core` (Copilot reuses the same `.claude-plugin/marketplace.json` catalog; verify the verb with `copilot plugin --help`).\n- **Gemini CLI** - `gemini extensions install https://github.com/satriotsubasa/PowerPlatform-Core`. Loads the **orchestrator** as always-on context, which then reads the domain skills as files on demand. (Gemini only auto-discovers a `skills/` folder at the repo root; our subfolder layout doesn't expose one, so the other ten skills aren't registered natively.)\n- **OpenCode** - not a one-line install yet. OpenCode discovers skills from a workspace-root dir (`.opencode/skills/`, `.claude/skills/`, or `.agents/skills/`); ours live in `plugins/powerplatform-core/skills/`, so copy or symlink that folder's contents into `.opencode/skills/` in your workspace. (OpenCode's `plugin` array installs npm packages only - no git URL - and has no documented hook to add skill paths.)\n\n### Requirements\n\nThe skills are code-first, so the live path needs a small local toolchain:\n\n| Tool | Why |\n| --- | --- |\n| **Python 3.10+** | Runs the helper scripts that drive every live operation. |\n| **.NET 8 SDK** | Builds and runs the shared `DataverseOps` execution tool (and plug-in projects). |\n| **Node.js** | Required for PCF controls and Power Apps Code Apps (`npm` / `npx`). |\n| **Microsoft Power Platform CLI (`pac`)** | Authentication, solution, and deployment operations. |\n\nInteractive sign-in is platform-aware: on **Windows** it uses the WAM broker; on **macOS/Linux** it falls back to the **device-code flow** (the tool prints a code to complete in a browser).\n\n**One-command prerequisite check.** From a clone, run the bootstrap script to verify (and optionally install) the toolchain above:\n\n```powershell\n./bootstrap.ps1            # Windows: check; add -Install to install what's missing\n```\n```bash\n./bootstrap.sh             # macOS/Linux: check; add --install to install what's missing\n```\n\nIt reports a PASS/FAIL line per tool. With the install flag it installs what it safely can — `pac` as a .NET global tool, and the rest via `winget` (Windows) or Homebrew/apt (macOS/Linux).\n\n> **Migrating from the classic skill?** The old `~/.codex/skills/powerplatform-core` copy-install is deprecated; the plugin replaces it. Once the plugin loads in Codex, delete that folder to avoid a duplicate `powerplatform-core` skill.\n\n## The skills\n\nStart with the **orchestrator** — `powerplatform-core` — which discovers repo context, chooses the development surface, enforces the safety rules, and routes to the right specialist below. You rarely need to name a skill yourself; the agent picks one from your prompt.\n\n| Skill | What it does |\n| --- | --- |\n| **`powerplatform-core`** | 🧭 Orchestrator. Discovers repo context, picks the surface, enforces the live-mutation preflight, and routes to the right domain skill. |\n| **`dataverse-schema`** | Tables, columns, lookups, choices, alternate keys, forms, views, the form ribbon (RibbonDiffXml), and table icons — plus up-front schema/query design. |\n| **`data-operations`** | Row create / read / update / upsert / delete, config-data seeding and sync, and query design **and execution** (FetchXML/OData) with bounded paging and match counts. |\n| **`power-automate-flows`** | Solution-aware cloud flows: create, update, inspect, **run-history read-back**, lint, connector & hardening review, and HTTP-trigger callback URL resolution. |\n| **`plugins-server-extensions`** | C# plug-ins and custom APIs: headless registration, repeatable build-and-push, step inspection, and step-state reconciliation. |\n| **`pcf-and-web-resources`** | PCF controls, web resources, client form scripts, and Power Fx review — scaffold, version, build, deploy, and bind. |\n| **`code-apps`** | Power Apps Code Apps (the pro-code Vite + `@microsoft/power-apps` SPA model): scaffold, add data sources, build, and push. |\n| **`solution-alm-delivery`** | The safety-critical delivery skill: pack/import/deploy, component placement, versioning, patch/merge/upgrade planning, and standards review. |\n| **`security-roles`** | Inspect, create, and update Dataverse security roles and privilege sets as reviewable, solution-aware desired state. |\n| **`document-generation`** | Word Template document generation: inventory content controls, map placeholders, and plan template-aware changes. |\n| **`custom-connectors`** | Design custom connectors and integration wrappers — auth shape, operation inventory, and direct-connector vs. Azure-facade recommendation. |\n| **`platform-administration`** | Power Platform tenant/environment administration via `pac admin` + the Power Platform API: list/inspect environments, tenant settings, DLP policies, and environment groups (read-only today), with an admin-grade preflight gating writes. |\n\n## Quickstart\n\nJust describe the outcome you want. The agent discovers context, opens the matching skill, and runs the preflight before any live change.\n\n```text\nAdd a Dataverse table for \"Service Visit\" and surface it in the target model-driven app.\n```\n> Routes to `dataverse-schema`, designs the table/columns, then checks solution and app exposure — preflight before any write.\n\n```text\nPackage and deploy this PCF control from the repo.\n```\n> Routes to `pcf-and-web-resources`, syncs the manifest + wrapper versions, builds, and deploys via the targeted path — not a whole-solution import.\n\n```text\nHarden this cloud flow and resolve its HTTP trigger URL.\n```\n> Routes to `power-automate-flows`, runs the hardening review, patches only the changed `workflow` properties, and resolves the signed callback URL — preflight before the update.\n\n## Safety by default\n\nThe thing that makes this plugin different from \"an agent with `pac` access\" is its refusal to do the dangerous-but-easy thing:\n\n- **Mandatory live-mutation preflight.** Before *any* deploy, publish, import, registration, push, or data write, the agent prints a gate naming the target environment, PAC profile (and any mismatch), target solution, exact components, delivery primitive, artifact provenance, blast radius, rollback plan, and timeout. If a required field is missing, it stops.\n- **Stale-artifact blocking.** It will not import a ZIP from `bin`, `Release`, `Downloads`, or a temp folder unless that package was generated in-session or you explicitly selected it. Multiple candidate packages → it stops and asks.\n- **Targeted delivery first.** It prefers the narrowest primitive — web-resource sync, plug-in push, form/ribbon patch, PCF wrapper deploy, keyed upsert — and **never silently escalates** a targeted change into a whole-solution import (a slow, high-blast-radius path that needs explicit approval).\n- **Managed-promotion audit.** A successful import and a bumped solution version are **not completion proof** for high-risk metadata (command bars, forms, views, flows, roles, plug-in steps) — the agent confirms alignment from source/package evidence plus a **target live read-back** before calling a managed promotion done.\n\n## How it's built\n\nPowerPlatform-Core is packaged as a plugin of modular skills over a shared toolchain:\n\n- **An orchestrator + 11 domain skills** under `skills/`, each with a focused, precisely triggering description.\n- **A shared toolchain at the plugin root**, resolved via `$CLAUDE_PLUGIN_ROOT` / `$CODEX_PLUGIN_ROOT`:\n  - **`scripts/`** — Python helper entry points that drive every live operation.\n  - **`tools/`** — a .NET 8 `DataverseOps` execution tool (connection checks, row/metadata ops, flows, plug-ins, web resources, solutions) plus a Windows auth dialog.\n  - **`references/`** — a knowledge base on surface selection, ALM, metadata, verification, and repo archetypes that the skills cite as needed.\n\nFor the full picture, see [`docs/core-overlay-architecture.md`](docs/core-overlay-architecture.md) and the maintainer-oriented [`docs/capability-matrix.md`](docs/capability-matrix.md). What's next lives in [`docs/roadmap.md`](docs/roadmap.md).\n\n## Standalone vs. overlay\n\nPowerPlatform-Core is the public, **repo-agnostic base** and is designed to be used directly — install it and point it at any Power Platform or Dataverse repo, no configuration required. That is the right choice for most users and unfamiliar repos.\n\nAn **overlay** is a separate skill that layers one team's house-style conventions, references, and defaults on top of Core, bundling Core's runtime into a single merged skill. If your repo follows a specific team's conventions and an overlay exists, use that team's skill token; otherwise use Core. Building your own overlay is covered in [`docs/core-overlay-architecture.md`](docs/core-overlay-architecture.md).\n\n## Develop & verify\n\nContributing or running a local checkout? One command verifies the whole repo:\n\n```bash\npython verify_repo.py\n```\n\nIt runs Python syntax checks, the `unittest` suite, the skill-structure and manifest checks, the .NET build/tests for `DataverseOps`, and the skill-creator quick validator when available. Cross-platform: the Windows-only WPF auth dialog is skipped automatically on macOS/Linux.\n\nMaintainer detail — capability boundaries, current limitations, and the helper backlog — lives in [`docs/development.md`](docs/development.md).\n\n## License\n\nApache-2.0 — see [`LICENSE`](LICENSE) and [`NOTICE`](NOTICE).\n\n© 2026 Satrio Tsubasa.\n",
  "bytes": 14828,
  "sha": "1e98912c329a5a53f82e0c7104f65bbf5b40f9e94f23e150b92a2205c805f9a6",
  "repo_slug": "satriotsubasa/powerplatform-core",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_satriotsubasa_powerplatform_core_41e23b56/readme"
}