[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-microsoft-integrate-webapi":3,"mdc--g9tz18-key":43,"related-org-microsoft-integrate-webapi":6266,"related-repo-microsoft-integrate-webapi":6461},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":38,"sourceUrl":41,"mdContent":42},"integrate-webapi","integrate Web APIs with Power Pages","Integrates Power Pages Web API into a site's frontend code with proper permissions and deployment. Orchestrates the full integration lifecycle: code integration, table permissions setup, and deployment for Dataverse CRUD operations. Use when the user wants to add Web API calls, connect to Dataverse, or add data fetching to their frontend.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"microsoft","Microsoft","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fmicrosoft.png",[12,16,17,20,23],{"name":13,"slug":14,"type":15},"Power Pages","power-pages","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"API Development","api-development",{"name":21,"slug":22,"type":15},"Dataverse","dataverse",{"name":24,"slug":25,"type":15},"Frontend","frontend",564,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fpower-platform-skills","2026-04-06T18:34:42.403145",null,114,[32,33,34,35,36,14,37],"claude-code-plugin","claude-code-skills","code-apps","github-copilot-plugin","power-apps","power-platform",{"repoUrl":27,"stars":26,"forks":30,"topics":39,"description":40},[32,33,34,35,36,14,37],"A plugin marketplace for Claude Code\u002FGitHub Copilot that provides Power Platform development plugins, including reusable skills, agents, and commands for building and deploying solutions.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fpower-platform-skills\u002Ftree\u002FHEAD\u002Fplugins\u002Fpower-pages\u002Fskills\u002Fintegrate-webapi","---\nname: integrate-webapi\ndescription: >-\n  Integrates Power Pages Web API into a site's frontend code with proper permissions and\n  deployment. Orchestrates the full integration lifecycle: code integration, table permissions\n  setup, and deployment for Dataverse CRUD operations. Use when the user wants to add Web API\n  calls, connect to Dataverse, or add data fetching to their frontend.\nuser-invocable: true\nallowed-tools: Read, Write, Edit, Bash, Grep, Glob, AskUserQuestion, Task, TaskCreate, TaskUpdate, TaskList\nmodel: opus\n---\n\n> **Plugin check**: Run `node \"${PLUGIN_ROOT}\u002Fscripts\u002Fcheck-version.js\"` — if it outputs a message, show it to the user before proceeding.\n\n# Integrate Web API\n\nIntegrate Power Pages Web API into a code site's frontend. This skill orchestrates the full lifecycle: analyzing where integrations are needed, implementing API client code for each table, configuring permissions and site settings, and deploying the site.\n\n## Core Principles\n\n- **First table sequential, then parallel**: The first table must be processed alone because it creates the shared `powerPagesApi.ts` client. Once that exists, remaining tables can be processed in parallel since each creates independent files (types, service, hooks).\n- **Parallelize independent agents**: The `table-permissions-architect` and `webapi-settings-architect` agents are independent — invoke them in parallel rather than sequentially.\n- **Permissions require deployment**: The `.powerpages-site` folder must exist before table permissions and site settings can be configured. Integration code can be written without it, but permissions cannot.\n- **AI-only read mode is opt-in**: When invoked by another skill (e.g. `\u002Fadd-ai-webapi`) with the `[AI-READ-ONLY]` sentinel in `$ARGUMENTS`, the flow produces read-only code and hardens the settings\u002Fpermissions for AI summarization reads. See Phase 1.6 for the contract. Human invocations never trigger this mode.\n- **Use TaskCreate\u002FTaskUpdate**: Track all progress throughout all phases — create the todo list upfront with all phases before starting any work.\n\n> **Prerequisites:**\n>\n> - An existing Power Pages code site created via `\u002Fcreate-site`\n> - A Dataverse data model (tables\u002Fcolumns) already set up via `\u002Fsetup-datamodel` or created manually\n> - The site must be deployed at least once (`.powerpages-site` folder must exist) for permissions setup\n\n**Initial request:** $ARGUMENTS\n\n---\n\n## Workflow\n\n1. **Verify Site Exists** — Locate the Power Pages project and verify prerequisites\n2. **Explore Integration Points** — Analyze site code and data model to identify tables needing Web API integration\n3. **Review Integration Plan** — Present findings to the user and confirm which tables to integrate\n4. **Implement Integrations** — Use the `webapi-integration` agent for each table\n5. **Verify Integrations** — Validate all expected files exist and the project builds successfully\n6. **Setup Permissions & Settings** — Choose permissions source (upload diagram or let the architects analyze), then configure table permissions and Web API site settings with case-sensitive validated column names\n7. **Review & Deploy** — Ask the user to deploy the site and invoke `\u002Fdeploy-site` if confirmed\n\n---\n\n## Phase 1: Verify Site Exists\n\n**Goal**: Locate the Power Pages project root and confirm that prerequisites are met\n\n**Actions**:\n\n### 1.1 Locate Project\n\nLook for `powerpages.config.json` in the current directory or immediate subdirectories to find the project root. Use your file-search tool (e.g., `Glob` with patterns `powerpages.config.json` and `*\u002Fpowerpages.config.json`) rather than a shell-specific command.\n\n**If not found**: Tell the user to create a site first with `\u002Fcreate-site`.\n\n### 1.2 Read Existing Config\n\nRead `powerpages.config.json` to get the site name.\n\n### 1.3 Detect Framework\n\nRead `package.json` to determine the framework (React, Vue, Angular, or Astro). See `${PLUGIN_ROOT}\u002Freferences\u002Fframework-conventions.md` for the full framework detection mapping.\n\n### 1.4 Check for Data Model\n\nLook for `.datamodel-manifest.json` to discover available tables:\n\n```text\n**\u002F.datamodel-manifest.json\n```\n\nIf found, read it — this is the primary source for table discovery.\n\n### 1.5 Check Deployment Status\n\nLook for the `.powerpages-site` folder:\n\n```text\n**\u002F.powerpages-site\n```\n\n**If not found**: Warn the user that the permissions phase (Phase 6) will require deployment first. The integration code (Phases 2–5) can still proceed.\n\n### 1.6 Detect AI-only read mode (skill-to-skill invocation)\n\nInspect `$ARGUMENTS`. If the text begins with the sentinel `[AI-READ-ONLY]`, the caller is another skill (typically `\u002Fadd-ai-webapi`) that has already analysed the site and decided which tables need Layer 1\u002F2 prerequisites for AI summarization reads. Parse the following structured tokens out of `$ARGUMENTS`:\n\n| Token | Required | Meaning |\n|-------|----------|---------|\n| `mode=ai-read-only` | Yes | Confirms the posture; any other value is rejected with an error. |\n| `primary=\u003Clogical_name>` | Yes | The primary table being summarised. Missing → stop and report the contract violation to the caller. |\n| `tables=\u003Ccsv>` | Yes | Comma-separated list of all tables in scope (primary + every `$expand` target). |\n| `expand-targets=\u003Ccsv>` | No | Sub-list of `tables` that are `$expand` targets; defaults to empty. |\n| `caller=\u003Cskill-name>` | No | Informational — used in commit messages and the final summary. |\n\n**When the sentinel is present:**\n\n- Set an internal flag **AI-only read mode = true** that every downstream phase consults.\n- Skip the Phase 3 interactive table confirmation and use the provided `tables` list verbatim (user has already confirmed in the caller).\n- The Phase 4.1 `webapi-integration` prompt restricts operations to **read-only** (list + get by id).\n- The Phase 6 Path B agent prompts apply the hardened AI-only posture documented in each agent's \"AI-only read mode\" section.\n- The Phase 6 Path A script invocations use `--read` only for table permissions and omit primary keys \u002F lookup write forms from `Webapi\u002F\u003Ctable>\u002Ffields`.\n- No `AskUserQuestion` prompts are issued for Phase 3 or Phase 6.2 — the caller owns those decisions.\n- **Defer all git commits to the caller.** Skip Phase 4.4 (`git add -A && git commit`) and Phase 6.5 (permissions\u002Fsettings commit) entirely. The caller is batching changes into one or two commits at orchestrator-defined milestones; an unprompted commit here turns one logical change into three. Print the file lists you would have committed so the caller can reproduce them.\n- **Suppress the end-of-skill deploy prompt.** Skip Phase 6.1 (deploy-now ask when `.powerpages-site` is missing — the caller has already gated on this), Phase 7.3 (final deploy ask), and Phase 7.4 (post-deploy notes). The caller owns the single end-of-orchestration deploy decision; nesting deploy prompts inside the delegation gives the user 2–3 redundant asks per run. Return the integration summary (Phase 7.2) without trailing deploy\u002Fnotes.\n\n**When the sentinel is absent**: proceed exactly as today (full CRUD, full interactive flow, auto-commit, deploy prompt). This is the regression guard — no human invocation changes behavior.\n\n**Output**: Confirmed project root, framework, data model availability, deployment status, and (if sentinel present) parsed AI-read-only contract.\n\n---\n\n## Phase 2: Explore Integration Points\n\n**Goal**: Analyze the site code and data model to identify all tables needing Web API integration\n\n**Actions**:\n\nUse the **Explore agent** (via `Task` tool with `agent_type: \"explore\"`) to analyze the site code and data model. The Explore agent should answer these questions:\n\n### 2.1 Discover Tables\n\nAsk the Explore agent to identify all Dataverse tables that need Web API integration by examining:\n\n- `.datamodel-manifest.json` — List of tables and their columns\n- `src\u002F**\u002F*.{ts,tsx,js,jsx,vue,astro}` — Source code files that reference table data, mock data, or placeholder API calls\n- Existing `\u002F_api\u002F` fetch patterns in the code\n- TypeScript interfaces or types that map to Dataverse table schemas\n- Component files that display or manipulate data from Dataverse tables\n- Mock data files or hardcoded arrays that should be replaced with API calls\n- `TODO` or `FIXME` comments mentioning API integration\n\n**Prompt for the Explore agent:**\n\n> \"Analyze this Power Pages code site and identify all Dataverse tables that need Web API integration. Check `.datamodel-manifest.json` for the data model, then search the source code for: mock data arrays, hardcoded data, placeholder fetch calls to `\u002F_api\u002F`, TypeScript interfaces matching Dataverse column patterns (publisher prefix like `cr*_`), TODO\u002FFIXME comments about API integration, and components that display table data. For each table found, report: the table logical name, the entity set name (plural), which source files reference it, what operations are needed (read\u002Fcreate\u002Fupdate\u002Fdelete), and whether an existing API client or service already exists in `src\u002Fshared\u002F` or `src\u002Fservices\u002F`. Also check if `src\u002Fshared\u002FpowerPagesApi.ts` already exists.\"\n\n**When AI-only read mode is active (Phase 1.6 flag set):** append the following to the prompt above:\n\n> \"The caller has specified **AI-READ-ONLY** mode for tables `[tables from sentinel]` (primary=`[primary]`, expand-targets=`[expand-targets]`). Operations needed for every table in that list = **read only**. Do NOT report create\u002Fupdate\u002Fdelete call sites or mock-data replacement candidates. For each `$expand` target, also report the columns the primary's code `$select`s on that expansion (these become the minimal fields list).\"\n\n### 2.2 Identify Existing Integration Code\n\nThe Explore agent should also report:\n\n- Whether `src\u002Fshared\u002FpowerPagesApi.ts` (or equivalent API client) already exists\n- Which tables already have service files in `src\u002Fshared\u002Fservices\u002F` or `src\u002Fservices\u002F`\n- Which tables already have type definitions in `src\u002Ftypes\u002F`\n- Any framework-specific hooks\u002Fcomposables already created\n\nThis avoids duplicating work that was already done.\n\n### 2.3 Compile Integration Manifest\n\nFrom the Explore agent's findings, compile a list of tables needing integration:\n\n| Table | Logical Name | Entity Set | Operations | Files Referencing | Existing Service |\n|-------|-------------|-----------|------------|-------------------|-----------------|\n| Products | `cr4fc_product` | `cr4fc_products` | CRUD | `ProductList.tsx`, `ProductCard.tsx` | None |\n| Categories | `cr4fc_category` | `cr4fc_categories` | Read | `CategoryFilter.tsx` | None |\n\n**Output**: Complete integration manifest listing all tables, their operations, referencing files, and existing service status\n\n---\n\n## Phase 3: Review Integration Plan\n\n**Goal**: Present the integration manifest to the user and confirm which tables to integrate\n\n**Actions**:\n\n### 3.1 Present Findings\n\nShow the user:\n\n1. The tables that were identified for Web API integration\n2. For each table: which files reference it, what operations are needed\n3. Whether a shared API client already exists or needs to be created\n4. Any tables that were skipped (already have services)\n\n### 3.2 Confirm Tables\n\n\u003C!-- gate: integrate-webapi:3.2.confirm-tables | category=plan | cancel-leaves=nothing -->\n\n> 🚦 **Gate (plan · integrate-webapi:3.2.confirm-tables):** Final say on which tables get Web API integration code (client, types, services, hooks).\n>\n> **Trigger:** Explore agent surfaced candidate tables in Phase 3.1.\n> **Why we ask:** Auto-selecting all tables can generate orphaned TypeScript files for tables the user never intended to expose via Web API.\n> **Cancel leaves:** Nothing — no service\u002Ftype\u002Fhook files written yet.\n\n**When AI-only read mode is active (Phase 1.6 flag set):** skip this step entirely. Use the `tables` list parsed from the sentinel verbatim — the caller has already confirmed the selection with the user. Do not issue an `AskUserQuestion`.\n\nOtherwise, use `AskUserQuestion` to confirm:\n\n| Question | Options |\n|----------|---------|\n| I found the following tables that need Web API integration: **[list tables]**. Which tables should I integrate? | All of them (Recommended), Let me select specific tables, I need to add more tables |\n\nIf the user selects specific tables or adds more, update the integration manifest accordingly.\n\n**Output**: User-confirmed list of tables to integrate (or sentinel-supplied list in AI-only read mode)\n\n---\n\n## Phase 4: Implement Integrations\n\n**Goal**: Create Web API integration code for each confirmed table using the `webapi-integration` agent\n\n**Actions**:\n\n### 4.1 Invoke Agent Per Table\n\nFor each table, use the `Task` tool to invoke the `webapi-integration` agent at `${PLUGIN_ROOT}\u002Fagents\u002Fwebapi-integration.md`:\n\n**Prompt template for the agent:**\n\n> \"Integrate Power Pages Web API for the **[Table Display Name]** table.\n>\n> - Table logical name: `[logical_name]`\n> - Entity set name: `[entity_set_name]`\n> - Operations needed: [read\u002Fcreate\u002Fupdate\u002Fdelete]\n> - Framework: [React\u002FVue\u002FAngular\u002FAstro]\n> - Project root: [path]\n> - Source files referencing this table: [list of files]\n> - Data model manifest path: [path to .datamodel-manifest.json if available]\n>\n> Create the TypeScript types, CRUD service layer, and framework-specific hooks\u002Fcomposables. Replace any mock data or placeholder API calls in the referencing source files with the new service.\"\n\n**When AI-only read mode is active (Phase 1.6 flag set):** replace \"Operations needed: [read\u002Fcreate\u002Fupdate\u002Fdelete]\" with `Operations needed: read-only` and append to the prompt:\n\n> \"**AI-only read integration.** Do NOT emit create, update, or delete functions. Scaffold only `list\u003CTable>` (paginated) and `get\u003CTable>ById` in the service layer. Create the framework-specific read hook only (e.g. `use\u003CTable>()` with `items`, `isLoading`, `error`, `refetch`; no mutation hooks). Do not wire mock-data replacements beyond what is needed for the AI summarization caller — the upstream skill will add the summarization service on top. The shared `src\u002Fshared\u002FpowerPagesApi.ts` client is still created if it does not already exist; the caller relies on it for the AI integration's read path.\"\n\n### 4.2 Process First Table, Then Parallelize Remaining\n\nThe **first table** must be processed alone — it creates the shared `powerPagesApi.ts` client that all other tables depend on. After the first table completes and the shared client exists:\n\n- **Verify** the shared API client was created at `src\u002Fshared\u002FpowerPagesApi.ts`\n- **Then invoke all remaining tables in parallel** using multiple `Task` calls — each table creates independent files (its own types in `src\u002Ftypes\u002F`, service in `src\u002Fshared\u002Fservices\u002F`, and hook\u002Fcomposable), so there are no conflicts\n\nIf there is only one table, this step is simply sequential.\n\n### 4.3 Verify Each Integration\n\nAfter each agent completes (or after all parallel agents complete), verify the output:\n\n- Check that the expected files were created (types, service, hook\u002Fcomposable)\n- Confirm the shared API client exists after the first table is processed\n- Note any issues reported by the agent\n\n### 4.4 Git Commit\n\n**Skip when AI-only read mode is active** (Phase 1.6 flag set) — the caller batches commits.\nPrint the file list this phase would have staged so the caller can reproduce, then move on.\n\nOtherwise, after all integrations are complete, stage and commit:\n\n```bash\ngit add -A\ngit commit -m \"Add Web API integration for [table names]\"\n```\n\n**Output**: Integration code created for all confirmed tables, verified and (in normal mode) committed\n\n---\n\n## Phase 5: Verify Integrations\n\n**Goal**: Validate that all expected integration files exist, imports are correct, and the project builds successfully\n\n**Actions**:\n\n### 5.1 Verify File Inventory\n\nFor each integrated table, confirm the following files exist:\n\n- **Type definition** in `src\u002Ftypes\u002F` (e.g., `src\u002Ftypes\u002Fproduct.ts`)\n- **Service file** in `src\u002Fshared\u002Fservices\u002F` or `src\u002Fservices\u002F` (e.g., `productService.ts`)\n- **Framework-specific hook\u002Fcomposable** (e.g., `src\u002Fshared\u002Fhooks\u002FuseProducts.ts` for React, `src\u002Fcomposables\u002FuseProducts.ts` for Vue)\n\nAlso verify:\n\n- **Shared API client** at `src\u002Fshared\u002FpowerPagesApi.ts` exists\n- Each service file references `\u002F_api\u002F` endpoints\n- Each service file imports from the shared API client\n\n### 5.2 Verify Build\n\nRun the project build to catch any import errors, type errors, or missing dependencies:\n\n```bash\nnpm run build\n```\n\nIf the build fails, fix the issues before proceeding. Common issues:\n\n- Missing imports between generated files\n- Type mismatches between service and type definitions\n- Framework-specific compilation errors\n\n### 5.3 Present Verification Results\n\nPresent a table summarizing the verification:\n\n| Table | Types | Service | Hook\u002FComposable | API References |\n|-------|-------|---------|-----------------|----------------|\n| Products | `src\u002Ftypes\u002Fproduct.ts` | `src\u002Fshared\u002Fservices\u002FproductService.ts` | `src\u002Fshared\u002Fhooks\u002FuseProducts.ts` | `\u002F_api\u002Fcr4fc_products` |\n| ... | ... | ... | ... | ... |\n\n**Build status**: Pass \u002F Fail (with details)\n\n**Output**: All integration files verified, project builds successfully\n\n---\n\n## Phase 6: Setup Permissions & Settings\n\n**Goal**: Configure table permissions and Web API site settings for all integrated tables using the `table-permissions-architect` and `webapi-settings-architect` agents\n\n**Actions**:\n\n### 6.1 Check Deployment Prerequisite\n\nBoth agents require the `.powerpages-site` folder.\n\n**When AI-only read mode is active** (Phase 1.6 flag set): the caller has already gated on\n`.powerpages-site` existing — re-check it as a guard, and if it is genuinely absent, stop and\nreport the contract violation back to the caller (the caller will surface this to the user).\nDo NOT issue the deploy prompt below — the caller owns the single deploy decision.\n\nOtherwise, if `.powerpages-site` doesn't exist:\n\n\u003C!-- gate: integrate-webapi:6.1.deploy-first | category=plan | cancel-leaves=nothing -->\n\n> 🚦 **Gate (plan · integrate-webapi:6.1.deploy-first):** `.powerpages-site` missing — needed by both architect agents. Deploy first, or skip permissions setup and finish without them.\n>\n> **Trigger:** Phase 6.1 found no `.powerpages-site` folder.\n> **Why we ask:** Auto-skipping leaves the integration broken (no permissions to back the Web API calls); auto-deploying picks the wrong env.\n> **Cancel leaves:** Nothing — services\u002Ftypes\u002Fhooks from Phase 4 stay on disk regardless.\n\nUse `AskUserQuestion`:\n\n| Question | Options |\n|----------|---------|\n| The `.powerpages-site` folder was not found. The site needs to be deployed once before permissions and site settings can be configured. Would you like to deploy now? | Yes, deploy now (Recommended), Skip permissions for now — I'll set them up later |\n\n**If \"Yes, deploy now\"**: Invoke `\u002Fdeploy-site` first, then resume this phase.\n\n**If \"Skip\"**: Skip to Phase 7 with a note that permissions and site settings still need to be configured.\n\n### 6.2 Choose Permissions Source\n\n\u003C!-- gate: integrate-webapi:6.2.permissions-source | category=plan | cancel-leaves=nothing -->\n\n> 🚦 **Gate (plan · integrate-webapi:6.2.permissions-source):** Decide between uploading an existing permissions diagram (Path A) and letting the architect agents derive it (Path B). Choice routes the rest of Phase 6.\n>\n> **Trigger:** Entering Phase 6.2 after deployment prerequisite is satisfied.\n> **Why we ask:** Path A produces table permissions matching a stale or wrong diagram; Path B can take minutes to query Dataverse.\n> **Cancel leaves:** Nothing — no permission YAML written yet.\n\n**When AI-only read mode is active (Phase 1.6 flag set):** skip the permissions-source question\nentirely and default to **Path B (let the architects figure it out)** — proceed directly to\nsection 6.3. Per the Phase 1.6 contract, no `AskUserQuestion` is issued here; the caller\n(`\u002Fadd-ai-webapi`) owns this decision, and the AI-only architect prompts in 6.3 already encode\nthe read-only posture. Path A (upload an existing permissions diagram) is an interactive human\npath and does not apply to delegated runs.\n\nOtherwise, ask the user how they want to define the permissions using the `AskUserQuestion` tool:\n\n**Question**: \"How would you like to define the Web API permissions and settings for your site?\"\n\n| Option | Description |\n|--------|-------------|\n| **Upload an existing permissions diagram** | Provide an image (PNG\u002FJPG) or Mermaid diagram of your existing permissions structure |\n| **Let the architects figure it out** | The Table Permissions Architect and Web API Settings Architect will analyze your site's code, data model, and Dataverse environment, then propose permissions and settings automatically |\n\nRoute to the appropriate path:\n\n#### Path A: Upload Existing Permissions Diagram\n\n\u003C!-- gate: integrate-webapi:6.2.permissions-approval | category=plan | cancel-leaves=nothing -->\n\n> 🚦 **Gate (plan · integrate-webapi:6.2.permissions-approval):** Final sign-off on the parsed permissions plan (from the uploaded diagram) before any web-role \u002F table-permission \u002F site-setting YAML write. Fires at step 6 of the Path A sequence below.\n>\n> **Trigger:** Path A — diagram parsed and Mermaid flowchart rendered.\n> **Why we ask:** Wrong scope \u002F wrong CRUD flags get committed to `.powerpages-site\u002Ftable-permissions\u002F` — fixable but noisy in git history.\n> **Cancel leaves:** Nothing — no YAML files written yet.\n\nIf the user chooses to upload an existing diagram:\n\n1. Ask the user to provide their permissions diagram. Supported formats:\n   - **Image file** (PNG, JPG) — Use the `Read` tool to view the image and extract web roles, table permissions, CRUD flags, scopes, and site settings from it\n   - **Mermaid syntax** — The user can paste a Mermaid flowchart diagram text directly in chat\n   - **Text description** — A structured list of web roles, table permissions, scopes, and site settings\n\n2. Parse the diagram into structured format:\n   - **Web roles**: Match with existing roles from `.powerpages-site\u002Fweb-roles\u002F` by name to get their UUIDs\n   - **Table permissions**: Permission name, table logical name, web role UUID(s), scope, CRUD flags (read\u002Fcreate\u002Fwrite\u002Fdelete\u002Fappend\u002Fappendto), parent permission and relationship name (if Parent scope)\n   - **Site settings**: `Webapi\u002F\u003Ctable>\u002Fenabled` and `Webapi\u002F\u003Ctable>\u002Ffields` — **CRITICAL: fields normally list specific column logical names; only use `*` when the site relies on aggregate OData queries (`$apply`\u002Faggregate) that otherwise fail with 403**\n\n3. **Validate column names against Dataverse** — Even when using a user-provided diagram, query Dataverse for each table's column LogicalNames and verify that every column in the `Webapi\u002F\u003Ctable>\u002Ffields` values uses the exact Dataverse LogicalName (case-sensitive). Correct any mismatches before creating files.\n\n4. Cross-check with existing configuration in `.powerpages-site\u002F` to identify which permissions and site settings are new vs. already exist.\n\n5. Generate a Mermaid flowchart from the parsed data (if the user provided an image or text) for visual confirmation.\n\n6. Present the parsed permissions plan to the user for approval using `AskUserQuestion`:\n\n   | Question | Options |\n   |----------|---------|\n   | Does this permissions plan look correct? | Approve and create files (Recommended), Request changes, Cancel |\n\n7. Proceed directly to **section 6.4: Create Permission & Settings Files** with the parsed data.\n\n#### Path B: Let the Architects Figure It Out\n\nIf the user chooses to let the architects figure it out, proceed to **section 6.3: Invoke Table Permissions Agent**.\n\n### 6.3 Invoke Table Permissions and Web API Settings Agents (in Parallel)\n\nThese two agents are **independent** — invoke them in parallel using two `Task` calls simultaneously:\n\n#### Table Permissions Agent\n\nUse the `Task` tool to invoke the `table-permissions-architect` agent at `${PLUGIN_ROOT}\u002Fagents\u002Ftable-permissions-architect.md`:\n\n**Prompt (default — full CRUD):**\n\n> \"Analyze this Power Pages code site and propose table permissions. The following tables have been integrated with Web API: [list of tables integrated in Phase 4]. Check for existing web roles and table permissions. Propose a complete table permissions plan covering all integrated tables. After I approve the plan, create the web role and table permission YAML files using the deterministic scripts.\"\n\n**Prompt (AI-only read mode active):** append to the default prompt:\n\n> \"**AI-only read integration.** The caller is `\u002Fadd-ai-webapi` and these tables will be summarised by `\u002F_api\u002Fsummarization\u002Fdata\u002Fv1.0\u002F` — the endpoint is semantically a read and never mutates Dataverse. Therefore:\n>\n> - Set `read: true` **only**. Do NOT propose `create`, `write`, or `delete` even if the default convention would include them.\n> - For collection-valued `$expand` targets (primary=`[primary]`, expand-targets=`[expand-targets]`), use **Parent scope** with `read: true`, and add `appendTo: true` on the parent table permission so the relationship traversal is allowed.\n> - If no suitable web role exists, surface this back to the caller — `\u002Fadd-ai-webapi` will invoke `\u002Fcreate-webroles` up front; do not block on role creation here.\"\n\nThe agent will:\n\n1. Analyze the site and propose a plan (with Mermaid diagram)\n2. Present the plan via plan mode for user approval\n3. After approval, create any needed web roles using `create-web-role.js`\n4. Create all table permission files using `create-table-permission.js`\n5. Return a summary of created files\n\n#### Web API Settings Agent\n\nUse the `Task` tool to invoke the `webapi-settings-architect` agent at `${PLUGIN_ROOT}\u002Fagents\u002Fwebapi-settings-architect.md`:\n\n**Prompt (default — full CRUD):**\n\n> \"Analyze this Power Pages code site and propose Web API site settings. The following tables have been integrated with Web API: [list of tables integrated in Phase 4]. Check for existing site settings and query Dataverse for exact column LogicalNames. Propose site settings with case-sensitive validated column names. After I approve the plan, create the site setting YAML files using the deterministic scripts.\"\n\n**Prompt (AI-only read mode active):** append to the default prompt:\n\n> \"**AI-only read integration.** These tables will be summarised by `\u002F_api\u002Fsummarization\u002Fdata\u002Fv1.0\u002F`. The fields list rules are stricter than the default CRUD posture:\n>\n> - `Webapi\u002F\u003Ctable>\u002Ffields` must contain **exactly** the columns named in the primary's `$select` \u002F `$expand` — no more, no less.\n> - Do **not** include the primary key column. The summarization endpoint carries the record id in the URL path; Microsoft's shipped case preset ships `Webapi\u002Fincident\u002Ffields = description,title` with no `incidentid`.\n> - For lookup columns, include **only** the `_\u003Ccol>_value` OData read form. Do NOT add the write form `\u003Ccol>` unless the same table has non-AI mutation code elsewhere.\n> - Still query Dataverse for exact LogicalNames (case-sensitive) — case mismatches produce 403.\"\n\nThe agent will:\n\n1. Analyze the site, query Dataverse for exact column LogicalNames\n2. Cross-validate column names (case-sensitive)\n3. Present the plan via plan mode for user approval\n4. After approval, create all site setting files using `create-site-setting.js`\n5. Return a summary of created files\n\nWait for **both** agents to complete before proceeding to 6.4.\n\n### 6.4 Create Permission & Settings Files (Path A Only)\n\n**This section applies only to Path A (user-provided permissions diagram).** For Path B, the architect agents create the files directly in section 6.3.\n\nAfter parsing the user's diagram, create the YAML files using the deterministic scripts below. **Do NOT write YAML files manually** — always use these scripts which handle UUID generation, field ordering, formatting, and file naming automatically.\n\n#### 6.4.1 Create Web Roles (if needed)\n\nIf the plan requires new web roles that don't already exist, create them first (their UUIDs are needed for table permissions):\n\n```bash\nnode \"${PLUGIN_ROOT}\u002Fskills\u002Fcreate-webroles\u002Fscripts\u002Fcreate-web-role.js\" --projectRoot \"\u003CPROJECT_ROOT>\" --name \"\u003CRole Name>\" [--anonymous] [--authenticated]\n```\n\nCapture the JSON output (`{ \"id\": \"\u003Cuuid>\", \"filePath\": \"\u003Cpath>\" }`) — use the `id` as the `--webRoleIds` value when creating table permissions.\n\n#### 6.4.2 Create Table Permissions\n\nFor each table permission in the plan. Process **parent permissions before child permissions** — children need the parent's UUID from the JSON output.\n\n**When AI-only read mode is active (Phase 1.6 flag set):** the default flag set is `--read` only. Do NOT pass `--create`, `--write`, or `--delete` for any permission in scope — AI summarization reads never mutate. For Parent-scope child permissions, still pass `--parentPermissionId` and `--parentRelationshipName`; on the parent permission add `--appendto` so the AI endpoint can traverse the relationship.\n\n**For Global\u002FContact\u002FAccount\u002FSelf scope:**\n\n```bash\nnode \"${PLUGIN_ROOT}\u002Fscripts\u002Fcreate-table-permission.js\" --projectRoot \"\u003CPROJECT_ROOT>\" --permissionName \"\u003CPermission Name>\" --tableName \"\u003Ctable_logical_name>\" --webRoleIds \"\u003Cuuid1,uuid2>\" --scope \"Global\" [--read] [--create] [--write] [--delete] [--append] [--appendto]\nnode \"${PLUGIN_ROOT}\u002Fscripts\u002Fcreate-table-permission.js\" --projectRoot \"\u003CPROJECT_ROOT>\" --permissionName \"\u003CPermission Name>\" --tableName \"\u003Ctable_logical_name>\" --webRoleIds \"\u003Cuuid1,uuid2>\" --scope \"Contact\" --contactRelationshipName \"\u003Clookup_to_contact>\" [--read] [--create] [--write] [--delete] [--append] [--appendto]\nnode \"${PLUGIN_ROOT}\u002Fscripts\u002Fcreate-table-permission.js\" --projectRoot \"\u003CPROJECT_ROOT>\" --permissionName \"\u003CPermission Name>\" --tableName \"\u003Ctable_logical_name>\" --webRoleIds \"\u003Cuuid1,uuid2>\" --scope \"Account\" --accountRelationshipName \"\u003Clookup_to_account>\" [--read] [--create] [--write] [--delete] [--append] [--appendto]\nnode \"${PLUGIN_ROOT}\u002Fscripts\u002Fcreate-table-permission.js\" --projectRoot \"\u003CPROJECT_ROOT>\" --permissionName \"\u003CPermission Name>\" --tableName \"\u003Ctable_logical_name>\" --webRoleIds \"\u003Cuuid1,uuid2>\" --scope \"Self\" [--read] [--create] [--write] [--delete] [--append] [--appendto]\n```\n\n**For Parent scope** (requires parent permission UUID and relationship name):\n\n```bash\nnode \"${PLUGIN_ROOT}\u002Fscripts\u002Fcreate-table-permission.js\" --projectRoot \"\u003CPROJECT_ROOT>\" --permissionName \"\u003CPermission Name>\" --tableName \"\u003Ctable_logical_name>\" --webRoleIds \"\u003Cuuid1>\" --scope \"Parent\" --parentPermissionId \"\u003Cparent-uuid>\" --parentRelationshipName \"\u003Crelationship_name>\" [--read] [--create] [--write] [--delete] [--append] [--appendto]\n```\n\nEach invocation outputs `{ \"id\": \"\u003Cuuid>\", \"filePath\": \"\u003Cpath>\" }`. Use the `id` as `--parentPermissionId` for child permissions.\n\n#### 6.4.3 Create Site Settings\n\nFor each site setting in the plan:\n\n**Enabled setting (boolean):**\n\n```bash\nnode \"${PLUGIN_ROOT}\u002Fscripts\u002Fcreate-site-setting.js\" --projectRoot \"\u003CPROJECT_ROOT>\" --name \"Webapi\u002F\u003Ctable>\u002Fenabled\" --value \"true\" --description \"Enable Web API access for \u003Ctable> table\" --type \"boolean\"\n```\n\n**Fields setting (string — use the validated column names from the diagram):**\n\n```bash\nnode \"${PLUGIN_ROOT}\u002Fscripts\u002Fcreate-site-setting.js\" --projectRoot \"\u003CPROJECT_ROOT>\" --name \"Webapi\u002F\u003Ctable>\u002Ffields\" --value \"\u003Ccomma-separated-validated-columns>\" --description \"Allowed fields for \u003Ctable> Web API access\"\n```\n\n**Inner error setting (boolean, optional for debugging):**\n\n```bash\nnode \"${PLUGIN_ROOT}\u002Fscripts\u002Fcreate-site-setting.js\" --projectRoot \"\u003CPROJECT_ROOT>\" --name \"Webapi\u002Ferror\u002Finnererror\" --value \"true\" --description \"Enable detailed error messages for debugging\" --type \"boolean\"\n```\n\n**Important**: The `--value` for fields settings MUST use exact Dataverse LogicalNames (case-sensitive, all lowercase) for normal CRUD\u002Fread scenarios. Using incorrect casing causes 403 Forbidden errors.\n\n**Aggregate exception**: If the site uses aggregate OData queries (`$apply`, `aggregate`, grouped totals, etc.), set `Webapi\u002F\u003Ctable>\u002Ffields` to `*`. Power Pages rejects some aggregate queries with 403 unless wildcard field access is enabled.\n\n**Lookup columns**: For every lookup column, include **both** the LogicalName (`cr87b_categoryid`) AND the OData computed attribute (`_cr87b_categoryid_value`) in the fields value. The Power Pages Web API does a literal match — the LogicalName is needed for write operations, the `_..._value` form is needed for read operations (`$select`, `$filter`). Missing either form causes 403 errors.\n\n**AI-only read mode (Phase 1.6 flag set)**: the fields-value rules tighten:\n\n- Include only the columns named in the primary's `$select` \u002F `$expand`. Extra columns expand the allowlist without any caller reading them.\n- Do NOT include the primary key. The summarization endpoint carries the record id in the URL path; Microsoft's shipped case preset ships `Webapi\u002Fincident\u002Ffields = description,title` with no `incidentid`.\n- For lookup columns, include only the `_\u003Ccol>_value` read form. Omit the LogicalName write form — no write operations run against these tables in AI mode.\n- The aggregate `*` exception still applies if the summarised table also has aggregate OData code elsewhere in the site.\n\n### 6.5 Git Commit\n\n**Skip when AI-only read mode is active** (Phase 1.6 flag set) — the caller batches commits.\nPrint the file list this phase would have staged so the caller can reproduce, then move on.\n\nOtherwise, stage and commit the permission and settings files:\n\n```bash\ngit add -A\ngit commit -m \"Add table permissions and Web API site settings for [table names]\"\n```\n\n**Output**: Table permissions and site settings created, verified, and (in normal mode) committed\n\n---\n\n## Phase 7: Review & Deploy\n\n**Goal**: Present a summary of all work performed and offer deployment\n\n**Actions**:\n\n### 7.1 Record Skill Usage\n\n> Reference: `${PLUGIN_ROOT}\u002Freferences\u002Fskill-tracking-reference.md`\n\nFollow the skill tracking instructions in the reference to record this skill's usage. Use `--skillName \"IntegrateWebApi\"`.\n\n### 7.2 Present Summary\n\nPresent a summary of everything that was done:\n\n| Step | Status | Details |\n|------|--------|---------|\n| API Client | Created\u002FExisted | `src\u002Fshared\u002FpowerPagesApi.ts` |\n| Types | Created | `src\u002Ftypes\u002Fproduct.ts`, `src\u002Ftypes\u002Fcategory.ts` |\n| Services | Created | `src\u002Fshared\u002Fservices\u002FproductService.ts`, etc. |\n| Hooks | Created | `src\u002Fshared\u002Fhooks\u002FuseProducts.ts`, etc. |\n| Components Updated | X files | Mock data replaced with API calls |\n| Table Permissions | Created | X permission files |\n| Site Settings | Created | X setting files |\n\n### 7.3 Ask to Deploy\n\n\u003C!-- gate: integrate-webapi:7.3.deploy | category=plan | cancel-leaves=nothing -->\n\n> 🚦 **Gate (plan · integrate-webapi:7.3.deploy):** Post-integration deploy prompt — Web API calls won't work until permissions and site settings are deployed.\n>\n> **Trigger:** All integration code + permissions YAML committed.\n> **Why we ask:** Auto-deploy picks whatever env PAC CLI happens to point at.\n> **Cancel leaves:** Nothing — integration artifacts stay on disk; no deploy fired.\n\n**Skip when AI-only read mode is active** (Phase 1.6 flag set) — the caller owns the single\nend-of-orchestration deploy decision. Return the Phase 7.2 summary and stop.\n\nOtherwise, use `AskUserQuestion`:\n\n| Question | Options |\n|----------|---------|\n| The Web API integration and permissions are ready. To make everything live, the site needs to be deployed. Would you like to deploy now? | Yes, deploy now (Recommended), No, I'll deploy later |\n\n**If \"Yes, deploy now\"**: Invoke the `\u002Fdeploy-site` skill to deploy the site.\n\n**If \"No, I'll deploy later\"**: Acknowledge and remind:\n\n> \"No problem! Remember to deploy your site using `\u002Fdeploy-site` when you're ready. The Web API calls will not work until the site is deployed with the new permissions.\"\n\n### 7.4 Post-Deploy Notes\n\n**Skip when AI-only read mode is active** — the caller emits its own post-deploy guidance\nthat covers AI-specific concerns (governance hierarchy, runtime version, Bing dependency).\n\nOtherwise, after deployment (or if skipped), remind the user:\n\n- **Test the API**: Open the deployed site and verify Web API calls work in the browser's Network tab\n- **Check permissions**: If any API call returns 403, verify table permissions and site settings are correct. The most common cause of 403 errors is column names in `Webapi\u002F\u003Ctable>\u002Ffields` not matching the exact Dataverse LogicalName (case-sensitive — must be all lowercase). If the failing request uses aggregate OData (`$apply`, `aggregate`, grouped totals), also verify `Webapi\u002F\u003Ctable>\u002Ffields` is set to `*`.\n- **Disable innererror in production**: If `Webapi\u002Ferror\u002Finnererror` was enabled for debugging, disable it before going live\n- **Web roles**: Users must be assigned the appropriate web roles to access protected APIs\n\n**Output**: Summary presented; deployment completed or deferred (normal mode), or returned to caller (AI-only read mode).\n\n---\n\n## Important Notes\n\n### Throughout All Phases\n\n- **Use TaskCreate\u002FTaskUpdate** to track progress at every phase\n- **Ask for user confirmation** at key decision points (see list below)\n- **First table sequential, then parallel** — the first table creates the shared API client; after that, remaining tables can be processed in parallel since each creates independent files\n- **Commit at milestones** — after integration code and after permission files\n- **Verify each integration** — confirm expected files exist after each agent invocation\n\n### Key Decision Points (Wait for User)\n\n1. After Phase 2: Confirm which tables to integrate\n2. After Phase 3: Approve integration plan\n3. At Phase 6.1: Deploy now or skip permissions (if `.powerpages-site` missing)\n4. At Phase 6.2: Choose permissions source (upload diagram or let the architects analyze)\n5. At Phase 6.3: Approve table permissions plan and Web API site settings plan (both agents run in parallel for Path B, each presents its own plan for approval)\n6. At Phase 7.2: Deploy now or deploy later\n\n### Progress Tracking\n\nBefore starting Phase 1, create a task list with all phases using `TaskCreate`:\n\n| Task subject | activeForm | Description |\n|-------------|------------|-------------|\n| Verify site exists | Verifying site prerequisites | Locate project root, detect framework, check data model and deployment status |\n| Explore integration points | Analyzing code for integration points | Use Explore agent to discover tables, existing services, and compile integration manifest |\n| Review integration plan | Reviewing integration plan with user | Present findings and confirm which tables to integrate |\n| Implement integrations | Implementing Web API integrations | Invoke webapi-integration agent for first table (creates shared client), then remaining tables in parallel, verify output, git commit |\n| Verify integrations | Verifying integrations | Validate all expected files exist, check imports and API references, run project build |\n| Setup permissions and settings | Configuring permissions and site settings | Choose permissions source (upload diagram or architects), invoke table-permissions-architect and webapi-settings-architect agents in parallel, create YAML files with case-sensitive validated column names, git commit |\n| Review and deploy | Reviewing summary and deploying | Present summary, ask about deployment, provide post-deploy guidance |\n\nMark each task `in_progress` when starting it and `completed` when done via `TaskUpdate`. This gives the user visibility into progress and keeps the workflow deterministic.\n\n---\n\n**Begin with Phase 1: Verify Site Exists**\n",{"data":44,"body":48},{"name":4,"description":6,"user-invocable":45,"allowed-tools":46,"model":47},true,"Read, Write, Edit, Bash, Grep, Glob, AskUserQuestion, Task, TaskCreate, TaskUpdate, TaskList","opus",{"type":49,"children":50},"root",[51,78,85,90,97,207,257,267,271,277,367,370,376,386,396,403,438,455,461,473,479,499,505,517,529,534,540,552,561,570,576,608,771,779,898,908,918,921,927,936,944,972,978,983,1054,1062,1115,1125,1186,1192,1197,1245,1250,1256,1261,1400,1409,1412,1418,1427,1435,1441,1446,1469,1475,1514,1536,1548,1594,1599,1608,1611,1617,1633,1641,1647,1673,1681,1779,1802,1877,1883,1902,1951,1956,1962,1967,1985,1991,2001,2006,2071,2080,2083,2089,2098,2106,2112,2117,2198,2203,2240,2246,2251,2276,2281,2299,2305,2310,2411,2421,2430,2433,2439,2461,2469,2475,2487,2504,2516,2565,2576,2615,2632,2642,2648,2683,2713,2725,2734,2788,2793,2800,2843,2848,3068,3074,3085,3091,3110,3116,3139,3147,3162,3172,3311,3316,3356,3362,3385,3392,3406,3414,3527,3531,3563,3575,3581,3591,3603,3609,3614,3710,3739,3745,3757,3818,3826,4571,4581,4797,4823,4829,4834,4842,4963,4971,5071,5079,5195,5212,5250,5304,5314,5376,5382,5390,5395,5445,5454,5457,5463,5472,5480,5486,5500,5512,5518,5523,5693,5699,5734,5743,5753,5786,5802,5812,5827,5833,5842,5847,5929,5938,5941,5947,5953,6004,6010,6050,6056,6068,6220,6249,6252,6260],{"type":52,"tag":53,"props":54,"children":55},"element","blockquote",{},[56],{"type":52,"tag":57,"props":58,"children":59},"p",{},[60,67,69,76],{"type":52,"tag":61,"props":62,"children":63},"strong",{},[64],{"type":65,"value":66},"text","Plugin check",{"type":65,"value":68},": Run ",{"type":52,"tag":70,"props":71,"children":73},"code",{"className":72},[],[74],{"type":65,"value":75},"node \"${PLUGIN_ROOT}\u002Fscripts\u002Fcheck-version.js\"",{"type":65,"value":77}," — if it outputs a message, show it to the user before proceeding.",{"type":52,"tag":79,"props":80,"children":82},"h1",{"id":81},"integrate-web-api",[83],{"type":65,"value":84},"Integrate Web API",{"type":52,"tag":57,"props":86,"children":87},{},[88],{"type":65,"value":89},"Integrate Power Pages Web API into a code site's frontend. This skill orchestrates the full lifecycle: analyzing where integrations are needed, implementing API client code for each table, configuring permissions and site settings, and deploying the site.",{"type":52,"tag":91,"props":92,"children":94},"h2",{"id":93},"core-principles",[95],{"type":65,"value":96},"Core Principles",{"type":52,"tag":98,"props":99,"children":100},"ul",{},[101,120,146,163,197],{"type":52,"tag":102,"props":103,"children":104},"li",{},[105,110,112,118],{"type":52,"tag":61,"props":106,"children":107},{},[108],{"type":65,"value":109},"First table sequential, then parallel",{"type":65,"value":111},": The first table must be processed alone because it creates the shared ",{"type":52,"tag":70,"props":113,"children":115},{"className":114},[],[116],{"type":65,"value":117},"powerPagesApi.ts",{"type":65,"value":119}," client. Once that exists, remaining tables can be processed in parallel since each creates independent files (types, service, hooks).",{"type":52,"tag":102,"props":121,"children":122},{},[123,128,130,136,138,144],{"type":52,"tag":61,"props":124,"children":125},{},[126],{"type":65,"value":127},"Parallelize independent agents",{"type":65,"value":129},": The ",{"type":52,"tag":70,"props":131,"children":133},{"className":132},[],[134],{"type":65,"value":135},"table-permissions-architect",{"type":65,"value":137}," and ",{"type":52,"tag":70,"props":139,"children":141},{"className":140},[],[142],{"type":65,"value":143},"webapi-settings-architect",{"type":65,"value":145}," agents are independent — invoke them in parallel rather than sequentially.",{"type":52,"tag":102,"props":147,"children":148},{},[149,154,155,161],{"type":52,"tag":61,"props":150,"children":151},{},[152],{"type":65,"value":153},"Permissions require deployment",{"type":65,"value":129},{"type":52,"tag":70,"props":156,"children":158},{"className":157},[],[159],{"type":65,"value":160},".powerpages-site",{"type":65,"value":162}," folder must exist before table permissions and site settings can be configured. Integration code can be written without it, but permissions cannot.",{"type":52,"tag":102,"props":164,"children":165},{},[166,171,173,179,181,187,189,195],{"type":52,"tag":61,"props":167,"children":168},{},[169],{"type":65,"value":170},"AI-only read mode is opt-in",{"type":65,"value":172},": When invoked by another skill (e.g. ",{"type":52,"tag":70,"props":174,"children":176},{"className":175},[],[177],{"type":65,"value":178},"\u002Fadd-ai-webapi",{"type":65,"value":180},") with the ",{"type":52,"tag":70,"props":182,"children":184},{"className":183},[],[185],{"type":65,"value":186},"[AI-READ-ONLY]",{"type":65,"value":188}," sentinel in ",{"type":52,"tag":70,"props":190,"children":192},{"className":191},[],[193],{"type":65,"value":194},"$ARGUMENTS",{"type":65,"value":196},", the flow produces read-only code and hardens the settings\u002Fpermissions for AI summarization reads. See Phase 1.6 for the contract. Human invocations never trigger this mode.",{"type":52,"tag":102,"props":198,"children":199},{},[200,205],{"type":52,"tag":61,"props":201,"children":202},{},[203],{"type":65,"value":204},"Use TaskCreate\u002FTaskUpdate",{"type":65,"value":206},": Track all progress throughout all phases — create the todo list upfront with all phases before starting any work.",{"type":52,"tag":53,"props":208,"children":209},{},[210,218],{"type":52,"tag":57,"props":211,"children":212},{},[213],{"type":52,"tag":61,"props":214,"children":215},{},[216],{"type":65,"value":217},"Prerequisites:",{"type":52,"tag":98,"props":219,"children":220},{},[221,232,245],{"type":52,"tag":102,"props":222,"children":223},{},[224,226],{"type":65,"value":225},"An existing Power Pages code site created via ",{"type":52,"tag":70,"props":227,"children":229},{"className":228},[],[230],{"type":65,"value":231},"\u002Fcreate-site",{"type":52,"tag":102,"props":233,"children":234},{},[235,237,243],{"type":65,"value":236},"A Dataverse data model (tables\u002Fcolumns) already set up via ",{"type":52,"tag":70,"props":238,"children":240},{"className":239},[],[241],{"type":65,"value":242},"\u002Fsetup-datamodel",{"type":65,"value":244}," or created manually",{"type":52,"tag":102,"props":246,"children":247},{},[248,250,255],{"type":65,"value":249},"The site must be deployed at least once (",{"type":52,"tag":70,"props":251,"children":253},{"className":252},[],[254],{"type":65,"value":160},{"type":65,"value":256}," folder must exist) for permissions setup",{"type":52,"tag":57,"props":258,"children":259},{},[260,265],{"type":52,"tag":61,"props":261,"children":262},{},[263],{"type":65,"value":264},"Initial request:",{"type":65,"value":266}," $ARGUMENTS",{"type":52,"tag":268,"props":269,"children":270},"hr",{},[],{"type":52,"tag":91,"props":272,"children":274},{"id":273},"workflow",[275],{"type":65,"value":276},"Workflow",{"type":52,"tag":278,"props":279,"children":280},"ol",{},[281,291,301,311,329,339,349],{"type":52,"tag":102,"props":282,"children":283},{},[284,289],{"type":52,"tag":61,"props":285,"children":286},{},[287],{"type":65,"value":288},"Verify Site Exists",{"type":65,"value":290}," — Locate the Power Pages project and verify prerequisites",{"type":52,"tag":102,"props":292,"children":293},{},[294,299],{"type":52,"tag":61,"props":295,"children":296},{},[297],{"type":65,"value":298},"Explore Integration Points",{"type":65,"value":300}," — Analyze site code and data model to identify tables needing Web API integration",{"type":52,"tag":102,"props":302,"children":303},{},[304,309],{"type":52,"tag":61,"props":305,"children":306},{},[307],{"type":65,"value":308},"Review Integration Plan",{"type":65,"value":310}," — Present findings to the user and confirm which tables to integrate",{"type":52,"tag":102,"props":312,"children":313},{},[314,319,321,327],{"type":52,"tag":61,"props":315,"children":316},{},[317],{"type":65,"value":318},"Implement Integrations",{"type":65,"value":320}," — Use the ",{"type":52,"tag":70,"props":322,"children":324},{"className":323},[],[325],{"type":65,"value":326},"webapi-integration",{"type":65,"value":328}," agent for each table",{"type":52,"tag":102,"props":330,"children":331},{},[332,337],{"type":52,"tag":61,"props":333,"children":334},{},[335],{"type":65,"value":336},"Verify Integrations",{"type":65,"value":338}," — Validate all expected files exist and the project builds successfully",{"type":52,"tag":102,"props":340,"children":341},{},[342,347],{"type":52,"tag":61,"props":343,"children":344},{},[345],{"type":65,"value":346},"Setup Permissions & Settings",{"type":65,"value":348}," — Choose permissions source (upload diagram or let the architects analyze), then configure table permissions and Web API site settings with case-sensitive validated column names",{"type":52,"tag":102,"props":350,"children":351},{},[352,357,359,365],{"type":52,"tag":61,"props":353,"children":354},{},[355],{"type":65,"value":356},"Review & Deploy",{"type":65,"value":358}," — Ask the user to deploy the site and invoke ",{"type":52,"tag":70,"props":360,"children":362},{"className":361},[],[363],{"type":65,"value":364},"\u002Fdeploy-site",{"type":65,"value":366}," if confirmed",{"type":52,"tag":268,"props":368,"children":369},{},[],{"type":52,"tag":91,"props":371,"children":373},{"id":372},"phase-1-verify-site-exists",[374],{"type":65,"value":375},"Phase 1: Verify Site Exists",{"type":52,"tag":57,"props":377,"children":378},{},[379,384],{"type":52,"tag":61,"props":380,"children":381},{},[382],{"type":65,"value":383},"Goal",{"type":65,"value":385},": Locate the Power Pages project root and confirm that prerequisites are met",{"type":52,"tag":57,"props":387,"children":388},{},[389,394],{"type":52,"tag":61,"props":390,"children":391},{},[392],{"type":65,"value":393},"Actions",{"type":65,"value":395},":",{"type":52,"tag":397,"props":398,"children":400},"h3",{"id":399},"_11-locate-project",[401],{"type":65,"value":402},"1.1 Locate Project",{"type":52,"tag":57,"props":404,"children":405},{},[406,408,414,416,422,424,429,430,436],{"type":65,"value":407},"Look for ",{"type":52,"tag":70,"props":409,"children":411},{"className":410},[],[412],{"type":65,"value":413},"powerpages.config.json",{"type":65,"value":415}," in the current directory or immediate subdirectories to find the project root. Use your file-search tool (e.g., ",{"type":52,"tag":70,"props":417,"children":419},{"className":418},[],[420],{"type":65,"value":421},"Glob",{"type":65,"value":423}," with patterns ",{"type":52,"tag":70,"props":425,"children":427},{"className":426},[],[428],{"type":65,"value":413},{"type":65,"value":137},{"type":52,"tag":70,"props":431,"children":433},{"className":432},[],[434],{"type":65,"value":435},"*\u002Fpowerpages.config.json",{"type":65,"value":437},") rather than a shell-specific command.",{"type":52,"tag":57,"props":439,"children":440},{},[441,446,448,453],{"type":52,"tag":61,"props":442,"children":443},{},[444],{"type":65,"value":445},"If not found",{"type":65,"value":447},": Tell the user to create a site first with ",{"type":52,"tag":70,"props":449,"children":451},{"className":450},[],[452],{"type":65,"value":231},{"type":65,"value":454},".",{"type":52,"tag":397,"props":456,"children":458},{"id":457},"_12-read-existing-config",[459],{"type":65,"value":460},"1.2 Read Existing Config",{"type":52,"tag":57,"props":462,"children":463},{},[464,466,471],{"type":65,"value":465},"Read ",{"type":52,"tag":70,"props":467,"children":469},{"className":468},[],[470],{"type":65,"value":413},{"type":65,"value":472}," to get the site name.",{"type":52,"tag":397,"props":474,"children":476},{"id":475},"_13-detect-framework",[477],{"type":65,"value":478},"1.3 Detect Framework",{"type":52,"tag":57,"props":480,"children":481},{},[482,483,489,491,497],{"type":65,"value":465},{"type":52,"tag":70,"props":484,"children":486},{"className":485},[],[487],{"type":65,"value":488},"package.json",{"type":65,"value":490}," to determine the framework (React, Vue, Angular, or Astro). See ",{"type":52,"tag":70,"props":492,"children":494},{"className":493},[],[495],{"type":65,"value":496},"${PLUGIN_ROOT}\u002Freferences\u002Fframework-conventions.md",{"type":65,"value":498}," for the full framework detection mapping.",{"type":52,"tag":397,"props":500,"children":502},{"id":501},"_14-check-for-data-model",[503],{"type":65,"value":504},"1.4 Check for Data Model",{"type":52,"tag":57,"props":506,"children":507},{},[508,509,515],{"type":65,"value":407},{"type":52,"tag":70,"props":510,"children":512},{"className":511},[],[513],{"type":65,"value":514},".datamodel-manifest.json",{"type":65,"value":516}," to discover available tables:",{"type":52,"tag":518,"props":519,"children":524},"pre",{"className":520,"code":522,"language":65,"meta":523},[521],"language-text","**\u002F.datamodel-manifest.json\n","",[525],{"type":52,"tag":70,"props":526,"children":527},{"__ignoreMap":523},[528],{"type":65,"value":522},{"type":52,"tag":57,"props":530,"children":531},{},[532],{"type":65,"value":533},"If found, read it — this is the primary source for table discovery.",{"type":52,"tag":397,"props":535,"children":537},{"id":536},"_15-check-deployment-status",[538],{"type":65,"value":539},"1.5 Check Deployment Status",{"type":52,"tag":57,"props":541,"children":542},{},[543,545,550],{"type":65,"value":544},"Look for the ",{"type":52,"tag":70,"props":546,"children":548},{"className":547},[],[549],{"type":65,"value":160},{"type":65,"value":551}," folder:",{"type":52,"tag":518,"props":553,"children":556},{"className":554,"code":555,"language":65,"meta":523},[521],"**\u002F.powerpages-site\n",[557],{"type":52,"tag":70,"props":558,"children":559},{"__ignoreMap":523},[560],{"type":65,"value":555},{"type":52,"tag":57,"props":562,"children":563},{},[564,568],{"type":52,"tag":61,"props":565,"children":566},{},[567],{"type":65,"value":445},{"type":65,"value":569},": Warn the user that the permissions phase (Phase 6) will require deployment first. The integration code (Phases 2–5) can still proceed.",{"type":52,"tag":397,"props":571,"children":573},{"id":572},"_16-detect-ai-only-read-mode-skill-to-skill-invocation",[574],{"type":65,"value":575},"1.6 Detect AI-only read mode (skill-to-skill invocation)",{"type":52,"tag":57,"props":577,"children":578},{},[579,581,586,588,593,595,600,602,607],{"type":65,"value":580},"Inspect ",{"type":52,"tag":70,"props":582,"children":584},{"className":583},[],[585],{"type":65,"value":194},{"type":65,"value":587},". If the text begins with the sentinel ",{"type":52,"tag":70,"props":589,"children":591},{"className":590},[],[592],{"type":65,"value":186},{"type":65,"value":594},", the caller is another skill (typically ",{"type":52,"tag":70,"props":596,"children":598},{"className":597},[],[599],{"type":65,"value":178},{"type":65,"value":601},") that has already analysed the site and decided which tables need Layer 1\u002F2 prerequisites for AI summarization reads. Parse the following structured tokens out of ",{"type":52,"tag":70,"props":603,"children":605},{"className":604},[],[606],{"type":65,"value":194},{"type":65,"value":395},{"type":52,"tag":609,"props":610,"children":611},"table",{},[612,636],{"type":52,"tag":613,"props":614,"children":615},"thead",{},[616],{"type":52,"tag":617,"props":618,"children":619},"tr",{},[620,626,631],{"type":52,"tag":621,"props":622,"children":623},"th",{},[624],{"type":65,"value":625},"Token",{"type":52,"tag":621,"props":627,"children":628},{},[629],{"type":65,"value":630},"Required",{"type":52,"tag":621,"props":632,"children":633},{},[634],{"type":65,"value":635},"Meaning",{"type":52,"tag":637,"props":638,"children":639},"tbody",{},[640,663,684,713,750],{"type":52,"tag":617,"props":641,"children":642},{},[643,653,658],{"type":52,"tag":644,"props":645,"children":646},"td",{},[647],{"type":52,"tag":70,"props":648,"children":650},{"className":649},[],[651],{"type":65,"value":652},"mode=ai-read-only",{"type":52,"tag":644,"props":654,"children":655},{},[656],{"type":65,"value":657},"Yes",{"type":52,"tag":644,"props":659,"children":660},{},[661],{"type":65,"value":662},"Confirms the posture; any other value is rejected with an error.",{"type":52,"tag":617,"props":664,"children":665},{},[666,675,679],{"type":52,"tag":644,"props":667,"children":668},{},[669],{"type":52,"tag":70,"props":670,"children":672},{"className":671},[],[673],{"type":65,"value":674},"primary=\u003Clogical_name>",{"type":52,"tag":644,"props":676,"children":677},{},[678],{"type":65,"value":657},{"type":52,"tag":644,"props":680,"children":681},{},[682],{"type":65,"value":683},"The primary table being summarised. Missing → stop and report the contract violation to the caller.",{"type":52,"tag":617,"props":685,"children":686},{},[687,696,700],{"type":52,"tag":644,"props":688,"children":689},{},[690],{"type":52,"tag":70,"props":691,"children":693},{"className":692},[],[694],{"type":65,"value":695},"tables=\u003Ccsv>",{"type":52,"tag":644,"props":697,"children":698},{},[699],{"type":65,"value":657},{"type":52,"tag":644,"props":701,"children":702},{},[703,705,711],{"type":65,"value":704},"Comma-separated list of all tables in scope (primary + every ",{"type":52,"tag":70,"props":706,"children":708},{"className":707},[],[709],{"type":65,"value":710},"$expand",{"type":65,"value":712}," target).",{"type":52,"tag":617,"props":714,"children":715},{},[716,725,730],{"type":52,"tag":644,"props":717,"children":718},{},[719],{"type":52,"tag":70,"props":720,"children":722},{"className":721},[],[723],{"type":65,"value":724},"expand-targets=\u003Ccsv>",{"type":52,"tag":644,"props":726,"children":727},{},[728],{"type":65,"value":729},"No",{"type":52,"tag":644,"props":731,"children":732},{},[733,735,741,743,748],{"type":65,"value":734},"Sub-list of ",{"type":52,"tag":70,"props":736,"children":738},{"className":737},[],[739],{"type":65,"value":740},"tables",{"type":65,"value":742}," that are ",{"type":52,"tag":70,"props":744,"children":746},{"className":745},[],[747],{"type":65,"value":710},{"type":65,"value":749}," targets; defaults to empty.",{"type":52,"tag":617,"props":751,"children":752},{},[753,762,766],{"type":52,"tag":644,"props":754,"children":755},{},[756],{"type":52,"tag":70,"props":757,"children":759},{"className":758},[],[760],{"type":65,"value":761},"caller=\u003Cskill-name>",{"type":52,"tag":644,"props":763,"children":764},{},[765],{"type":65,"value":729},{"type":52,"tag":644,"props":767,"children":768},{},[769],{"type":65,"value":770},"Informational — used in commit messages and the final summary.",{"type":52,"tag":57,"props":772,"children":773},{},[774],{"type":52,"tag":61,"props":775,"children":776},{},[777],{"type":65,"value":778},"When the sentinel is present:",{"type":52,"tag":98,"props":780,"children":781},{},[782,794,806,825,830,850,863,881],{"type":52,"tag":102,"props":783,"children":784},{},[785,787,792],{"type":65,"value":786},"Set an internal flag ",{"type":52,"tag":61,"props":788,"children":789},{},[790],{"type":65,"value":791},"AI-only read mode = true",{"type":65,"value":793}," that every downstream phase consults.",{"type":52,"tag":102,"props":795,"children":796},{},[797,799,804],{"type":65,"value":798},"Skip the Phase 3 interactive table confirmation and use the provided ",{"type":52,"tag":70,"props":800,"children":802},{"className":801},[],[803],{"type":65,"value":740},{"type":65,"value":805}," list verbatim (user has already confirmed in the caller).",{"type":52,"tag":102,"props":807,"children":808},{},[809,811,816,818,823],{"type":65,"value":810},"The Phase 4.1 ",{"type":52,"tag":70,"props":812,"children":814},{"className":813},[],[815],{"type":65,"value":326},{"type":65,"value":817}," prompt restricts operations to ",{"type":52,"tag":61,"props":819,"children":820},{},[821],{"type":65,"value":822},"read-only",{"type":65,"value":824}," (list + get by id).",{"type":52,"tag":102,"props":826,"children":827},{},[828],{"type":65,"value":829},"The Phase 6 Path B agent prompts apply the hardened AI-only posture documented in each agent's \"AI-only read mode\" section.",{"type":52,"tag":102,"props":831,"children":832},{},[833,835,841,843,849],{"type":65,"value":834},"The Phase 6 Path A script invocations use ",{"type":52,"tag":70,"props":836,"children":838},{"className":837},[],[839],{"type":65,"value":840},"--read",{"type":65,"value":842}," only for table permissions and omit primary keys \u002F lookup write forms from ",{"type":52,"tag":70,"props":844,"children":846},{"className":845},[],[847],{"type":65,"value":848},"Webapi\u002F\u003Ctable>\u002Ffields",{"type":65,"value":454},{"type":52,"tag":102,"props":851,"children":852},{},[853,855,861],{"type":65,"value":854},"No ",{"type":52,"tag":70,"props":856,"children":858},{"className":857},[],[859],{"type":65,"value":860},"AskUserQuestion",{"type":65,"value":862}," prompts are issued for Phase 3 or Phase 6.2 — the caller owns those decisions.",{"type":52,"tag":102,"props":864,"children":865},{},[866,871,873,879],{"type":52,"tag":61,"props":867,"children":868},{},[869],{"type":65,"value":870},"Defer all git commits to the caller.",{"type":65,"value":872}," Skip Phase 4.4 (",{"type":52,"tag":70,"props":874,"children":876},{"className":875},[],[877],{"type":65,"value":878},"git add -A && git commit",{"type":65,"value":880},") and Phase 6.5 (permissions\u002Fsettings commit) entirely. The caller is batching changes into one or two commits at orchestrator-defined milestones; an unprompted commit here turns one logical change into three. Print the file lists you would have committed so the caller can reproduce them.",{"type":52,"tag":102,"props":882,"children":883},{},[884,889,891,896],{"type":52,"tag":61,"props":885,"children":886},{},[887],{"type":65,"value":888},"Suppress the end-of-skill deploy prompt.",{"type":65,"value":890}," Skip Phase 6.1 (deploy-now ask when ",{"type":52,"tag":70,"props":892,"children":894},{"className":893},[],[895],{"type":65,"value":160},{"type":65,"value":897}," is missing — the caller has already gated on this), Phase 7.3 (final deploy ask), and Phase 7.4 (post-deploy notes). The caller owns the single end-of-orchestration deploy decision; nesting deploy prompts inside the delegation gives the user 2–3 redundant asks per run. Return the integration summary (Phase 7.2) without trailing deploy\u002Fnotes.",{"type":52,"tag":57,"props":899,"children":900},{},[901,906],{"type":52,"tag":61,"props":902,"children":903},{},[904],{"type":65,"value":905},"When the sentinel is absent",{"type":65,"value":907},": proceed exactly as today (full CRUD, full interactive flow, auto-commit, deploy prompt). This is the regression guard — no human invocation changes behavior.",{"type":52,"tag":57,"props":909,"children":910},{},[911,916],{"type":52,"tag":61,"props":912,"children":913},{},[914],{"type":65,"value":915},"Output",{"type":65,"value":917},": Confirmed project root, framework, data model availability, deployment status, and (if sentinel present) parsed AI-read-only contract.",{"type":52,"tag":268,"props":919,"children":920},{},[],{"type":52,"tag":91,"props":922,"children":924},{"id":923},"phase-2-explore-integration-points",[925],{"type":65,"value":926},"Phase 2: Explore Integration Points",{"type":52,"tag":57,"props":928,"children":929},{},[930,934],{"type":52,"tag":61,"props":931,"children":932},{},[933],{"type":65,"value":383},{"type":65,"value":935},": Analyze the site code and data model to identify all tables needing Web API integration",{"type":52,"tag":57,"props":937,"children":938},{},[939,943],{"type":52,"tag":61,"props":940,"children":941},{},[942],{"type":65,"value":393},{"type":65,"value":395},{"type":52,"tag":57,"props":945,"children":946},{},[947,949,954,956,962,964,970],{"type":65,"value":948},"Use the ",{"type":52,"tag":61,"props":950,"children":951},{},[952],{"type":65,"value":953},"Explore agent",{"type":65,"value":955}," (via ",{"type":52,"tag":70,"props":957,"children":959},{"className":958},[],[960],{"type":65,"value":961},"Task",{"type":65,"value":963}," tool with ",{"type":52,"tag":70,"props":965,"children":967},{"className":966},[],[968],{"type":65,"value":969},"agent_type: \"explore\"",{"type":65,"value":971},") to analyze the site code and data model. The Explore agent should answer these questions:",{"type":52,"tag":397,"props":973,"children":975},{"id":974},"_21-discover-tables",[976],{"type":65,"value":977},"2.1 Discover Tables",{"type":52,"tag":57,"props":979,"children":980},{},[981],{"type":65,"value":982},"Ask the Explore agent to identify all Dataverse tables that need Web API integration by examining:",{"type":52,"tag":98,"props":984,"children":985},{},[986,996,1007,1020,1025,1030,1035],{"type":52,"tag":102,"props":987,"children":988},{},[989,994],{"type":52,"tag":70,"props":990,"children":992},{"className":991},[],[993],{"type":65,"value":514},{"type":65,"value":995}," — List of tables and their columns",{"type":52,"tag":102,"props":997,"children":998},{},[999,1005],{"type":52,"tag":70,"props":1000,"children":1002},{"className":1001},[],[1003],{"type":65,"value":1004},"src\u002F**\u002F*.{ts,tsx,js,jsx,vue,astro}",{"type":65,"value":1006}," — Source code files that reference table data, mock data, or placeholder API calls",{"type":52,"tag":102,"props":1008,"children":1009},{},[1010,1012,1018],{"type":65,"value":1011},"Existing ",{"type":52,"tag":70,"props":1013,"children":1015},{"className":1014},[],[1016],{"type":65,"value":1017},"\u002F_api\u002F",{"type":65,"value":1019}," fetch patterns in the code",{"type":52,"tag":102,"props":1021,"children":1022},{},[1023],{"type":65,"value":1024},"TypeScript interfaces or types that map to Dataverse table schemas",{"type":52,"tag":102,"props":1026,"children":1027},{},[1028],{"type":65,"value":1029},"Component files that display or manipulate data from Dataverse tables",{"type":52,"tag":102,"props":1031,"children":1032},{},[1033],{"type":65,"value":1034},"Mock data files or hardcoded arrays that should be replaced with API calls",{"type":52,"tag":102,"props":1036,"children":1037},{},[1038,1044,1046,1052],{"type":52,"tag":70,"props":1039,"children":1041},{"className":1040},[],[1042],{"type":65,"value":1043},"TODO",{"type":65,"value":1045}," or ",{"type":52,"tag":70,"props":1047,"children":1049},{"className":1048},[],[1050],{"type":65,"value":1051},"FIXME",{"type":65,"value":1053}," comments mentioning API integration",{"type":52,"tag":57,"props":1055,"children":1056},{},[1057],{"type":52,"tag":61,"props":1058,"children":1059},{},[1060],{"type":65,"value":1061},"Prompt for the Explore agent:",{"type":52,"tag":53,"props":1063,"children":1064},{},[1065],{"type":52,"tag":57,"props":1066,"children":1067},{},[1068,1070,1075,1077,1082,1084,1090,1092,1098,1099,1105,1107,1113],{"type":65,"value":1069},"\"Analyze this Power Pages code site and identify all Dataverse tables that need Web API integration. Check ",{"type":52,"tag":70,"props":1071,"children":1073},{"className":1072},[],[1074],{"type":65,"value":514},{"type":65,"value":1076}," for the data model, then search the source code for: mock data arrays, hardcoded data, placeholder fetch calls to ",{"type":52,"tag":70,"props":1078,"children":1080},{"className":1079},[],[1081],{"type":65,"value":1017},{"type":65,"value":1083},", TypeScript interfaces matching Dataverse column patterns (publisher prefix like ",{"type":52,"tag":70,"props":1085,"children":1087},{"className":1086},[],[1088],{"type":65,"value":1089},"cr*_",{"type":65,"value":1091},"), TODO\u002FFIXME comments about API integration, and components that display table data. For each table found, report: the table logical name, the entity set name (plural), which source files reference it, what operations are needed (read\u002Fcreate\u002Fupdate\u002Fdelete), and whether an existing API client or service already exists in ",{"type":52,"tag":70,"props":1093,"children":1095},{"className":1094},[],[1096],{"type":65,"value":1097},"src\u002Fshared\u002F",{"type":65,"value":1045},{"type":52,"tag":70,"props":1100,"children":1102},{"className":1101},[],[1103],{"type":65,"value":1104},"src\u002Fservices\u002F",{"type":65,"value":1106},". Also check if ",{"type":52,"tag":70,"props":1108,"children":1110},{"className":1109},[],[1111],{"type":65,"value":1112},"src\u002Fshared\u002FpowerPagesApi.ts",{"type":65,"value":1114}," already exists.\"",{"type":52,"tag":57,"props":1116,"children":1117},{},[1118,1123],{"type":52,"tag":61,"props":1119,"children":1120},{},[1121],{"type":65,"value":1122},"When AI-only read mode is active (Phase 1.6 flag set):",{"type":65,"value":1124}," append the following to the prompt above:",{"type":52,"tag":53,"props":1126,"children":1127},{},[1128],{"type":52,"tag":57,"props":1129,"children":1130},{},[1131,1133,1138,1140,1146,1148,1154,1156,1162,1164,1169,1171,1176,1178,1184],{"type":65,"value":1132},"\"The caller has specified ",{"type":52,"tag":61,"props":1134,"children":1135},{},[1136],{"type":65,"value":1137},"AI-READ-ONLY",{"type":65,"value":1139}," mode for tables ",{"type":52,"tag":70,"props":1141,"children":1143},{"className":1142},[],[1144],{"type":65,"value":1145},"[tables from sentinel]",{"type":65,"value":1147}," (primary=",{"type":52,"tag":70,"props":1149,"children":1151},{"className":1150},[],[1152],{"type":65,"value":1153},"[primary]",{"type":65,"value":1155},", expand-targets=",{"type":52,"tag":70,"props":1157,"children":1159},{"className":1158},[],[1160],{"type":65,"value":1161},"[expand-targets]",{"type":65,"value":1163},"). Operations needed for every table in that list = ",{"type":52,"tag":61,"props":1165,"children":1166},{},[1167],{"type":65,"value":1168},"read only",{"type":65,"value":1170},". Do NOT report create\u002Fupdate\u002Fdelete call sites or mock-data replacement candidates. For each ",{"type":52,"tag":70,"props":1172,"children":1174},{"className":1173},[],[1175],{"type":65,"value":710},{"type":65,"value":1177}," target, also report the columns the primary's code ",{"type":52,"tag":70,"props":1179,"children":1181},{"className":1180},[],[1182],{"type":65,"value":1183},"$select",{"type":65,"value":1185},"s on that expansion (these become the minimal fields list).\"",{"type":52,"tag":397,"props":1187,"children":1189},{"id":1188},"_22-identify-existing-integration-code",[1190],{"type":65,"value":1191},"2.2 Identify Existing Integration Code",{"type":52,"tag":57,"props":1193,"children":1194},{},[1195],{"type":65,"value":1196},"The Explore agent should also report:",{"type":52,"tag":98,"props":1198,"children":1199},{},[1200,1212,1229,1240],{"type":52,"tag":102,"props":1201,"children":1202},{},[1203,1205,1210],{"type":65,"value":1204},"Whether ",{"type":52,"tag":70,"props":1206,"children":1208},{"className":1207},[],[1209],{"type":65,"value":1112},{"type":65,"value":1211}," (or equivalent API client) already exists",{"type":52,"tag":102,"props":1213,"children":1214},{},[1215,1217,1223,1224],{"type":65,"value":1216},"Which tables already have service files in ",{"type":52,"tag":70,"props":1218,"children":1220},{"className":1219},[],[1221],{"type":65,"value":1222},"src\u002Fshared\u002Fservices\u002F",{"type":65,"value":1045},{"type":52,"tag":70,"props":1225,"children":1227},{"className":1226},[],[1228],{"type":65,"value":1104},{"type":52,"tag":102,"props":1230,"children":1231},{},[1232,1234],{"type":65,"value":1233},"Which tables already have type definitions in ",{"type":52,"tag":70,"props":1235,"children":1237},{"className":1236},[],[1238],{"type":65,"value":1239},"src\u002Ftypes\u002F",{"type":52,"tag":102,"props":1241,"children":1242},{},[1243],{"type":65,"value":1244},"Any framework-specific hooks\u002Fcomposables already created",{"type":52,"tag":57,"props":1246,"children":1247},{},[1248],{"type":65,"value":1249},"This avoids duplicating work that was already done.",{"type":52,"tag":397,"props":1251,"children":1253},{"id":1252},"_23-compile-integration-manifest",[1254],{"type":65,"value":1255},"2.3 Compile Integration Manifest",{"type":52,"tag":57,"props":1257,"children":1258},{},[1259],{"type":65,"value":1260},"From the Explore agent's findings, compile a list of tables needing integration:",{"type":52,"tag":609,"props":1262,"children":1263},{},[1264,1300],{"type":52,"tag":613,"props":1265,"children":1266},{},[1267],{"type":52,"tag":617,"props":1268,"children":1269},{},[1270,1275,1280,1285,1290,1295],{"type":52,"tag":621,"props":1271,"children":1272},{},[1273],{"type":65,"value":1274},"Table",{"type":52,"tag":621,"props":1276,"children":1277},{},[1278],{"type":65,"value":1279},"Logical Name",{"type":52,"tag":621,"props":1281,"children":1282},{},[1283],{"type":65,"value":1284},"Entity Set",{"type":52,"tag":621,"props":1286,"children":1287},{},[1288],{"type":65,"value":1289},"Operations",{"type":52,"tag":621,"props":1291,"children":1292},{},[1293],{"type":65,"value":1294},"Files Referencing",{"type":52,"tag":621,"props":1296,"children":1297},{},[1298],{"type":65,"value":1299},"Existing Service",{"type":52,"tag":637,"props":1301,"children":1302},{},[1303,1356],{"type":52,"tag":617,"props":1304,"children":1305},{},[1306,1311,1320,1329,1334,1351],{"type":52,"tag":644,"props":1307,"children":1308},{},[1309],{"type":65,"value":1310},"Products",{"type":52,"tag":644,"props":1312,"children":1313},{},[1314],{"type":52,"tag":70,"props":1315,"children":1317},{"className":1316},[],[1318],{"type":65,"value":1319},"cr4fc_product",{"type":52,"tag":644,"props":1321,"children":1322},{},[1323],{"type":52,"tag":70,"props":1324,"children":1326},{"className":1325},[],[1327],{"type":65,"value":1328},"cr4fc_products",{"type":52,"tag":644,"props":1330,"children":1331},{},[1332],{"type":65,"value":1333},"CRUD",{"type":52,"tag":644,"props":1335,"children":1336},{},[1337,1343,1345],{"type":52,"tag":70,"props":1338,"children":1340},{"className":1339},[],[1341],{"type":65,"value":1342},"ProductList.tsx",{"type":65,"value":1344},", ",{"type":52,"tag":70,"props":1346,"children":1348},{"className":1347},[],[1349],{"type":65,"value":1350},"ProductCard.tsx",{"type":52,"tag":644,"props":1352,"children":1353},{},[1354],{"type":65,"value":1355},"None",{"type":52,"tag":617,"props":1357,"children":1358},{},[1359,1364,1373,1382,1387,1396],{"type":52,"tag":644,"props":1360,"children":1361},{},[1362],{"type":65,"value":1363},"Categories",{"type":52,"tag":644,"props":1365,"children":1366},{},[1367],{"type":52,"tag":70,"props":1368,"children":1370},{"className":1369},[],[1371],{"type":65,"value":1372},"cr4fc_category",{"type":52,"tag":644,"props":1374,"children":1375},{},[1376],{"type":52,"tag":70,"props":1377,"children":1379},{"className":1378},[],[1380],{"type":65,"value":1381},"cr4fc_categories",{"type":52,"tag":644,"props":1383,"children":1384},{},[1385],{"type":65,"value":1386},"Read",{"type":52,"tag":644,"props":1388,"children":1389},{},[1390],{"type":52,"tag":70,"props":1391,"children":1393},{"className":1392},[],[1394],{"type":65,"value":1395},"CategoryFilter.tsx",{"type":52,"tag":644,"props":1397,"children":1398},{},[1399],{"type":65,"value":1355},{"type":52,"tag":57,"props":1401,"children":1402},{},[1403,1407],{"type":52,"tag":61,"props":1404,"children":1405},{},[1406],{"type":65,"value":915},{"type":65,"value":1408},": Complete integration manifest listing all tables, their operations, referencing files, and existing service status",{"type":52,"tag":268,"props":1410,"children":1411},{},[],{"type":52,"tag":91,"props":1413,"children":1415},{"id":1414},"phase-3-review-integration-plan",[1416],{"type":65,"value":1417},"Phase 3: Review Integration Plan",{"type":52,"tag":57,"props":1419,"children":1420},{},[1421,1425],{"type":52,"tag":61,"props":1422,"children":1423},{},[1424],{"type":65,"value":383},{"type":65,"value":1426},": Present the integration manifest to the user and confirm which tables to integrate",{"type":52,"tag":57,"props":1428,"children":1429},{},[1430,1434],{"type":52,"tag":61,"props":1431,"children":1432},{},[1433],{"type":65,"value":393},{"type":65,"value":395},{"type":52,"tag":397,"props":1436,"children":1438},{"id":1437},"_31-present-findings",[1439],{"type":65,"value":1440},"3.1 Present Findings",{"type":52,"tag":57,"props":1442,"children":1443},{},[1444],{"type":65,"value":1445},"Show the user:",{"type":52,"tag":278,"props":1447,"children":1448},{},[1449,1454,1459,1464],{"type":52,"tag":102,"props":1450,"children":1451},{},[1452],{"type":65,"value":1453},"The tables that were identified for Web API integration",{"type":52,"tag":102,"props":1455,"children":1456},{},[1457],{"type":65,"value":1458},"For each table: which files reference it, what operations are needed",{"type":52,"tag":102,"props":1460,"children":1461},{},[1462],{"type":65,"value":1463},"Whether a shared API client already exists or needs to be created",{"type":52,"tag":102,"props":1465,"children":1466},{},[1467],{"type":65,"value":1468},"Any tables that were skipped (already have services)",{"type":52,"tag":397,"props":1470,"children":1472},{"id":1471},"_32-confirm-tables",[1473],{"type":65,"value":1474},"3.2 Confirm Tables",{"type":52,"tag":53,"props":1476,"children":1477},{},[1478,1490],{"type":52,"tag":57,"props":1479,"children":1480},{},[1481,1483,1488],{"type":65,"value":1482},"🚦 ",{"type":52,"tag":61,"props":1484,"children":1485},{},[1486],{"type":65,"value":1487},"Gate (plan · integrate-webapi:3.2.confirm-tables):",{"type":65,"value":1489}," Final say on which tables get Web API integration code (client, types, services, hooks).",{"type":52,"tag":57,"props":1491,"children":1492},{},[1493,1498,1500,1505,1507,1512],{"type":52,"tag":61,"props":1494,"children":1495},{},[1496],{"type":65,"value":1497},"Trigger:",{"type":65,"value":1499}," Explore agent surfaced candidate tables in Phase 3.1.\n",{"type":52,"tag":61,"props":1501,"children":1502},{},[1503],{"type":65,"value":1504},"Why we ask:",{"type":65,"value":1506}," Auto-selecting all tables can generate orphaned TypeScript files for tables the user never intended to expose via Web API.\n",{"type":52,"tag":61,"props":1508,"children":1509},{},[1510],{"type":65,"value":1511},"Cancel leaves:",{"type":65,"value":1513}," Nothing — no service\u002Ftype\u002Fhook files written yet.",{"type":52,"tag":57,"props":1515,"children":1516},{},[1517,1521,1523,1528,1530,1535],{"type":52,"tag":61,"props":1518,"children":1519},{},[1520],{"type":65,"value":1122},{"type":65,"value":1522}," skip this step entirely. Use the ",{"type":52,"tag":70,"props":1524,"children":1526},{"className":1525},[],[1527],{"type":65,"value":740},{"type":65,"value":1529}," list parsed from the sentinel verbatim — the caller has already confirmed the selection with the user. Do not issue an ",{"type":52,"tag":70,"props":1531,"children":1533},{"className":1532},[],[1534],{"type":65,"value":860},{"type":65,"value":454},{"type":52,"tag":57,"props":1537,"children":1538},{},[1539,1541,1546],{"type":65,"value":1540},"Otherwise, use ",{"type":52,"tag":70,"props":1542,"children":1544},{"className":1543},[],[1545],{"type":65,"value":860},{"type":65,"value":1547}," to confirm:",{"type":52,"tag":609,"props":1549,"children":1550},{},[1551,1567],{"type":52,"tag":613,"props":1552,"children":1553},{},[1554],{"type":52,"tag":617,"props":1555,"children":1556},{},[1557,1562],{"type":52,"tag":621,"props":1558,"children":1559},{},[1560],{"type":65,"value":1561},"Question",{"type":52,"tag":621,"props":1563,"children":1564},{},[1565],{"type":65,"value":1566},"Options",{"type":52,"tag":637,"props":1568,"children":1569},{},[1570],{"type":52,"tag":617,"props":1571,"children":1572},{},[1573,1589],{"type":52,"tag":644,"props":1574,"children":1575},{},[1576,1578,1587],{"type":65,"value":1577},"I found the following tables that need Web API integration: ",{"type":52,"tag":61,"props":1579,"children":1580},{},[1581],{"type":52,"tag":1582,"props":1583,"children":1584},"span",{},[1585],{"type":65,"value":1586},"list tables",{"type":65,"value":1588},". Which tables should I integrate?",{"type":52,"tag":644,"props":1590,"children":1591},{},[1592],{"type":65,"value":1593},"All of them (Recommended), Let me select specific tables, I need to add more tables",{"type":52,"tag":57,"props":1595,"children":1596},{},[1597],{"type":65,"value":1598},"If the user selects specific tables or adds more, update the integration manifest accordingly.",{"type":52,"tag":57,"props":1600,"children":1601},{},[1602,1606],{"type":52,"tag":61,"props":1603,"children":1604},{},[1605],{"type":65,"value":915},{"type":65,"value":1607},": User-confirmed list of tables to integrate (or sentinel-supplied list in AI-only read mode)",{"type":52,"tag":268,"props":1609,"children":1610},{},[],{"type":52,"tag":91,"props":1612,"children":1614},{"id":1613},"phase-4-implement-integrations",[1615],{"type":65,"value":1616},"Phase 4: Implement Integrations",{"type":52,"tag":57,"props":1618,"children":1619},{},[1620,1624,1626,1631],{"type":52,"tag":61,"props":1621,"children":1622},{},[1623],{"type":65,"value":383},{"type":65,"value":1625},": Create Web API integration code for each confirmed table using the ",{"type":52,"tag":70,"props":1627,"children":1629},{"className":1628},[],[1630],{"type":65,"value":326},{"type":65,"value":1632}," agent",{"type":52,"tag":57,"props":1634,"children":1635},{},[1636,1640],{"type":52,"tag":61,"props":1637,"children":1638},{},[1639],{"type":65,"value":393},{"type":65,"value":395},{"type":52,"tag":397,"props":1642,"children":1644},{"id":1643},"_41-invoke-agent-per-table",[1645],{"type":65,"value":1646},"4.1 Invoke Agent Per Table",{"type":52,"tag":57,"props":1648,"children":1649},{},[1650,1652,1657,1659,1664,1666,1672],{"type":65,"value":1651},"For each table, use the ",{"type":52,"tag":70,"props":1653,"children":1655},{"className":1654},[],[1656],{"type":65,"value":961},{"type":65,"value":1658}," tool to invoke the ",{"type":52,"tag":70,"props":1660,"children":1662},{"className":1661},[],[1663],{"type":65,"value":326},{"type":65,"value":1665}," agent at ",{"type":52,"tag":70,"props":1667,"children":1669},{"className":1668},[],[1670],{"type":65,"value":1671},"${PLUGIN_ROOT}\u002Fagents\u002Fwebapi-integration.md",{"type":65,"value":395},{"type":52,"tag":57,"props":1674,"children":1675},{},[1676],{"type":52,"tag":61,"props":1677,"children":1678},{},[1679],{"type":65,"value":1680},"Prompt template for the agent:",{"type":52,"tag":53,"props":1682,"children":1683},{},[1684,1699,1774],{"type":52,"tag":57,"props":1685,"children":1686},{},[1687,1689,1697],{"type":65,"value":1688},"\"Integrate Power Pages Web API for the ",{"type":52,"tag":61,"props":1690,"children":1691},{},[1692],{"type":52,"tag":1582,"props":1693,"children":1694},{},[1695],{"type":65,"value":1696},"Table Display Name",{"type":65,"value":1698}," table.",{"type":52,"tag":98,"props":1700,"children":1701},{},[1702,1713,1724,1734,1744,1754,1764],{"type":52,"tag":102,"props":1703,"children":1704},{},[1705,1707],{"type":65,"value":1706},"Table logical name: ",{"type":52,"tag":70,"props":1708,"children":1710},{"className":1709},[],[1711],{"type":65,"value":1712},"[logical_name]",{"type":52,"tag":102,"props":1714,"children":1715},{},[1716,1718],{"type":65,"value":1717},"Entity set name: ",{"type":52,"tag":70,"props":1719,"children":1721},{"className":1720},[],[1722],{"type":65,"value":1723},"[entity_set_name]",{"type":52,"tag":102,"props":1725,"children":1726},{},[1727,1729],{"type":65,"value":1728},"Operations needed: ",{"type":52,"tag":1582,"props":1730,"children":1731},{},[1732],{"type":65,"value":1733},"read\u002Fcreate\u002Fupdate\u002Fdelete",{"type":52,"tag":102,"props":1735,"children":1736},{},[1737,1739],{"type":65,"value":1738},"Framework: ",{"type":52,"tag":1582,"props":1740,"children":1741},{},[1742],{"type":65,"value":1743},"React\u002FVue\u002FAngular\u002FAstro",{"type":52,"tag":102,"props":1745,"children":1746},{},[1747,1749],{"type":65,"value":1748},"Project root: ",{"type":52,"tag":1582,"props":1750,"children":1751},{},[1752],{"type":65,"value":1753},"path",{"type":52,"tag":102,"props":1755,"children":1756},{},[1757,1759],{"type":65,"value":1758},"Source files referencing this table: ",{"type":52,"tag":1582,"props":1760,"children":1761},{},[1762],{"type":65,"value":1763},"list of files",{"type":52,"tag":102,"props":1765,"children":1766},{},[1767,1769],{"type":65,"value":1768},"Data model manifest path: ",{"type":52,"tag":1582,"props":1770,"children":1771},{},[1772],{"type":65,"value":1773},"path to .datamodel-manifest.json if available",{"type":52,"tag":57,"props":1775,"children":1776},{},[1777],{"type":65,"value":1778},"Create the TypeScript types, CRUD service layer, and framework-specific hooks\u002Fcomposables. Replace any mock data or placeholder API calls in the referencing source files with the new service.\"",{"type":52,"tag":57,"props":1780,"children":1781},{},[1782,1786,1788,1792,1794,1800],{"type":52,"tag":61,"props":1783,"children":1784},{},[1785],{"type":65,"value":1122},{"type":65,"value":1787}," replace \"Operations needed: ",{"type":52,"tag":1582,"props":1789,"children":1790},{},[1791],{"type":65,"value":1733},{"type":65,"value":1793},"\" with ",{"type":52,"tag":70,"props":1795,"children":1797},{"className":1796},[],[1798],{"type":65,"value":1799},"Operations needed: read-only",{"type":65,"value":1801}," and append to the prompt:",{"type":52,"tag":53,"props":1803,"children":1804},{},[1805],{"type":52,"tag":57,"props":1806,"children":1807},{},[1808,1810,1815,1817,1823,1825,1831,1833,1839,1841,1847,1848,1854,1855,1861,1862,1868,1870,1875],{"type":65,"value":1809},"\"",{"type":52,"tag":61,"props":1811,"children":1812},{},[1813],{"type":65,"value":1814},"AI-only read integration.",{"type":65,"value":1816}," Do NOT emit create, update, or delete functions. Scaffold only ",{"type":52,"tag":70,"props":1818,"children":1820},{"className":1819},[],[1821],{"type":65,"value":1822},"list\u003CTable>",{"type":65,"value":1824}," (paginated) and ",{"type":52,"tag":70,"props":1826,"children":1828},{"className":1827},[],[1829],{"type":65,"value":1830},"get\u003CTable>ById",{"type":65,"value":1832}," in the service layer. Create the framework-specific read hook only (e.g. ",{"type":52,"tag":70,"props":1834,"children":1836},{"className":1835},[],[1837],{"type":65,"value":1838},"use\u003CTable>()",{"type":65,"value":1840}," with ",{"type":52,"tag":70,"props":1842,"children":1844},{"className":1843},[],[1845],{"type":65,"value":1846},"items",{"type":65,"value":1344},{"type":52,"tag":70,"props":1849,"children":1851},{"className":1850},[],[1852],{"type":65,"value":1853},"isLoading",{"type":65,"value":1344},{"type":52,"tag":70,"props":1856,"children":1858},{"className":1857},[],[1859],{"type":65,"value":1860},"error",{"type":65,"value":1344},{"type":52,"tag":70,"props":1863,"children":1865},{"className":1864},[],[1866],{"type":65,"value":1867},"refetch",{"type":65,"value":1869},"; no mutation hooks). Do not wire mock-data replacements beyond what is needed for the AI summarization caller — the upstream skill will add the summarization service on top. The shared ",{"type":52,"tag":70,"props":1871,"children":1873},{"className":1872},[],[1874],{"type":65,"value":1112},{"type":65,"value":1876}," client is still created if it does not already exist; the caller relies on it for the AI integration's read path.\"",{"type":52,"tag":397,"props":1878,"children":1880},{"id":1879},"_42-process-first-table-then-parallelize-remaining",[1881],{"type":65,"value":1882},"4.2 Process First Table, Then Parallelize Remaining",{"type":52,"tag":57,"props":1884,"children":1885},{},[1886,1888,1893,1895,1900],{"type":65,"value":1887},"The ",{"type":52,"tag":61,"props":1889,"children":1890},{},[1891],{"type":65,"value":1892},"first table",{"type":65,"value":1894}," must be processed alone — it creates the shared ",{"type":52,"tag":70,"props":1896,"children":1898},{"className":1897},[],[1899],{"type":65,"value":117},{"type":65,"value":1901}," client that all other tables depend on. After the first table completes and the shared client exists:",{"type":52,"tag":98,"props":1903,"children":1904},{},[1905,1920],{"type":52,"tag":102,"props":1906,"children":1907},{},[1908,1913,1915],{"type":52,"tag":61,"props":1909,"children":1910},{},[1911],{"type":65,"value":1912},"Verify",{"type":65,"value":1914}," the shared API client was created at ",{"type":52,"tag":70,"props":1916,"children":1918},{"className":1917},[],[1919],{"type":65,"value":1112},{"type":52,"tag":102,"props":1921,"children":1922},{},[1923,1928,1930,1935,1937,1942,1944,1949],{"type":52,"tag":61,"props":1924,"children":1925},{},[1926],{"type":65,"value":1927},"Then invoke all remaining tables in parallel",{"type":65,"value":1929}," using multiple ",{"type":52,"tag":70,"props":1931,"children":1933},{"className":1932},[],[1934],{"type":65,"value":961},{"type":65,"value":1936}," calls — each table creates independent files (its own types in ",{"type":52,"tag":70,"props":1938,"children":1940},{"className":1939},[],[1941],{"type":65,"value":1239},{"type":65,"value":1943},", service in ",{"type":52,"tag":70,"props":1945,"children":1947},{"className":1946},[],[1948],{"type":65,"value":1222},{"type":65,"value":1950},", and hook\u002Fcomposable), so there are no conflicts",{"type":52,"tag":57,"props":1952,"children":1953},{},[1954],{"type":65,"value":1955},"If there is only one table, this step is simply sequential.",{"type":52,"tag":397,"props":1957,"children":1959},{"id":1958},"_43-verify-each-integration",[1960],{"type":65,"value":1961},"4.3 Verify Each Integration",{"type":52,"tag":57,"props":1963,"children":1964},{},[1965],{"type":65,"value":1966},"After each agent completes (or after all parallel agents complete), verify the output:",{"type":52,"tag":98,"props":1968,"children":1969},{},[1970,1975,1980],{"type":52,"tag":102,"props":1971,"children":1972},{},[1973],{"type":65,"value":1974},"Check that the expected files were created (types, service, hook\u002Fcomposable)",{"type":52,"tag":102,"props":1976,"children":1977},{},[1978],{"type":65,"value":1979},"Confirm the shared API client exists after the first table is processed",{"type":52,"tag":102,"props":1981,"children":1982},{},[1983],{"type":65,"value":1984},"Note any issues reported by the agent",{"type":52,"tag":397,"props":1986,"children":1988},{"id":1987},"_44-git-commit",[1989],{"type":65,"value":1990},"4.4 Git Commit",{"type":52,"tag":57,"props":1992,"children":1993},{},[1994,1999],{"type":52,"tag":61,"props":1995,"children":1996},{},[1997],{"type":65,"value":1998},"Skip when AI-only read mode is active",{"type":65,"value":2000}," (Phase 1.6 flag set) — the caller batches commits.\nPrint the file list this phase would have staged so the caller can reproduce, then move on.",{"type":52,"tag":57,"props":2002,"children":2003},{},[2004],{"type":65,"value":2005},"Otherwise, after all integrations are complete, stage and commit:",{"type":52,"tag":518,"props":2007,"children":2011},{"className":2008,"code":2009,"language":2010,"meta":523,"style":523},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git add -A\ngit commit -m \"Add Web API integration for [table names]\"\n","bash",[2012],{"type":52,"tag":70,"props":2013,"children":2014},{"__ignoreMap":523},[2015,2037],{"type":52,"tag":1582,"props":2016,"children":2019},{"class":2017,"line":2018},"line",1,[2020,2026,2032],{"type":52,"tag":1582,"props":2021,"children":2023},{"style":2022},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[2024],{"type":65,"value":2025},"git",{"type":52,"tag":1582,"props":2027,"children":2029},{"style":2028},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[2030],{"type":65,"value":2031}," add",{"type":52,"tag":1582,"props":2033,"children":2034},{"style":2028},[2035],{"type":65,"value":2036}," -A\n",{"type":52,"tag":1582,"props":2038,"children":2040},{"class":2017,"line":2039},2,[2041,2045,2050,2055,2061,2066],{"type":52,"tag":1582,"props":2042,"children":2043},{"style":2022},[2044],{"type":65,"value":2025},{"type":52,"tag":1582,"props":2046,"children":2047},{"style":2028},[2048],{"type":65,"value":2049}," commit",{"type":52,"tag":1582,"props":2051,"children":2052},{"style":2028},[2053],{"type":65,"value":2054}," -m",{"type":52,"tag":1582,"props":2056,"children":2058},{"style":2057},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[2059],{"type":65,"value":2060}," \"",{"type":52,"tag":1582,"props":2062,"children":2063},{"style":2028},[2064],{"type":65,"value":2065},"Add Web API integration for [table names]",{"type":52,"tag":1582,"props":2067,"children":2068},{"style":2057},[2069],{"type":65,"value":2070},"\"\n",{"type":52,"tag":57,"props":2072,"children":2073},{},[2074,2078],{"type":52,"tag":61,"props":2075,"children":2076},{},[2077],{"type":65,"value":915},{"type":65,"value":2079},": Integration code created for all confirmed tables, verified and (in normal mode) committed",{"type":52,"tag":268,"props":2081,"children":2082},{},[],{"type":52,"tag":91,"props":2084,"children":2086},{"id":2085},"phase-5-verify-integrations",[2087],{"type":65,"value":2088},"Phase 5: Verify Integrations",{"type":52,"tag":57,"props":2090,"children":2091},{},[2092,2096],{"type":52,"tag":61,"props":2093,"children":2094},{},[2095],{"type":65,"value":383},{"type":65,"value":2097},": Validate that all expected integration files exist, imports are correct, and the project builds successfully",{"type":52,"tag":57,"props":2099,"children":2100},{},[2101,2105],{"type":52,"tag":61,"props":2102,"children":2103},{},[2104],{"type":65,"value":393},{"type":65,"value":395},{"type":52,"tag":397,"props":2107,"children":2109},{"id":2108},"_51-verify-file-inventory",[2110],{"type":65,"value":2111},"5.1 Verify File Inventory",{"type":52,"tag":57,"props":2113,"children":2114},{},[2115],{"type":65,"value":2116},"For each integrated table, confirm the following files exist:",{"type":52,"tag":98,"props":2118,"children":2119},{},[2120,2145,2173],{"type":52,"tag":102,"props":2121,"children":2122},{},[2123,2128,2130,2135,2137,2143],{"type":52,"tag":61,"props":2124,"children":2125},{},[2126],{"type":65,"value":2127},"Type definition",{"type":65,"value":2129}," in ",{"type":52,"tag":70,"props":2131,"children":2133},{"className":2132},[],[2134],{"type":65,"value":1239},{"type":65,"value":2136}," (e.g., ",{"type":52,"tag":70,"props":2138,"children":2140},{"className":2139},[],[2141],{"type":65,"value":2142},"src\u002Ftypes\u002Fproduct.ts",{"type":65,"value":2144},")",{"type":52,"tag":102,"props":2146,"children":2147},{},[2148,2153,2154,2159,2160,2165,2166,2172],{"type":52,"tag":61,"props":2149,"children":2150},{},[2151],{"type":65,"value":2152},"Service file",{"type":65,"value":2129},{"type":52,"tag":70,"props":2155,"children":2157},{"className":2156},[],[2158],{"type":65,"value":1222},{"type":65,"value":1045},{"type":52,"tag":70,"props":2161,"children":2163},{"className":2162},[],[2164],{"type":65,"value":1104},{"type":65,"value":2136},{"type":52,"tag":70,"props":2167,"children":2169},{"className":2168},[],[2170],{"type":65,"value":2171},"productService.ts",{"type":65,"value":2144},{"type":52,"tag":102,"props":2174,"children":2175},{},[2176,2181,2182,2188,2190,2196],{"type":52,"tag":61,"props":2177,"children":2178},{},[2179],{"type":65,"value":2180},"Framework-specific hook\u002Fcomposable",{"type":65,"value":2136},{"type":52,"tag":70,"props":2183,"children":2185},{"className":2184},[],[2186],{"type":65,"value":2187},"src\u002Fshared\u002Fhooks\u002FuseProducts.ts",{"type":65,"value":2189}," for React, ",{"type":52,"tag":70,"props":2191,"children":2193},{"className":2192},[],[2194],{"type":65,"value":2195},"src\u002Fcomposables\u002FuseProducts.ts",{"type":65,"value":2197}," for Vue)",{"type":52,"tag":57,"props":2199,"children":2200},{},[2201],{"type":65,"value":2202},"Also verify:",{"type":52,"tag":98,"props":2204,"children":2205},{},[2206,2223,2235],{"type":52,"tag":102,"props":2207,"children":2208},{},[2209,2214,2216,2221],{"type":52,"tag":61,"props":2210,"children":2211},{},[2212],{"type":65,"value":2213},"Shared API client",{"type":65,"value":2215}," at ",{"type":52,"tag":70,"props":2217,"children":2219},{"className":2218},[],[2220],{"type":65,"value":1112},{"type":65,"value":2222}," exists",{"type":52,"tag":102,"props":2224,"children":2225},{},[2226,2228,2233],{"type":65,"value":2227},"Each service file references ",{"type":52,"tag":70,"props":2229,"children":2231},{"className":2230},[],[2232],{"type":65,"value":1017},{"type":65,"value":2234}," endpoints",{"type":52,"tag":102,"props":2236,"children":2237},{},[2238],{"type":65,"value":2239},"Each service file imports from the shared API client",{"type":52,"tag":397,"props":2241,"children":2243},{"id":2242},"_52-verify-build",[2244],{"type":65,"value":2245},"5.2 Verify Build",{"type":52,"tag":57,"props":2247,"children":2248},{},[2249],{"type":65,"value":2250},"Run the project build to catch any import errors, type errors, or missing dependencies:",{"type":52,"tag":518,"props":2252,"children":2254},{"className":2008,"code":2253,"language":2010,"meta":523,"style":523},"npm run build\n",[2255],{"type":52,"tag":70,"props":2256,"children":2257},{"__ignoreMap":523},[2258],{"type":52,"tag":1582,"props":2259,"children":2260},{"class":2017,"line":2018},[2261,2266,2271],{"type":52,"tag":1582,"props":2262,"children":2263},{"style":2022},[2264],{"type":65,"value":2265},"npm",{"type":52,"tag":1582,"props":2267,"children":2268},{"style":2028},[2269],{"type":65,"value":2270}," run",{"type":52,"tag":1582,"props":2272,"children":2273},{"style":2028},[2274],{"type":65,"value":2275}," build\n",{"type":52,"tag":57,"props":2277,"children":2278},{},[2279],{"type":65,"value":2280},"If the build fails, fix the issues before proceeding. Common issues:",{"type":52,"tag":98,"props":2282,"children":2283},{},[2284,2289,2294],{"type":52,"tag":102,"props":2285,"children":2286},{},[2287],{"type":65,"value":2288},"Missing imports between generated files",{"type":52,"tag":102,"props":2290,"children":2291},{},[2292],{"type":65,"value":2293},"Type mismatches between service and type definitions",{"type":52,"tag":102,"props":2295,"children":2296},{},[2297],{"type":65,"value":2298},"Framework-specific compilation errors",{"type":52,"tag":397,"props":2300,"children":2302},{"id":2301},"_53-present-verification-results",[2303],{"type":65,"value":2304},"5.3 Present Verification Results",{"type":52,"tag":57,"props":2306,"children":2307},{},[2308],{"type":65,"value":2309},"Present a table summarizing the verification:",{"type":52,"tag":609,"props":2311,"children":2312},{},[2313,2343],{"type":52,"tag":613,"props":2314,"children":2315},{},[2316],{"type":52,"tag":617,"props":2317,"children":2318},{},[2319,2323,2328,2333,2338],{"type":52,"tag":621,"props":2320,"children":2321},{},[2322],{"type":65,"value":1274},{"type":52,"tag":621,"props":2324,"children":2325},{},[2326],{"type":65,"value":2327},"Types",{"type":52,"tag":621,"props":2329,"children":2330},{},[2331],{"type":65,"value":2332},"Service",{"type":52,"tag":621,"props":2334,"children":2335},{},[2336],{"type":65,"value":2337},"Hook\u002FComposable",{"type":52,"tag":621,"props":2339,"children":2340},{},[2341],{"type":65,"value":2342},"API References",{"type":52,"tag":637,"props":2344,"children":2345},{},[2346,2387],{"type":52,"tag":617,"props":2347,"children":2348},{},[2349,2353,2361,2370,2378],{"type":52,"tag":644,"props":2350,"children":2351},{},[2352],{"type":65,"value":1310},{"type":52,"tag":644,"props":2354,"children":2355},{},[2356],{"type":52,"tag":70,"props":2357,"children":2359},{"className":2358},[],[2360],{"type":65,"value":2142},{"type":52,"tag":644,"props":2362,"children":2363},{},[2364],{"type":52,"tag":70,"props":2365,"children":2367},{"className":2366},[],[2368],{"type":65,"value":2369},"src\u002Fshared\u002Fservices\u002FproductService.ts",{"type":52,"tag":644,"props":2371,"children":2372},{},[2373],{"type":52,"tag":70,"props":2374,"children":2376},{"className":2375},[],[2377],{"type":65,"value":2187},{"type":52,"tag":644,"props":2379,"children":2380},{},[2381],{"type":52,"tag":70,"props":2382,"children":2384},{"className":2383},[],[2385],{"type":65,"value":2386},"\u002F_api\u002Fcr4fc_products",{"type":52,"tag":617,"props":2388,"children":2389},{},[2390,2395,2399,2403,2407],{"type":52,"tag":644,"props":2391,"children":2392},{},[2393],{"type":65,"value":2394},"...",{"type":52,"tag":644,"props":2396,"children":2397},{},[2398],{"type":65,"value":2394},{"type":52,"tag":644,"props":2400,"children":2401},{},[2402],{"type":65,"value":2394},{"type":52,"tag":644,"props":2404,"children":2405},{},[2406],{"type":65,"value":2394},{"type":52,"tag":644,"props":2408,"children":2409},{},[2410],{"type":65,"value":2394},{"type":52,"tag":57,"props":2412,"children":2413},{},[2414,2419],{"type":52,"tag":61,"props":2415,"children":2416},{},[2417],{"type":65,"value":2418},"Build status",{"type":65,"value":2420},": Pass \u002F Fail (with details)",{"type":52,"tag":57,"props":2422,"children":2423},{},[2424,2428],{"type":52,"tag":61,"props":2425,"children":2426},{},[2427],{"type":65,"value":915},{"type":65,"value":2429},": All integration files verified, project builds successfully",{"type":52,"tag":268,"props":2431,"children":2432},{},[],{"type":52,"tag":91,"props":2434,"children":2436},{"id":2435},"phase-6-setup-permissions-settings",[2437],{"type":65,"value":2438},"Phase 6: Setup Permissions & Settings",{"type":52,"tag":57,"props":2440,"children":2441},{},[2442,2446,2448,2453,2454,2459],{"type":52,"tag":61,"props":2443,"children":2444},{},[2445],{"type":65,"value":383},{"type":65,"value":2447},": Configure table permissions and Web API site settings for all integrated tables using the ",{"type":52,"tag":70,"props":2449,"children":2451},{"className":2450},[],[2452],{"type":65,"value":135},{"type":65,"value":137},{"type":52,"tag":70,"props":2455,"children":2457},{"className":2456},[],[2458],{"type":65,"value":143},{"type":65,"value":2460}," agents",{"type":52,"tag":57,"props":2462,"children":2463},{},[2464,2468],{"type":52,"tag":61,"props":2465,"children":2466},{},[2467],{"type":65,"value":393},{"type":65,"value":395},{"type":52,"tag":397,"props":2470,"children":2472},{"id":2471},"_61-check-deployment-prerequisite",[2473],{"type":65,"value":2474},"6.1 Check Deployment Prerequisite",{"type":52,"tag":57,"props":2476,"children":2477},{},[2478,2480,2485],{"type":65,"value":2479},"Both agents require the ",{"type":52,"tag":70,"props":2481,"children":2483},{"className":2482},[],[2484],{"type":65,"value":160},{"type":65,"value":2486}," folder.",{"type":52,"tag":57,"props":2488,"children":2489},{},[2490,2495,2497,2502],{"type":52,"tag":61,"props":2491,"children":2492},{},[2493],{"type":65,"value":2494},"When AI-only read mode is active",{"type":65,"value":2496}," (Phase 1.6 flag set): the caller has already gated on\n",{"type":52,"tag":70,"props":2498,"children":2500},{"className":2499},[],[2501],{"type":65,"value":160},{"type":65,"value":2503}," existing — re-check it as a guard, and if it is genuinely absent, stop and\nreport the contract violation back to the caller (the caller will surface this to the user).\nDo NOT issue the deploy prompt below — the caller owns the single deploy decision.",{"type":52,"tag":57,"props":2505,"children":2506},{},[2507,2509,2514],{"type":65,"value":2508},"Otherwise, if ",{"type":52,"tag":70,"props":2510,"children":2512},{"className":2511},[],[2513],{"type":65,"value":160},{"type":65,"value":2515}," doesn't exist:",{"type":52,"tag":53,"props":2517,"children":2518},{},[2519,2537],{"type":52,"tag":57,"props":2520,"children":2521},{},[2522,2523,2528,2530,2535],{"type":65,"value":1482},{"type":52,"tag":61,"props":2524,"children":2525},{},[2526],{"type":65,"value":2527},"Gate (plan · integrate-webapi:6.1.deploy-first):",{"type":65,"value":2529}," ",{"type":52,"tag":70,"props":2531,"children":2533},{"className":2532},[],[2534],{"type":65,"value":160},{"type":65,"value":2536}," missing — needed by both architect agents. Deploy first, or skip permissions setup and finish without them.",{"type":52,"tag":57,"props":2538,"children":2539},{},[2540,2544,2546,2551,2553,2557,2559,2563],{"type":52,"tag":61,"props":2541,"children":2542},{},[2543],{"type":65,"value":1497},{"type":65,"value":2545}," Phase 6.1 found no ",{"type":52,"tag":70,"props":2547,"children":2549},{"className":2548},[],[2550],{"type":65,"value":160},{"type":65,"value":2552}," folder.\n",{"type":52,"tag":61,"props":2554,"children":2555},{},[2556],{"type":65,"value":1504},{"type":65,"value":2558}," Auto-skipping leaves the integration broken (no permissions to back the Web API calls); auto-deploying picks the wrong env.\n",{"type":52,"tag":61,"props":2560,"children":2561},{},[2562],{"type":65,"value":1511},{"type":65,"value":2564}," Nothing — services\u002Ftypes\u002Fhooks from Phase 4 stay on disk regardless.",{"type":52,"tag":57,"props":2566,"children":2567},{},[2568,2570,2575],{"type":65,"value":2569},"Use ",{"type":52,"tag":70,"props":2571,"children":2573},{"className":2572},[],[2574],{"type":65,"value":860},{"type":65,"value":395},{"type":52,"tag":609,"props":2577,"children":2578},{},[2579,2593],{"type":52,"tag":613,"props":2580,"children":2581},{},[2582],{"type":52,"tag":617,"props":2583,"children":2584},{},[2585,2589],{"type":52,"tag":621,"props":2586,"children":2587},{},[2588],{"type":65,"value":1561},{"type":52,"tag":621,"props":2590,"children":2591},{},[2592],{"type":65,"value":1566},{"type":52,"tag":637,"props":2594,"children":2595},{},[2596],{"type":52,"tag":617,"props":2597,"children":2598},{},[2599,2610],{"type":52,"tag":644,"props":2600,"children":2601},{},[2602,2603,2608],{"type":65,"value":1887},{"type":52,"tag":70,"props":2604,"children":2606},{"className":2605},[],[2607],{"type":65,"value":160},{"type":65,"value":2609}," folder was not found. The site needs to be deployed once before permissions and site settings can be configured. Would you like to deploy now?",{"type":52,"tag":644,"props":2611,"children":2612},{},[2613],{"type":65,"value":2614},"Yes, deploy now (Recommended), Skip permissions for now — I'll set them up later",{"type":52,"tag":57,"props":2616,"children":2617},{},[2618,2623,2625,2630],{"type":52,"tag":61,"props":2619,"children":2620},{},[2621],{"type":65,"value":2622},"If \"Yes, deploy now\"",{"type":65,"value":2624},": Invoke ",{"type":52,"tag":70,"props":2626,"children":2628},{"className":2627},[],[2629],{"type":65,"value":364},{"type":65,"value":2631}," first, then resume this phase.",{"type":52,"tag":57,"props":2633,"children":2634},{},[2635,2640],{"type":52,"tag":61,"props":2636,"children":2637},{},[2638],{"type":65,"value":2639},"If \"Skip\"",{"type":65,"value":2641},": Skip to Phase 7 with a note that permissions and site settings still need to be configured.",{"type":52,"tag":397,"props":2643,"children":2645},{"id":2644},"_62-choose-permissions-source",[2646],{"type":65,"value":2647},"6.2 Choose Permissions Source",{"type":52,"tag":53,"props":2649,"children":2650},{},[2651,2662],{"type":52,"tag":57,"props":2652,"children":2653},{},[2654,2655,2660],{"type":65,"value":1482},{"type":52,"tag":61,"props":2656,"children":2657},{},[2658],{"type":65,"value":2659},"Gate (plan · integrate-webapi:6.2.permissions-source):",{"type":65,"value":2661}," Decide between uploading an existing permissions diagram (Path A) and letting the architect agents derive it (Path B). Choice routes the rest of Phase 6.",{"type":52,"tag":57,"props":2663,"children":2664},{},[2665,2669,2671,2675,2677,2681],{"type":52,"tag":61,"props":2666,"children":2667},{},[2668],{"type":65,"value":1497},{"type":65,"value":2670}," Entering Phase 6.2 after deployment prerequisite is satisfied.\n",{"type":52,"tag":61,"props":2672,"children":2673},{},[2674],{"type":65,"value":1504},{"type":65,"value":2676}," Path A produces table permissions matching a stale or wrong diagram; Path B can take minutes to query Dataverse.\n",{"type":52,"tag":61,"props":2678,"children":2679},{},[2680],{"type":65,"value":1511},{"type":65,"value":2682}," Nothing — no permission YAML written yet.",{"type":52,"tag":57,"props":2684,"children":2685},{},[2686,2690,2692,2697,2699,2704,2706,2711],{"type":52,"tag":61,"props":2687,"children":2688},{},[2689],{"type":65,"value":1122},{"type":65,"value":2691}," skip the permissions-source question\nentirely and default to ",{"type":52,"tag":61,"props":2693,"children":2694},{},[2695],{"type":65,"value":2696},"Path B (let the architects figure it out)",{"type":65,"value":2698}," — proceed directly to\nsection 6.3. Per the Phase 1.6 contract, no ",{"type":52,"tag":70,"props":2700,"children":2702},{"className":2701},[],[2703],{"type":65,"value":860},{"type":65,"value":2705}," is issued here; the caller\n(",{"type":52,"tag":70,"props":2707,"children":2709},{"className":2708},[],[2710],{"type":65,"value":178},{"type":65,"value":2712},") owns this decision, and the AI-only architect prompts in 6.3 already encode\nthe read-only posture. Path A (upload an existing permissions diagram) is an interactive human\npath and does not apply to delegated runs.",{"type":52,"tag":57,"props":2714,"children":2715},{},[2716,2718,2723],{"type":65,"value":2717},"Otherwise, ask the user how they want to define the permissions using the ",{"type":52,"tag":70,"props":2719,"children":2721},{"className":2720},[],[2722],{"type":65,"value":860},{"type":65,"value":2724}," tool:",{"type":52,"tag":57,"props":2726,"children":2727},{},[2728,2732],{"type":52,"tag":61,"props":2729,"children":2730},{},[2731],{"type":65,"value":1561},{"type":65,"value":2733},": \"How would you like to define the Web API permissions and settings for your site?\"",{"type":52,"tag":609,"props":2735,"children":2736},{},[2737,2753],{"type":52,"tag":613,"props":2738,"children":2739},{},[2740],{"type":52,"tag":617,"props":2741,"children":2742},{},[2743,2748],{"type":52,"tag":621,"props":2744,"children":2745},{},[2746],{"type":65,"value":2747},"Option",{"type":52,"tag":621,"props":2749,"children":2750},{},[2751],{"type":65,"value":2752},"Description",{"type":52,"tag":637,"props":2754,"children":2755},{},[2756,2772],{"type":52,"tag":617,"props":2757,"children":2758},{},[2759,2767],{"type":52,"tag":644,"props":2760,"children":2761},{},[2762],{"type":52,"tag":61,"props":2763,"children":2764},{},[2765],{"type":65,"value":2766},"Upload an existing permissions diagram",{"type":52,"tag":644,"props":2768,"children":2769},{},[2770],{"type":65,"value":2771},"Provide an image (PNG\u002FJPG) or Mermaid diagram of your existing permissions structure",{"type":52,"tag":617,"props":2773,"children":2774},{},[2775,2783],{"type":52,"tag":644,"props":2776,"children":2777},{},[2778],{"type":52,"tag":61,"props":2779,"children":2780},{},[2781],{"type":65,"value":2782},"Let the architects figure it out",{"type":52,"tag":644,"props":2784,"children":2785},{},[2786],{"type":65,"value":2787},"The Table Permissions Architect and Web API Settings Architect will analyze your site's code, data model, and Dataverse environment, then propose permissions and settings automatically",{"type":52,"tag":57,"props":2789,"children":2790},{},[2791],{"type":65,"value":2792},"Route to the appropriate path:",{"type":52,"tag":2794,"props":2795,"children":2797},"h4",{"id":2796},"path-a-upload-existing-permissions-diagram",[2798],{"type":65,"value":2799},"Path A: Upload Existing Permissions Diagram",{"type":52,"tag":53,"props":2801,"children":2802},{},[2803,2814],{"type":52,"tag":57,"props":2804,"children":2805},{},[2806,2807,2812],{"type":65,"value":1482},{"type":52,"tag":61,"props":2808,"children":2809},{},[2810],{"type":65,"value":2811},"Gate (plan · integrate-webapi:6.2.permissions-approval):",{"type":65,"value":2813}," Final sign-off on the parsed permissions plan (from the uploaded diagram) before any web-role \u002F table-permission \u002F site-setting YAML write. Fires at step 6 of the Path A sequence below.",{"type":52,"tag":57,"props":2815,"children":2816},{},[2817,2821,2823,2827,2829,2835,2837,2841],{"type":52,"tag":61,"props":2818,"children":2819},{},[2820],{"type":65,"value":1497},{"type":65,"value":2822}," Path A — diagram parsed and Mermaid flowchart rendered.\n",{"type":52,"tag":61,"props":2824,"children":2825},{},[2826],{"type":65,"value":1504},{"type":65,"value":2828}," Wrong scope \u002F wrong CRUD flags get committed to ",{"type":52,"tag":70,"props":2830,"children":2832},{"className":2831},[],[2833],{"type":65,"value":2834},".powerpages-site\u002Ftable-permissions\u002F",{"type":65,"value":2836}," — fixable but noisy in git history.\n",{"type":52,"tag":61,"props":2838,"children":2839},{},[2840],{"type":65,"value":1511},{"type":65,"value":2842}," Nothing — no YAML files written yet.",{"type":52,"tag":57,"props":2844,"children":2845},{},[2846],{"type":65,"value":2847},"If the user chooses to upload an existing diagram:",{"type":52,"tag":278,"props":2849,"children":2850},{},[2851,2896,2977,2994,3007,3012,3056],{"type":52,"tag":102,"props":2852,"children":2853},{},[2854,2856],{"type":65,"value":2855},"Ask the user to provide their permissions diagram. Supported formats:",{"type":52,"tag":98,"props":2857,"children":2858},{},[2859,2876,2886],{"type":52,"tag":102,"props":2860,"children":2861},{},[2862,2867,2869,2874],{"type":52,"tag":61,"props":2863,"children":2864},{},[2865],{"type":65,"value":2866},"Image file",{"type":65,"value":2868}," (PNG, JPG) — Use the ",{"type":52,"tag":70,"props":2870,"children":2872},{"className":2871},[],[2873],{"type":65,"value":1386},{"type":65,"value":2875}," tool to view the image and extract web roles, table permissions, CRUD flags, scopes, and site settings from it",{"type":52,"tag":102,"props":2877,"children":2878},{},[2879,2884],{"type":52,"tag":61,"props":2880,"children":2881},{},[2882],{"type":65,"value":2883},"Mermaid syntax",{"type":65,"value":2885}," — The user can paste a Mermaid flowchart diagram text directly in chat",{"type":52,"tag":102,"props":2887,"children":2888},{},[2889,2894],{"type":52,"tag":61,"props":2890,"children":2891},{},[2892],{"type":65,"value":2893},"Text description",{"type":65,"value":2895}," — A structured list of web roles, table permissions, scopes, and site settings",{"type":52,"tag":102,"props":2897,"children":2898},{},[2899,2901],{"type":65,"value":2900},"Parse the diagram into structured format:",{"type":52,"tag":98,"props":2902,"children":2903},{},[2904,2922,2932],{"type":52,"tag":102,"props":2905,"children":2906},{},[2907,2912,2914,2920],{"type":52,"tag":61,"props":2908,"children":2909},{},[2910],{"type":65,"value":2911},"Web roles",{"type":65,"value":2913},": Match with existing roles from ",{"type":52,"tag":70,"props":2915,"children":2917},{"className":2916},[],[2918],{"type":65,"value":2919},".powerpages-site\u002Fweb-roles\u002F",{"type":65,"value":2921}," by name to get their UUIDs",{"type":52,"tag":102,"props":2923,"children":2924},{},[2925,2930],{"type":52,"tag":61,"props":2926,"children":2927},{},[2928],{"type":65,"value":2929},"Table permissions",{"type":65,"value":2931},": Permission name, table logical name, web role UUID(s), scope, CRUD flags (read\u002Fcreate\u002Fwrite\u002Fdelete\u002Fappend\u002Fappendto), parent permission and relationship name (if Parent scope)",{"type":52,"tag":102,"props":2933,"children":2934},{},[2935,2940,2942,2948,2949,2954,2956],{"type":52,"tag":61,"props":2936,"children":2937},{},[2938],{"type":65,"value":2939},"Site settings",{"type":65,"value":2941},": ",{"type":52,"tag":70,"props":2943,"children":2945},{"className":2944},[],[2946],{"type":65,"value":2947},"Webapi\u002F\u003Ctable>\u002Fenabled",{"type":65,"value":137},{"type":52,"tag":70,"props":2950,"children":2952},{"className":2951},[],[2953],{"type":65,"value":848},{"type":65,"value":2955}," — ",{"type":52,"tag":61,"props":2957,"children":2958},{},[2959,2961,2967,2969,2975],{"type":65,"value":2960},"CRITICAL: fields normally list specific column logical names; only use ",{"type":52,"tag":70,"props":2962,"children":2964},{"className":2963},[],[2965],{"type":65,"value":2966},"*",{"type":65,"value":2968}," when the site relies on aggregate OData queries (",{"type":52,"tag":70,"props":2970,"children":2972},{"className":2971},[],[2973],{"type":65,"value":2974},"$apply",{"type":65,"value":2976},"\u002Faggregate) that otherwise fail with 403",{"type":52,"tag":102,"props":2978,"children":2979},{},[2980,2985,2987,2992],{"type":52,"tag":61,"props":2981,"children":2982},{},[2983],{"type":65,"value":2984},"Validate column names against Dataverse",{"type":65,"value":2986}," — Even when using a user-provided diagram, query Dataverse for each table's column LogicalNames and verify that every column in the ",{"type":52,"tag":70,"props":2988,"children":2990},{"className":2989},[],[2991],{"type":65,"value":848},{"type":65,"value":2993}," values uses the exact Dataverse LogicalName (case-sensitive). Correct any mismatches before creating files.",{"type":52,"tag":102,"props":2995,"children":2996},{},[2997,2999,3005],{"type":65,"value":2998},"Cross-check with existing configuration in ",{"type":52,"tag":70,"props":3000,"children":3002},{"className":3001},[],[3003],{"type":65,"value":3004},".powerpages-site\u002F",{"type":65,"value":3006}," to identify which permissions and site settings are new vs. already exist.",{"type":52,"tag":102,"props":3008,"children":3009},{},[3010],{"type":65,"value":3011},"Generate a Mermaid flowchart from the parsed data (if the user provided an image or text) for visual confirmation.",{"type":52,"tag":102,"props":3013,"children":3014},{},[3015,3017,3022,3023],{"type":65,"value":3016},"Present the parsed permissions plan to the user for approval using ",{"type":52,"tag":70,"props":3018,"children":3020},{"className":3019},[],[3021],{"type":65,"value":860},{"type":65,"value":395},{"type":52,"tag":609,"props":3024,"children":3025},{},[3026,3040],{"type":52,"tag":613,"props":3027,"children":3028},{},[3029],{"type":52,"tag":617,"props":3030,"children":3031},{},[3032,3036],{"type":52,"tag":621,"props":3033,"children":3034},{},[3035],{"type":65,"value":1561},{"type":52,"tag":621,"props":3037,"children":3038},{},[3039],{"type":65,"value":1566},{"type":52,"tag":637,"props":3041,"children":3042},{},[3043],{"type":52,"tag":617,"props":3044,"children":3045},{},[3046,3051],{"type":52,"tag":644,"props":3047,"children":3048},{},[3049],{"type":65,"value":3050},"Does this permissions plan look correct?",{"type":52,"tag":644,"props":3052,"children":3053},{},[3054],{"type":65,"value":3055},"Approve and create files (Recommended), Request changes, Cancel",{"type":52,"tag":102,"props":3057,"children":3058},{},[3059,3061,3066],{"type":65,"value":3060},"Proceed directly to ",{"type":52,"tag":61,"props":3062,"children":3063},{},[3064],{"type":65,"value":3065},"section 6.4: Create Permission & Settings Files",{"type":65,"value":3067}," with the parsed data.",{"type":52,"tag":2794,"props":3069,"children":3071},{"id":3070},"path-b-let-the-architects-figure-it-out",[3072],{"type":65,"value":3073},"Path B: Let the Architects Figure It Out",{"type":52,"tag":57,"props":3075,"children":3076},{},[3077,3079,3084],{"type":65,"value":3078},"If the user chooses to let the architects figure it out, proceed to ",{"type":52,"tag":61,"props":3080,"children":3081},{},[3082],{"type":65,"value":3083},"section 6.3: Invoke Table Permissions Agent",{"type":65,"value":454},{"type":52,"tag":397,"props":3086,"children":3088},{"id":3087},"_63-invoke-table-permissions-and-web-api-settings-agents-in-parallel",[3089],{"type":65,"value":3090},"6.3 Invoke Table Permissions and Web API Settings Agents (in Parallel)",{"type":52,"tag":57,"props":3092,"children":3093},{},[3094,3096,3101,3103,3108],{"type":65,"value":3095},"These two agents are ",{"type":52,"tag":61,"props":3097,"children":3098},{},[3099],{"type":65,"value":3100},"independent",{"type":65,"value":3102}," — invoke them in parallel using two ",{"type":52,"tag":70,"props":3104,"children":3106},{"className":3105},[],[3107],{"type":65,"value":961},{"type":65,"value":3109}," calls simultaneously:",{"type":52,"tag":2794,"props":3111,"children":3113},{"id":3112},"table-permissions-agent",[3114],{"type":65,"value":3115},"Table Permissions Agent",{"type":52,"tag":57,"props":3117,"children":3118},{},[3119,3120,3125,3126,3131,3132,3138],{"type":65,"value":948},{"type":52,"tag":70,"props":3121,"children":3123},{"className":3122},[],[3124],{"type":65,"value":961},{"type":65,"value":1658},{"type":52,"tag":70,"props":3127,"children":3129},{"className":3128},[],[3130],{"type":65,"value":135},{"type":65,"value":1665},{"type":52,"tag":70,"props":3133,"children":3135},{"className":3134},[],[3136],{"type":65,"value":3137},"${PLUGIN_ROOT}\u002Fagents\u002Ftable-permissions-architect.md",{"type":65,"value":395},{"type":52,"tag":57,"props":3140,"children":3141},{},[3142],{"type":52,"tag":61,"props":3143,"children":3144},{},[3145],{"type":65,"value":3146},"Prompt (default — full CRUD):",{"type":52,"tag":53,"props":3148,"children":3149},{},[3150],{"type":52,"tag":57,"props":3151,"children":3152},{},[3153,3155,3160],{"type":65,"value":3154},"\"Analyze this Power Pages code site and propose table permissions. The following tables have been integrated with Web API: ",{"type":52,"tag":1582,"props":3156,"children":3157},{},[3158],{"type":65,"value":3159},"list of tables integrated in Phase 4",{"type":65,"value":3161},". Check for existing web roles and table permissions. Propose a complete table permissions plan covering all integrated tables. After I approve the plan, create the web role and table permission YAML files using the deterministic scripts.\"",{"type":52,"tag":57,"props":3163,"children":3164},{},[3165,3170],{"type":52,"tag":61,"props":3166,"children":3167},{},[3168],{"type":65,"value":3169},"Prompt (AI-only read mode active):",{"type":65,"value":3171}," append to the default prompt:",{"type":52,"tag":53,"props":3173,"children":3174},{},[3175,3200],{"type":52,"tag":57,"props":3176,"children":3177},{},[3178,3179,3183,3185,3190,3192,3198],{"type":65,"value":1809},{"type":52,"tag":61,"props":3180,"children":3181},{},[3182],{"type":65,"value":1814},{"type":65,"value":3184}," The caller is ",{"type":52,"tag":70,"props":3186,"children":3188},{"className":3187},[],[3189],{"type":65,"value":178},{"type":65,"value":3191}," and these tables will be summarised by ",{"type":52,"tag":70,"props":3193,"children":3195},{"className":3194},[],[3196],{"type":65,"value":3197},"\u002F_api\u002Fsummarization\u002Fdata\u002Fv1.0\u002F",{"type":65,"value":3199}," — the endpoint is semantically a read and never mutates Dataverse. Therefore:",{"type":52,"tag":98,"props":3201,"children":3202},{},[3203,3245,3291],{"type":52,"tag":102,"props":3204,"children":3205},{},[3206,3208,3214,3215,3220,3222,3228,3229,3235,3237,3243],{"type":65,"value":3207},"Set ",{"type":52,"tag":70,"props":3209,"children":3211},{"className":3210},[],[3212],{"type":65,"value":3213},"read: true",{"type":65,"value":2529},{"type":52,"tag":61,"props":3216,"children":3217},{},[3218],{"type":65,"value":3219},"only",{"type":65,"value":3221},". Do NOT propose ",{"type":52,"tag":70,"props":3223,"children":3225},{"className":3224},[],[3226],{"type":65,"value":3227},"create",{"type":65,"value":1344},{"type":52,"tag":70,"props":3230,"children":3232},{"className":3231},[],[3233],{"type":65,"value":3234},"write",{"type":65,"value":3236},", or ",{"type":52,"tag":70,"props":3238,"children":3240},{"className":3239},[],[3241],{"type":65,"value":3242},"delete",{"type":65,"value":3244}," even if the default convention would include them.",{"type":52,"tag":102,"props":3246,"children":3247},{},[3248,3250,3255,3257,3262,3263,3268,3270,3275,3276,3281,3283,3289],{"type":65,"value":3249},"For collection-valued ",{"type":52,"tag":70,"props":3251,"children":3253},{"className":3252},[],[3254],{"type":65,"value":710},{"type":65,"value":3256}," targets (primary=",{"type":52,"tag":70,"props":3258,"children":3260},{"className":3259},[],[3261],{"type":65,"value":1153},{"type":65,"value":1155},{"type":52,"tag":70,"props":3264,"children":3266},{"className":3265},[],[3267],{"type":65,"value":1161},{"type":65,"value":3269},"), use ",{"type":52,"tag":61,"props":3271,"children":3272},{},[3273],{"type":65,"value":3274},"Parent scope",{"type":65,"value":1840},{"type":52,"tag":70,"props":3277,"children":3279},{"className":3278},[],[3280],{"type":65,"value":3213},{"type":65,"value":3282},", and add ",{"type":52,"tag":70,"props":3284,"children":3286},{"className":3285},[],[3287],{"type":65,"value":3288},"appendTo: true",{"type":65,"value":3290}," on the parent table permission so the relationship traversal is allowed.",{"type":52,"tag":102,"props":3292,"children":3293},{},[3294,3296,3301,3303,3309],{"type":65,"value":3295},"If no suitable web role exists, surface this back to the caller — ",{"type":52,"tag":70,"props":3297,"children":3299},{"className":3298},[],[3300],{"type":65,"value":178},{"type":65,"value":3302}," will invoke ",{"type":52,"tag":70,"props":3304,"children":3306},{"className":3305},[],[3307],{"type":65,"value":3308},"\u002Fcreate-webroles",{"type":65,"value":3310}," up front; do not block on role creation here.\"",{"type":52,"tag":57,"props":3312,"children":3313},{},[3314],{"type":65,"value":3315},"The agent will:",{"type":52,"tag":278,"props":3317,"children":3318},{},[3319,3324,3329,3340,3351],{"type":52,"tag":102,"props":3320,"children":3321},{},[3322],{"type":65,"value":3323},"Analyze the site and propose a plan (with Mermaid diagram)",{"type":52,"tag":102,"props":3325,"children":3326},{},[3327],{"type":65,"value":3328},"Present the plan via plan mode for user approval",{"type":52,"tag":102,"props":3330,"children":3331},{},[3332,3334],{"type":65,"value":3333},"After approval, create any needed web roles using ",{"type":52,"tag":70,"props":3335,"children":3337},{"className":3336},[],[3338],{"type":65,"value":3339},"create-web-role.js",{"type":52,"tag":102,"props":3341,"children":3342},{},[3343,3345],{"type":65,"value":3344},"Create all table permission files using ",{"type":52,"tag":70,"props":3346,"children":3348},{"className":3347},[],[3349],{"type":65,"value":3350},"create-table-permission.js",{"type":52,"tag":102,"props":3352,"children":3353},{},[3354],{"type":65,"value":3355},"Return a summary of created files",{"type":52,"tag":2794,"props":3357,"children":3359},{"id":3358},"web-api-settings-agent",[3360],{"type":65,"value":3361},"Web API Settings Agent",{"type":52,"tag":57,"props":3363,"children":3364},{},[3365,3366,3371,3372,3377,3378,3384],{"type":65,"value":948},{"type":52,"tag":70,"props":3367,"children":3369},{"className":3368},[],[3370],{"type":65,"value":961},{"type":65,"value":1658},{"type":52,"tag":70,"props":3373,"children":3375},{"className":3374},[],[3376],{"type":65,"value":143},{"type":65,"value":1665},{"type":52,"tag":70,"props":3379,"children":3381},{"className":3380},[],[3382],{"type":65,"value":3383},"${PLUGIN_ROOT}\u002Fagents\u002Fwebapi-settings-architect.md",{"type":65,"value":395},{"type":52,"tag":57,"props":3386,"children":3387},{},[3388],{"type":52,"tag":61,"props":3389,"children":3390},{},[3391],{"type":65,"value":3146},{"type":52,"tag":53,"props":3393,"children":3394},{},[3395],{"type":52,"tag":57,"props":3396,"children":3397},{},[3398,3400,3404],{"type":65,"value":3399},"\"Analyze this Power Pages code site and propose Web API site settings. The following tables have been integrated with Web API: ",{"type":52,"tag":1582,"props":3401,"children":3402},{},[3403],{"type":65,"value":3159},{"type":65,"value":3405},". Check for existing site settings and query Dataverse for exact column LogicalNames. Propose site settings with case-sensitive validated column names. After I approve the plan, create the site setting YAML files using the deterministic scripts.\"",{"type":52,"tag":57,"props":3407,"children":3408},{},[3409,3413],{"type":52,"tag":61,"props":3410,"children":3411},{},[3412],{"type":65,"value":3169},{"type":65,"value":3171},{"type":52,"tag":53,"props":3415,"children":3416},{},[3417,3434],{"type":52,"tag":57,"props":3418,"children":3419},{},[3420,3421,3425,3427,3432],{"type":65,"value":1809},{"type":52,"tag":61,"props":3422,"children":3423},{},[3424],{"type":65,"value":1814},{"type":65,"value":3426}," These tables will be summarised by ",{"type":52,"tag":70,"props":3428,"children":3430},{"className":3429},[],[3431],{"type":65,"value":3197},{"type":65,"value":3433},". The fields list rules are stricter than the default CRUD posture:",{"type":52,"tag":98,"props":3435,"children":3436},{},[3437,3468,3495,3522],{"type":52,"tag":102,"props":3438,"children":3439},{},[3440,3445,3447,3452,3454,3459,3461,3466],{"type":52,"tag":70,"props":3441,"children":3443},{"className":3442},[],[3444],{"type":65,"value":848},{"type":65,"value":3446}," must contain ",{"type":52,"tag":61,"props":3448,"children":3449},{},[3450],{"type":65,"value":3451},"exactly",{"type":65,"value":3453}," the columns named in the primary's ",{"type":52,"tag":70,"props":3455,"children":3457},{"className":3456},[],[3458],{"type":65,"value":1183},{"type":65,"value":3460}," \u002F ",{"type":52,"tag":70,"props":3462,"children":3464},{"className":3463},[],[3465],{"type":65,"value":710},{"type":65,"value":3467}," — no more, no less.",{"type":52,"tag":102,"props":3469,"children":3470},{},[3471,3473,3478,3480,3486,3488,3494],{"type":65,"value":3472},"Do ",{"type":52,"tag":61,"props":3474,"children":3475},{},[3476],{"type":65,"value":3477},"not",{"type":65,"value":3479}," include the primary key column. The summarization endpoint carries the record id in the URL path; Microsoft's shipped case preset ships ",{"type":52,"tag":70,"props":3481,"children":3483},{"className":3482},[],[3484],{"type":65,"value":3485},"Webapi\u002Fincident\u002Ffields = description,title",{"type":65,"value":3487}," with no ",{"type":52,"tag":70,"props":3489,"children":3491},{"className":3490},[],[3492],{"type":65,"value":3493},"incidentid",{"type":65,"value":454},{"type":52,"tag":102,"props":3496,"children":3497},{},[3498,3500,3504,3506,3512,3514,3520],{"type":65,"value":3499},"For lookup columns, include ",{"type":52,"tag":61,"props":3501,"children":3502},{},[3503],{"type":65,"value":3219},{"type":65,"value":3505}," the ",{"type":52,"tag":70,"props":3507,"children":3509},{"className":3508},[],[3510],{"type":65,"value":3511},"_\u003Ccol>_value",{"type":65,"value":3513}," OData read form. Do NOT add the write form ",{"type":52,"tag":70,"props":3515,"children":3517},{"className":3516},[],[3518],{"type":65,"value":3519},"\u003Ccol>",{"type":65,"value":3521}," unless the same table has non-AI mutation code elsewhere.",{"type":52,"tag":102,"props":3523,"children":3524},{},[3525],{"type":65,"value":3526},"Still query Dataverse for exact LogicalNames (case-sensitive) — case mismatches produce 403.\"",{"type":52,"tag":57,"props":3528,"children":3529},{},[3530],{"type":65,"value":3315},{"type":52,"tag":278,"props":3532,"children":3533},{},[3534,3539,3544,3548,3559],{"type":52,"tag":102,"props":3535,"children":3536},{},[3537],{"type":65,"value":3538},"Analyze the site, query Dataverse for exact column LogicalNames",{"type":52,"tag":102,"props":3540,"children":3541},{},[3542],{"type":65,"value":3543},"Cross-validate column names (case-sensitive)",{"type":52,"tag":102,"props":3545,"children":3546},{},[3547],{"type":65,"value":3328},{"type":52,"tag":102,"props":3549,"children":3550},{},[3551,3553],{"type":65,"value":3552},"After approval, create all site setting files using ",{"type":52,"tag":70,"props":3554,"children":3556},{"className":3555},[],[3557],{"type":65,"value":3558},"create-site-setting.js",{"type":52,"tag":102,"props":3560,"children":3561},{},[3562],{"type":65,"value":3355},{"type":52,"tag":57,"props":3564,"children":3565},{},[3566,3568,3573],{"type":65,"value":3567},"Wait for ",{"type":52,"tag":61,"props":3569,"children":3570},{},[3571],{"type":65,"value":3572},"both",{"type":65,"value":3574}," agents to complete before proceeding to 6.4.",{"type":52,"tag":397,"props":3576,"children":3578},{"id":3577},"_64-create-permission-settings-files-path-a-only",[3579],{"type":65,"value":3580},"6.4 Create Permission & Settings Files (Path A Only)",{"type":52,"tag":57,"props":3582,"children":3583},{},[3584,3589],{"type":52,"tag":61,"props":3585,"children":3586},{},[3587],{"type":65,"value":3588},"This section applies only to Path A (user-provided permissions diagram).",{"type":65,"value":3590}," For Path B, the architect agents create the files directly in section 6.3.",{"type":52,"tag":57,"props":3592,"children":3593},{},[3594,3596,3601],{"type":65,"value":3595},"After parsing the user's diagram, create the YAML files using the deterministic scripts below. ",{"type":52,"tag":61,"props":3597,"children":3598},{},[3599],{"type":65,"value":3600},"Do NOT write YAML files manually",{"type":65,"value":3602}," — always use these scripts which handle UUID generation, field ordering, formatting, and file naming automatically.",{"type":52,"tag":2794,"props":3604,"children":3606},{"id":3605},"_641-create-web-roles-if-needed",[3607],{"type":65,"value":3608},"6.4.1 Create Web Roles (if needed)",{"type":52,"tag":57,"props":3610,"children":3611},{},[3612],{"type":65,"value":3613},"If the plan requires new web roles that don't already exist, create them first (their UUIDs are needed for table permissions):",{"type":52,"tag":518,"props":3615,"children":3617},{"className":2008,"code":3616,"language":2010,"meta":523,"style":523},"node \"${PLUGIN_ROOT}\u002Fskills\u002Fcreate-webroles\u002Fscripts\u002Fcreate-web-role.js\" --projectRoot \"\u003CPROJECT_ROOT>\" --name \"\u003CRole Name>\" [--anonymous] [--authenticated]\n",[3618],{"type":52,"tag":70,"props":3619,"children":3620},{"__ignoreMap":523},[3621],{"type":52,"tag":1582,"props":3622,"children":3623},{"class":2017,"line":2018},[3624,3629,3634,3640,3645,3650,3654,3659,3663,3668,3672,3677,3681,3686,3690,3695,3700,3705],{"type":52,"tag":1582,"props":3625,"children":3626},{"style":2022},[3627],{"type":65,"value":3628},"node",{"type":52,"tag":1582,"props":3630,"children":3631},{"style":2057},[3632],{"type":65,"value":3633}," \"${",{"type":52,"tag":1582,"props":3635,"children":3637},{"style":3636},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[3638],{"type":65,"value":3639},"PLUGIN_ROOT",{"type":52,"tag":1582,"props":3641,"children":3642},{"style":2057},[3643],{"type":65,"value":3644},"}",{"type":52,"tag":1582,"props":3646,"children":3647},{"style":2028},[3648],{"type":65,"value":3649},"\u002Fskills\u002Fcreate-webroles\u002Fscripts\u002Fcreate-web-role.js",{"type":52,"tag":1582,"props":3651,"children":3652},{"style":2057},[3653],{"type":65,"value":1809},{"type":52,"tag":1582,"props":3655,"children":3656},{"style":2028},[3657],{"type":65,"value":3658}," --projectRoot",{"type":52,"tag":1582,"props":3660,"children":3661},{"style":2057},[3662],{"type":65,"value":2060},{"type":52,"tag":1582,"props":3664,"children":3665},{"style":2028},[3666],{"type":65,"value":3667},"\u003CPROJECT_ROOT>",{"type":52,"tag":1582,"props":3669,"children":3670},{"style":2057},[3671],{"type":65,"value":1809},{"type":52,"tag":1582,"props":3673,"children":3674},{"style":2028},[3675],{"type":65,"value":3676}," --name",{"type":52,"tag":1582,"props":3678,"children":3679},{"style":2057},[3680],{"type":65,"value":2060},{"type":52,"tag":1582,"props":3682,"children":3683},{"style":2028},[3684],{"type":65,"value":3685},"\u003CRole Name>",{"type":52,"tag":1582,"props":3687,"children":3688},{"style":2057},[3689],{"type":65,"value":1809},{"type":52,"tag":1582,"props":3691,"children":3692},{"style":3636},[3693],{"type":65,"value":3694}," [--anonymous] ",{"type":52,"tag":1582,"props":3696,"children":3697},{"style":2057},[3698],{"type":65,"value":3699},"[",{"type":52,"tag":1582,"props":3701,"children":3702},{"style":3636},[3703],{"type":65,"value":3704},"--authenticated",{"type":52,"tag":1582,"props":3706,"children":3707},{"style":2057},[3708],{"type":65,"value":3709},"]\n",{"type":52,"tag":57,"props":3711,"children":3712},{},[3713,3715,3721,3723,3729,3731,3737],{"type":65,"value":3714},"Capture the JSON output (",{"type":52,"tag":70,"props":3716,"children":3718},{"className":3717},[],[3719],{"type":65,"value":3720},"{ \"id\": \"\u003Cuuid>\", \"filePath\": \"\u003Cpath>\" }",{"type":65,"value":3722},") — use the ",{"type":52,"tag":70,"props":3724,"children":3726},{"className":3725},[],[3727],{"type":65,"value":3728},"id",{"type":65,"value":3730}," as the ",{"type":52,"tag":70,"props":3732,"children":3734},{"className":3733},[],[3735],{"type":65,"value":3736},"--webRoleIds",{"type":65,"value":3738}," value when creating table permissions.",{"type":52,"tag":2794,"props":3740,"children":3742},{"id":3741},"_642-create-table-permissions",[3743],{"type":65,"value":3744},"6.4.2 Create Table Permissions",{"type":52,"tag":57,"props":3746,"children":3747},{},[3748,3750,3755],{"type":65,"value":3749},"For each table permission in the plan. Process ",{"type":52,"tag":61,"props":3751,"children":3752},{},[3753],{"type":65,"value":3754},"parent permissions before child permissions",{"type":65,"value":3756}," — children need the parent's UUID from the JSON output.",{"type":52,"tag":57,"props":3758,"children":3759},{},[3760,3764,3766,3771,3773,3779,3780,3786,3787,3793,3795,3801,3802,3808,3810,3816],{"type":52,"tag":61,"props":3761,"children":3762},{},[3763],{"type":65,"value":1122},{"type":65,"value":3765}," the default flag set is ",{"type":52,"tag":70,"props":3767,"children":3769},{"className":3768},[],[3770],{"type":65,"value":840},{"type":65,"value":3772}," only. Do NOT pass ",{"type":52,"tag":70,"props":3774,"children":3776},{"className":3775},[],[3777],{"type":65,"value":3778},"--create",{"type":65,"value":1344},{"type":52,"tag":70,"props":3781,"children":3783},{"className":3782},[],[3784],{"type":65,"value":3785},"--write",{"type":65,"value":3236},{"type":52,"tag":70,"props":3788,"children":3790},{"className":3789},[],[3791],{"type":65,"value":3792},"--delete",{"type":65,"value":3794}," for any permission in scope — AI summarization reads never mutate. For Parent-scope child permissions, still pass ",{"type":52,"tag":70,"props":3796,"children":3798},{"className":3797},[],[3799],{"type":65,"value":3800},"--parentPermissionId",{"type":65,"value":137},{"type":52,"tag":70,"props":3803,"children":3805},{"className":3804},[],[3806],{"type":65,"value":3807},"--parentRelationshipName",{"type":65,"value":3809},"; on the parent permission add ",{"type":52,"tag":70,"props":3811,"children":3813},{"className":3812},[],[3814],{"type":65,"value":3815},"--appendto",{"type":65,"value":3817}," so the AI endpoint can traverse the relationship.",{"type":52,"tag":57,"props":3819,"children":3820},{},[3821],{"type":52,"tag":61,"props":3822,"children":3823},{},[3824],{"type":65,"value":3825},"For Global\u002FContact\u002FAccount\u002FSelf scope:",{"type":52,"tag":518,"props":3827,"children":3829},{"className":2008,"code":3828,"language":2010,"meta":523,"style":523},"node \"${PLUGIN_ROOT}\u002Fscripts\u002Fcreate-table-permission.js\" --projectRoot \"\u003CPROJECT_ROOT>\" --permissionName \"\u003CPermission Name>\" --tableName \"\u003Ctable_logical_name>\" --webRoleIds \"\u003Cuuid1,uuid2>\" --scope \"Global\" [--read] [--create] [--write] [--delete] [--append] [--appendto]\nnode \"${PLUGIN_ROOT}\u002Fscripts\u002Fcreate-table-permission.js\" --projectRoot \"\u003CPROJECT_ROOT>\" --permissionName \"\u003CPermission Name>\" --tableName \"\u003Ctable_logical_name>\" --webRoleIds \"\u003Cuuid1,uuid2>\" --scope \"Contact\" --contactRelationshipName \"\u003Clookup_to_contact>\" [--read] [--create] [--write] [--delete] [--append] [--appendto]\nnode \"${PLUGIN_ROOT}\u002Fscripts\u002Fcreate-table-permission.js\" --projectRoot \"\u003CPROJECT_ROOT>\" --permissionName \"\u003CPermission Name>\" --tableName \"\u003Ctable_logical_name>\" --webRoleIds \"\u003Cuuid1,uuid2>\" --scope \"Account\" --accountRelationshipName \"\u003Clookup_to_account>\" [--read] [--create] [--write] [--delete] [--append] [--appendto]\nnode \"${PLUGIN_ROOT}\u002Fscripts\u002Fcreate-table-permission.js\" --projectRoot \"\u003CPROJECT_ROOT>\" --permissionName \"\u003CPermission Name>\" --tableName \"\u003Ctable_logical_name>\" --webRoleIds \"\u003Cuuid1,uuid2>\" --scope \"Self\" [--read] [--create] [--write] [--delete] [--append] [--appendto]\n",[3830],{"type":52,"tag":70,"props":3831,"children":3832},{"__ignoreMap":523},[3833,4017,4207,4398],{"type":52,"tag":1582,"props":3834,"children":3835},{"class":2017,"line":2018},[3836,3840,3844,3848,3852,3857,3861,3865,3869,3873,3877,3882,3886,3891,3895,3900,3904,3909,3913,3918,3922,3927,3931,3936,3940,3945,3949,3954,3958,3962,3967,3972,3976,3980,3984,3988,3992,3996,4001,4005,4009,4013],{"type":52,"tag":1582,"props":3837,"children":3838},{"style":2022},[3839],{"type":65,"value":3628},{"type":52,"tag":1582,"props":3841,"children":3842},{"style":2057},[3843],{"type":65,"value":3633},{"type":52,"tag":1582,"props":3845,"children":3846},{"style":3636},[3847],{"type":65,"value":3639},{"type":52,"tag":1582,"props":3849,"children":3850},{"style":2057},[3851],{"type":65,"value":3644},{"type":52,"tag":1582,"props":3853,"children":3854},{"style":2028},[3855],{"type":65,"value":3856},"\u002Fscripts\u002Fcreate-table-permission.js",{"type":52,"tag":1582,"props":3858,"children":3859},{"style":2057},[3860],{"type":65,"value":1809},{"type":52,"tag":1582,"props":3862,"children":3863},{"style":2028},[3864],{"type":65,"value":3658},{"type":52,"tag":1582,"props":3866,"children":3867},{"style":2057},[3868],{"type":65,"value":2060},{"type":52,"tag":1582,"props":3870,"children":3871},{"style":2028},[3872],{"type":65,"value":3667},{"type":52,"tag":1582,"props":3874,"children":3875},{"style":2057},[3876],{"type":65,"value":1809},{"type":52,"tag":1582,"props":3878,"children":3879},{"style":2028},[3880],{"type":65,"value":3881}," --permissionName",{"type":52,"tag":1582,"props":3883,"children":3884},{"style":2057},[3885],{"type":65,"value":2060},{"type":52,"tag":1582,"props":3887,"children":3888},{"style":2028},[3889],{"type":65,"value":3890},"\u003CPermission Name>",{"type":52,"tag":1582,"props":3892,"children":3893},{"style":2057},[3894],{"type":65,"value":1809},{"type":52,"tag":1582,"props":3896,"children":3897},{"style":2028},[3898],{"type":65,"value":3899}," --tableName",{"type":52,"tag":1582,"props":3901,"children":3902},{"style":2057},[3903],{"type":65,"value":2060},{"type":52,"tag":1582,"props":3905,"children":3906},{"style":2028},[3907],{"type":65,"value":3908},"\u003Ctable_logical_name>",{"type":52,"tag":1582,"props":3910,"children":3911},{"style":2057},[3912],{"type":65,"value":1809},{"type":52,"tag":1582,"props":3914,"children":3915},{"style":2028},[3916],{"type":65,"value":3917}," --webRoleIds",{"type":52,"tag":1582,"props":3919,"children":3920},{"style":2057},[3921],{"type":65,"value":2060},{"type":52,"tag":1582,"props":3923,"children":3924},{"style":2028},[3925],{"type":65,"value":3926},"\u003Cuuid1,uuid2>",{"type":52,"tag":1582,"props":3928,"children":3929},{"style":2057},[3930],{"type":65,"value":1809},{"type":52,"tag":1582,"props":3932,"children":3933},{"style":2028},[3934],{"type":65,"value":3935}," --scope",{"type":52,"tag":1582,"props":3937,"children":3938},{"style":2057},[3939],{"type":65,"value":2060},{"type":52,"tag":1582,"props":3941,"children":3942},{"style":2028},[3943],{"type":65,"value":3944},"Global",{"type":52,"tag":1582,"props":3946,"children":3947},{"style":2057},[3948],{"type":65,"value":1809},{"type":52,"tag":1582,"props":3950,"children":3951},{"style":3636},[3952],{"type":65,"value":3953}," [--read] ",{"type":52,"tag":1582,"props":3955,"children":3956},{"style":2057},[3957],{"type":65,"value":3699},{"type":52,"tag":1582,"props":3959,"children":3960},{"style":3636},[3961],{"type":65,"value":3778},{"type":52,"tag":1582,"props":3963,"children":3964},{"style":2057},[3965],{"type":65,"value":3966},"]",{"type":52,"tag":1582,"props":3968,"children":3969},{"style":2057},[3970],{"type":65,"value":3971}," [",{"type":52,"tag":1582,"props":3973,"children":3974},{"style":3636},[3975],{"type":65,"value":3785},{"type":52,"tag":1582,"props":3977,"children":3978},{"style":2057},[3979],{"type":65,"value":3966},{"type":52,"tag":1582,"props":3981,"children":3982},{"style":2057},[3983],{"type":65,"value":3971},{"type":52,"tag":1582,"props":3985,"children":3986},{"style":3636},[3987],{"type":65,"value":3792},{"type":52,"tag":1582,"props":3989,"children":3990},{"style":2057},[3991],{"type":65,"value":3966},{"type":52,"tag":1582,"props":3993,"children":3994},{"style":2057},[3995],{"type":65,"value":3971},{"type":52,"tag":1582,"props":3997,"children":3998},{"style":3636},[3999],{"type":65,"value":4000},"--append",{"type":52,"tag":1582,"props":4002,"children":4003},{"style":2057},[4004],{"type":65,"value":3966},{"type":52,"tag":1582,"props":4006,"children":4007},{"style":2057},[4008],{"type":65,"value":3971},{"type":52,"tag":1582,"props":4010,"children":4011},{"style":3636},[4012],{"type":65,"value":3815},{"type":52,"tag":1582,"props":4014,"children":4015},{"style":2057},[4016],{"type":65,"value":3709},{"type":52,"tag":1582,"props":4018,"children":4019},{"class":2017,"line":2039},[4020,4024,4028,4032,4036,4040,4044,4048,4052,4056,4060,4064,4068,4072,4076,4080,4084,4088,4092,4096,4100,4104,4108,4112,4116,4121,4125,4130,4134,4139,4143,4147,4151,4155,4159,4163,4167,4171,4175,4179,4183,4187,4191,4195,4199,4203],{"type":52,"tag":1582,"props":4021,"children":4022},{"style":2022},[4023],{"type":65,"value":3628},{"type":52,"tag":1582,"props":4025,"children":4026},{"style":2057},[4027],{"type":65,"value":3633},{"type":52,"tag":1582,"props":4029,"children":4030},{"style":3636},[4031],{"type":65,"value":3639},{"type":52,"tag":1582,"props":4033,"children":4034},{"style":2057},[4035],{"type":65,"value":3644},{"type":52,"tag":1582,"props":4037,"children":4038},{"style":2028},[4039],{"type":65,"value":3856},{"type":52,"tag":1582,"props":4041,"children":4042},{"style":2057},[4043],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4045,"children":4046},{"style":2028},[4047],{"type":65,"value":3658},{"type":52,"tag":1582,"props":4049,"children":4050},{"style":2057},[4051],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4053,"children":4054},{"style":2028},[4055],{"type":65,"value":3667},{"type":52,"tag":1582,"props":4057,"children":4058},{"style":2057},[4059],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4061,"children":4062},{"style":2028},[4063],{"type":65,"value":3881},{"type":52,"tag":1582,"props":4065,"children":4066},{"style":2057},[4067],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4069,"children":4070},{"style":2028},[4071],{"type":65,"value":3890},{"type":52,"tag":1582,"props":4073,"children":4074},{"style":2057},[4075],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4077,"children":4078},{"style":2028},[4079],{"type":65,"value":3899},{"type":52,"tag":1582,"props":4081,"children":4082},{"style":2057},[4083],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4085,"children":4086},{"style":2028},[4087],{"type":65,"value":3908},{"type":52,"tag":1582,"props":4089,"children":4090},{"style":2057},[4091],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4093,"children":4094},{"style":2028},[4095],{"type":65,"value":3917},{"type":52,"tag":1582,"props":4097,"children":4098},{"style":2057},[4099],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4101,"children":4102},{"style":2028},[4103],{"type":65,"value":3926},{"type":52,"tag":1582,"props":4105,"children":4106},{"style":2057},[4107],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4109,"children":4110},{"style":2028},[4111],{"type":65,"value":3935},{"type":52,"tag":1582,"props":4113,"children":4114},{"style":2057},[4115],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4117,"children":4118},{"style":2028},[4119],{"type":65,"value":4120},"Contact",{"type":52,"tag":1582,"props":4122,"children":4123},{"style":2057},[4124],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4126,"children":4127},{"style":2028},[4128],{"type":65,"value":4129}," --contactRelationshipName",{"type":52,"tag":1582,"props":4131,"children":4132},{"style":2057},[4133],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4135,"children":4136},{"style":2028},[4137],{"type":65,"value":4138},"\u003Clookup_to_contact>",{"type":52,"tag":1582,"props":4140,"children":4141},{"style":2057},[4142],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4144,"children":4145},{"style":3636},[4146],{"type":65,"value":3953},{"type":52,"tag":1582,"props":4148,"children":4149},{"style":2057},[4150],{"type":65,"value":3699},{"type":52,"tag":1582,"props":4152,"children":4153},{"style":3636},[4154],{"type":65,"value":3778},{"type":52,"tag":1582,"props":4156,"children":4157},{"style":2057},[4158],{"type":65,"value":3966},{"type":52,"tag":1582,"props":4160,"children":4161},{"style":2057},[4162],{"type":65,"value":3971},{"type":52,"tag":1582,"props":4164,"children":4165},{"style":3636},[4166],{"type":65,"value":3785},{"type":52,"tag":1582,"props":4168,"children":4169},{"style":2057},[4170],{"type":65,"value":3966},{"type":52,"tag":1582,"props":4172,"children":4173},{"style":2057},[4174],{"type":65,"value":3971},{"type":52,"tag":1582,"props":4176,"children":4177},{"style":3636},[4178],{"type":65,"value":3792},{"type":52,"tag":1582,"props":4180,"children":4181},{"style":2057},[4182],{"type":65,"value":3966},{"type":52,"tag":1582,"props":4184,"children":4185},{"style":2057},[4186],{"type":65,"value":3971},{"type":52,"tag":1582,"props":4188,"children":4189},{"style":3636},[4190],{"type":65,"value":4000},{"type":52,"tag":1582,"props":4192,"children":4193},{"style":2057},[4194],{"type":65,"value":3966},{"type":52,"tag":1582,"props":4196,"children":4197},{"style":2057},[4198],{"type":65,"value":3971},{"type":52,"tag":1582,"props":4200,"children":4201},{"style":3636},[4202],{"type":65,"value":3815},{"type":52,"tag":1582,"props":4204,"children":4205},{"style":2057},[4206],{"type":65,"value":3709},{"type":52,"tag":1582,"props":4208,"children":4210},{"class":2017,"line":4209},3,[4211,4215,4219,4223,4227,4231,4235,4239,4243,4247,4251,4255,4259,4263,4267,4271,4275,4279,4283,4287,4291,4295,4299,4303,4307,4312,4316,4321,4325,4330,4334,4338,4342,4346,4350,4354,4358,4362,4366,4370,4374,4378,4382,4386,4390,4394],{"type":52,"tag":1582,"props":4212,"children":4213},{"style":2022},[4214],{"type":65,"value":3628},{"type":52,"tag":1582,"props":4216,"children":4217},{"style":2057},[4218],{"type":65,"value":3633},{"type":52,"tag":1582,"props":4220,"children":4221},{"style":3636},[4222],{"type":65,"value":3639},{"type":52,"tag":1582,"props":4224,"children":4225},{"style":2057},[4226],{"type":65,"value":3644},{"type":52,"tag":1582,"props":4228,"children":4229},{"style":2028},[4230],{"type":65,"value":3856},{"type":52,"tag":1582,"props":4232,"children":4233},{"style":2057},[4234],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4236,"children":4237},{"style":2028},[4238],{"type":65,"value":3658},{"type":52,"tag":1582,"props":4240,"children":4241},{"style":2057},[4242],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4244,"children":4245},{"style":2028},[4246],{"type":65,"value":3667},{"type":52,"tag":1582,"props":4248,"children":4249},{"style":2057},[4250],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4252,"children":4253},{"style":2028},[4254],{"type":65,"value":3881},{"type":52,"tag":1582,"props":4256,"children":4257},{"style":2057},[4258],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4260,"children":4261},{"style":2028},[4262],{"type":65,"value":3890},{"type":52,"tag":1582,"props":4264,"children":4265},{"style":2057},[4266],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4268,"children":4269},{"style":2028},[4270],{"type":65,"value":3899},{"type":52,"tag":1582,"props":4272,"children":4273},{"style":2057},[4274],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4276,"children":4277},{"style":2028},[4278],{"type":65,"value":3908},{"type":52,"tag":1582,"props":4280,"children":4281},{"style":2057},[4282],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4284,"children":4285},{"style":2028},[4286],{"type":65,"value":3917},{"type":52,"tag":1582,"props":4288,"children":4289},{"style":2057},[4290],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4292,"children":4293},{"style":2028},[4294],{"type":65,"value":3926},{"type":52,"tag":1582,"props":4296,"children":4297},{"style":2057},[4298],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4300,"children":4301},{"style":2028},[4302],{"type":65,"value":3935},{"type":52,"tag":1582,"props":4304,"children":4305},{"style":2057},[4306],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4308,"children":4309},{"style":2028},[4310],{"type":65,"value":4311},"Account",{"type":52,"tag":1582,"props":4313,"children":4314},{"style":2057},[4315],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4317,"children":4318},{"style":2028},[4319],{"type":65,"value":4320}," --accountRelationshipName",{"type":52,"tag":1582,"props":4322,"children":4323},{"style":2057},[4324],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4326,"children":4327},{"style":2028},[4328],{"type":65,"value":4329},"\u003Clookup_to_account>",{"type":52,"tag":1582,"props":4331,"children":4332},{"style":2057},[4333],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4335,"children":4336},{"style":3636},[4337],{"type":65,"value":3953},{"type":52,"tag":1582,"props":4339,"children":4340},{"style":2057},[4341],{"type":65,"value":3699},{"type":52,"tag":1582,"props":4343,"children":4344},{"style":3636},[4345],{"type":65,"value":3778},{"type":52,"tag":1582,"props":4347,"children":4348},{"style":2057},[4349],{"type":65,"value":3966},{"type":52,"tag":1582,"props":4351,"children":4352},{"style":2057},[4353],{"type":65,"value":3971},{"type":52,"tag":1582,"props":4355,"children":4356},{"style":3636},[4357],{"type":65,"value":3785},{"type":52,"tag":1582,"props":4359,"children":4360},{"style":2057},[4361],{"type":65,"value":3966},{"type":52,"tag":1582,"props":4363,"children":4364},{"style":2057},[4365],{"type":65,"value":3971},{"type":52,"tag":1582,"props":4367,"children":4368},{"style":3636},[4369],{"type":65,"value":3792},{"type":52,"tag":1582,"props":4371,"children":4372},{"style":2057},[4373],{"type":65,"value":3966},{"type":52,"tag":1582,"props":4375,"children":4376},{"style":2057},[4377],{"type":65,"value":3971},{"type":52,"tag":1582,"props":4379,"children":4380},{"style":3636},[4381],{"type":65,"value":4000},{"type":52,"tag":1582,"props":4383,"children":4384},{"style":2057},[4385],{"type":65,"value":3966},{"type":52,"tag":1582,"props":4387,"children":4388},{"style":2057},[4389],{"type":65,"value":3971},{"type":52,"tag":1582,"props":4391,"children":4392},{"style":3636},[4393],{"type":65,"value":3815},{"type":52,"tag":1582,"props":4395,"children":4396},{"style":2057},[4397],{"type":65,"value":3709},{"type":52,"tag":1582,"props":4399,"children":4401},{"class":2017,"line":4400},4,[4402,4406,4410,4414,4418,4422,4426,4430,4434,4438,4442,4446,4450,4454,4458,4462,4466,4470,4474,4478,4482,4486,4490,4494,4498,4503,4507,4511,4515,4519,4523,4527,4531,4535,4539,4543,4547,4551,4555,4559,4563,4567],{"type":52,"tag":1582,"props":4403,"children":4404},{"style":2022},[4405],{"type":65,"value":3628},{"type":52,"tag":1582,"props":4407,"children":4408},{"style":2057},[4409],{"type":65,"value":3633},{"type":52,"tag":1582,"props":4411,"children":4412},{"style":3636},[4413],{"type":65,"value":3639},{"type":52,"tag":1582,"props":4415,"children":4416},{"style":2057},[4417],{"type":65,"value":3644},{"type":52,"tag":1582,"props":4419,"children":4420},{"style":2028},[4421],{"type":65,"value":3856},{"type":52,"tag":1582,"props":4423,"children":4424},{"style":2057},[4425],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4427,"children":4428},{"style":2028},[4429],{"type":65,"value":3658},{"type":52,"tag":1582,"props":4431,"children":4432},{"style":2057},[4433],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4435,"children":4436},{"style":2028},[4437],{"type":65,"value":3667},{"type":52,"tag":1582,"props":4439,"children":4440},{"style":2057},[4441],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4443,"children":4444},{"style":2028},[4445],{"type":65,"value":3881},{"type":52,"tag":1582,"props":4447,"children":4448},{"style":2057},[4449],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4451,"children":4452},{"style":2028},[4453],{"type":65,"value":3890},{"type":52,"tag":1582,"props":4455,"children":4456},{"style":2057},[4457],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4459,"children":4460},{"style":2028},[4461],{"type":65,"value":3899},{"type":52,"tag":1582,"props":4463,"children":4464},{"style":2057},[4465],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4467,"children":4468},{"style":2028},[4469],{"type":65,"value":3908},{"type":52,"tag":1582,"props":4471,"children":4472},{"style":2057},[4473],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4475,"children":4476},{"style":2028},[4477],{"type":65,"value":3917},{"type":52,"tag":1582,"props":4479,"children":4480},{"style":2057},[4481],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4483,"children":4484},{"style":2028},[4485],{"type":65,"value":3926},{"type":52,"tag":1582,"props":4487,"children":4488},{"style":2057},[4489],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4491,"children":4492},{"style":2028},[4493],{"type":65,"value":3935},{"type":52,"tag":1582,"props":4495,"children":4496},{"style":2057},[4497],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4499,"children":4500},{"style":2028},[4501],{"type":65,"value":4502},"Self",{"type":52,"tag":1582,"props":4504,"children":4505},{"style":2057},[4506],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4508,"children":4509},{"style":3636},[4510],{"type":65,"value":3953},{"type":52,"tag":1582,"props":4512,"children":4513},{"style":2057},[4514],{"type":65,"value":3699},{"type":52,"tag":1582,"props":4516,"children":4517},{"style":3636},[4518],{"type":65,"value":3778},{"type":52,"tag":1582,"props":4520,"children":4521},{"style":2057},[4522],{"type":65,"value":3966},{"type":52,"tag":1582,"props":4524,"children":4525},{"style":2057},[4526],{"type":65,"value":3971},{"type":52,"tag":1582,"props":4528,"children":4529},{"style":3636},[4530],{"type":65,"value":3785},{"type":52,"tag":1582,"props":4532,"children":4533},{"style":2057},[4534],{"type":65,"value":3966},{"type":52,"tag":1582,"props":4536,"children":4537},{"style":2057},[4538],{"type":65,"value":3971},{"type":52,"tag":1582,"props":4540,"children":4541},{"style":3636},[4542],{"type":65,"value":3792},{"type":52,"tag":1582,"props":4544,"children":4545},{"style":2057},[4546],{"type":65,"value":3966},{"type":52,"tag":1582,"props":4548,"children":4549},{"style":2057},[4550],{"type":65,"value":3971},{"type":52,"tag":1582,"props":4552,"children":4553},{"style":3636},[4554],{"type":65,"value":4000},{"type":52,"tag":1582,"props":4556,"children":4557},{"style":2057},[4558],{"type":65,"value":3966},{"type":52,"tag":1582,"props":4560,"children":4561},{"style":2057},[4562],{"type":65,"value":3971},{"type":52,"tag":1582,"props":4564,"children":4565},{"style":3636},[4566],{"type":65,"value":3815},{"type":52,"tag":1582,"props":4568,"children":4569},{"style":2057},[4570],{"type":65,"value":3709},{"type":52,"tag":57,"props":4572,"children":4573},{},[4574,4579],{"type":52,"tag":61,"props":4575,"children":4576},{},[4577],{"type":65,"value":4578},"For Parent scope",{"type":65,"value":4580}," (requires parent permission UUID and relationship name):",{"type":52,"tag":518,"props":4582,"children":4584},{"className":2008,"code":4583,"language":2010,"meta":523,"style":523},"node \"${PLUGIN_ROOT}\u002Fscripts\u002Fcreate-table-permission.js\" --projectRoot \"\u003CPROJECT_ROOT>\" --permissionName \"\u003CPermission Name>\" --tableName \"\u003Ctable_logical_name>\" --webRoleIds \"\u003Cuuid1>\" --scope \"Parent\" --parentPermissionId \"\u003Cparent-uuid>\" --parentRelationshipName \"\u003Crelationship_name>\" [--read] [--create] [--write] [--delete] [--append] [--appendto]\n",[4585],{"type":52,"tag":70,"props":4586,"children":4587},{"__ignoreMap":523},[4588],{"type":52,"tag":1582,"props":4589,"children":4590},{"class":2017,"line":2018},[4591,4595,4599,4603,4607,4611,4615,4619,4623,4627,4631,4635,4639,4643,4647,4651,4655,4659,4663,4667,4671,4676,4680,4684,4688,4693,4697,4702,4706,4711,4715,4720,4724,4729,4733,4737,4741,4745,4749,4753,4757,4761,4765,4769,4773,4777,4781,4785,4789,4793],{"type":52,"tag":1582,"props":4592,"children":4593},{"style":2022},[4594],{"type":65,"value":3628},{"type":52,"tag":1582,"props":4596,"children":4597},{"style":2057},[4598],{"type":65,"value":3633},{"type":52,"tag":1582,"props":4600,"children":4601},{"style":3636},[4602],{"type":65,"value":3639},{"type":52,"tag":1582,"props":4604,"children":4605},{"style":2057},[4606],{"type":65,"value":3644},{"type":52,"tag":1582,"props":4608,"children":4609},{"style":2028},[4610],{"type":65,"value":3856},{"type":52,"tag":1582,"props":4612,"children":4613},{"style":2057},[4614],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4616,"children":4617},{"style":2028},[4618],{"type":65,"value":3658},{"type":52,"tag":1582,"props":4620,"children":4621},{"style":2057},[4622],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4624,"children":4625},{"style":2028},[4626],{"type":65,"value":3667},{"type":52,"tag":1582,"props":4628,"children":4629},{"style":2057},[4630],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4632,"children":4633},{"style":2028},[4634],{"type":65,"value":3881},{"type":52,"tag":1582,"props":4636,"children":4637},{"style":2057},[4638],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4640,"children":4641},{"style":2028},[4642],{"type":65,"value":3890},{"type":52,"tag":1582,"props":4644,"children":4645},{"style":2057},[4646],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4648,"children":4649},{"style":2028},[4650],{"type":65,"value":3899},{"type":52,"tag":1582,"props":4652,"children":4653},{"style":2057},[4654],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4656,"children":4657},{"style":2028},[4658],{"type":65,"value":3908},{"type":52,"tag":1582,"props":4660,"children":4661},{"style":2057},[4662],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4664,"children":4665},{"style":2028},[4666],{"type":65,"value":3917},{"type":52,"tag":1582,"props":4668,"children":4669},{"style":2057},[4670],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4672,"children":4673},{"style":2028},[4674],{"type":65,"value":4675},"\u003Cuuid1>",{"type":52,"tag":1582,"props":4677,"children":4678},{"style":2057},[4679],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4681,"children":4682},{"style":2028},[4683],{"type":65,"value":3935},{"type":52,"tag":1582,"props":4685,"children":4686},{"style":2057},[4687],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4689,"children":4690},{"style":2028},[4691],{"type":65,"value":4692},"Parent",{"type":52,"tag":1582,"props":4694,"children":4695},{"style":2057},[4696],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4698,"children":4699},{"style":2028},[4700],{"type":65,"value":4701}," --parentPermissionId",{"type":52,"tag":1582,"props":4703,"children":4704},{"style":2057},[4705],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4707,"children":4708},{"style":2028},[4709],{"type":65,"value":4710},"\u003Cparent-uuid>",{"type":52,"tag":1582,"props":4712,"children":4713},{"style":2057},[4714],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4716,"children":4717},{"style":2028},[4718],{"type":65,"value":4719}," --parentRelationshipName",{"type":52,"tag":1582,"props":4721,"children":4722},{"style":2057},[4723],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4725,"children":4726},{"style":2028},[4727],{"type":65,"value":4728},"\u003Crelationship_name>",{"type":52,"tag":1582,"props":4730,"children":4731},{"style":2057},[4732],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4734,"children":4735},{"style":3636},[4736],{"type":65,"value":3953},{"type":52,"tag":1582,"props":4738,"children":4739},{"style":2057},[4740],{"type":65,"value":3699},{"type":52,"tag":1582,"props":4742,"children":4743},{"style":3636},[4744],{"type":65,"value":3778},{"type":52,"tag":1582,"props":4746,"children":4747},{"style":2057},[4748],{"type":65,"value":3966},{"type":52,"tag":1582,"props":4750,"children":4751},{"style":2057},[4752],{"type":65,"value":3971},{"type":52,"tag":1582,"props":4754,"children":4755},{"style":3636},[4756],{"type":65,"value":3785},{"type":52,"tag":1582,"props":4758,"children":4759},{"style":2057},[4760],{"type":65,"value":3966},{"type":52,"tag":1582,"props":4762,"children":4763},{"style":2057},[4764],{"type":65,"value":3971},{"type":52,"tag":1582,"props":4766,"children":4767},{"style":3636},[4768],{"type":65,"value":3792},{"type":52,"tag":1582,"props":4770,"children":4771},{"style":2057},[4772],{"type":65,"value":3966},{"type":52,"tag":1582,"props":4774,"children":4775},{"style":2057},[4776],{"type":65,"value":3971},{"type":52,"tag":1582,"props":4778,"children":4779},{"style":3636},[4780],{"type":65,"value":4000},{"type":52,"tag":1582,"props":4782,"children":4783},{"style":2057},[4784],{"type":65,"value":3966},{"type":52,"tag":1582,"props":4786,"children":4787},{"style":2057},[4788],{"type":65,"value":3971},{"type":52,"tag":1582,"props":4790,"children":4791},{"style":3636},[4792],{"type":65,"value":3815},{"type":52,"tag":1582,"props":4794,"children":4795},{"style":2057},[4796],{"type":65,"value":3709},{"type":52,"tag":57,"props":4798,"children":4799},{},[4800,4802,4807,4809,4814,4816,4821],{"type":65,"value":4801},"Each invocation outputs ",{"type":52,"tag":70,"props":4803,"children":4805},{"className":4804},[],[4806],{"type":65,"value":3720},{"type":65,"value":4808},". Use the ",{"type":52,"tag":70,"props":4810,"children":4812},{"className":4811},[],[4813],{"type":65,"value":3728},{"type":65,"value":4815}," as ",{"type":52,"tag":70,"props":4817,"children":4819},{"className":4818},[],[4820],{"type":65,"value":3800},{"type":65,"value":4822}," for child permissions.",{"type":52,"tag":2794,"props":4824,"children":4826},{"id":4825},"_643-create-site-settings",[4827],{"type":65,"value":4828},"6.4.3 Create Site Settings",{"type":52,"tag":57,"props":4830,"children":4831},{},[4832],{"type":65,"value":4833},"For each site setting in the plan:",{"type":52,"tag":57,"props":4835,"children":4836},{},[4837],{"type":52,"tag":61,"props":4838,"children":4839},{},[4840],{"type":65,"value":4841},"Enabled setting (boolean):",{"type":52,"tag":518,"props":4843,"children":4845},{"className":2008,"code":4844,"language":2010,"meta":523,"style":523},"node \"${PLUGIN_ROOT}\u002Fscripts\u002Fcreate-site-setting.js\" --projectRoot \"\u003CPROJECT_ROOT>\" --name \"Webapi\u002F\u003Ctable>\u002Fenabled\" --value \"true\" --description \"Enable Web API access for \u003Ctable> table\" --type \"boolean\"\n",[4846],{"type":52,"tag":70,"props":4847,"children":4848},{"__ignoreMap":523},[4849],{"type":52,"tag":1582,"props":4850,"children":4851},{"class":2017,"line":2018},[4852,4856,4860,4864,4868,4873,4877,4881,4885,4889,4893,4897,4901,4905,4909,4914,4918,4923,4927,4932,4936,4941,4945,4950,4954,4959],{"type":52,"tag":1582,"props":4853,"children":4854},{"style":2022},[4855],{"type":65,"value":3628},{"type":52,"tag":1582,"props":4857,"children":4858},{"style":2057},[4859],{"type":65,"value":3633},{"type":52,"tag":1582,"props":4861,"children":4862},{"style":3636},[4863],{"type":65,"value":3639},{"type":52,"tag":1582,"props":4865,"children":4866},{"style":2057},[4867],{"type":65,"value":3644},{"type":52,"tag":1582,"props":4869,"children":4870},{"style":2028},[4871],{"type":65,"value":4872},"\u002Fscripts\u002Fcreate-site-setting.js",{"type":52,"tag":1582,"props":4874,"children":4875},{"style":2057},[4876],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4878,"children":4879},{"style":2028},[4880],{"type":65,"value":3658},{"type":52,"tag":1582,"props":4882,"children":4883},{"style":2057},[4884],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4886,"children":4887},{"style":2028},[4888],{"type":65,"value":3667},{"type":52,"tag":1582,"props":4890,"children":4891},{"style":2057},[4892],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4894,"children":4895},{"style":2028},[4896],{"type":65,"value":3676},{"type":52,"tag":1582,"props":4898,"children":4899},{"style":2057},[4900],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4902,"children":4903},{"style":2028},[4904],{"type":65,"value":2947},{"type":52,"tag":1582,"props":4906,"children":4907},{"style":2057},[4908],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4910,"children":4911},{"style":2028},[4912],{"type":65,"value":4913}," --value",{"type":52,"tag":1582,"props":4915,"children":4916},{"style":2057},[4917],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4919,"children":4920},{"style":2028},[4921],{"type":65,"value":4922},"true",{"type":52,"tag":1582,"props":4924,"children":4925},{"style":2057},[4926],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4928,"children":4929},{"style":2028},[4930],{"type":65,"value":4931}," --description",{"type":52,"tag":1582,"props":4933,"children":4934},{"style":2057},[4935],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4937,"children":4938},{"style":2028},[4939],{"type":65,"value":4940},"Enable Web API access for \u003Ctable> table",{"type":52,"tag":1582,"props":4942,"children":4943},{"style":2057},[4944],{"type":65,"value":1809},{"type":52,"tag":1582,"props":4946,"children":4947},{"style":2028},[4948],{"type":65,"value":4949}," --type",{"type":52,"tag":1582,"props":4951,"children":4952},{"style":2057},[4953],{"type":65,"value":2060},{"type":52,"tag":1582,"props":4955,"children":4956},{"style":2028},[4957],{"type":65,"value":4958},"boolean",{"type":52,"tag":1582,"props":4960,"children":4961},{"style":2057},[4962],{"type":65,"value":2070},{"type":52,"tag":57,"props":4964,"children":4965},{},[4966],{"type":52,"tag":61,"props":4967,"children":4968},{},[4969],{"type":65,"value":4970},"Fields setting (string — use the validated column names from the diagram):",{"type":52,"tag":518,"props":4972,"children":4974},{"className":2008,"code":4973,"language":2010,"meta":523,"style":523},"node \"${PLUGIN_ROOT}\u002Fscripts\u002Fcreate-site-setting.js\" --projectRoot \"\u003CPROJECT_ROOT>\" --name \"Webapi\u002F\u003Ctable>\u002Ffields\" --value \"\u003Ccomma-separated-validated-columns>\" --description \"Allowed fields for \u003Ctable> Web API access\"\n",[4975],{"type":52,"tag":70,"props":4976,"children":4977},{"__ignoreMap":523},[4978],{"type":52,"tag":1582,"props":4979,"children":4980},{"class":2017,"line":2018},[4981,4985,4989,4993,4997,5001,5005,5009,5013,5017,5021,5025,5029,5033,5037,5041,5045,5050,5054,5058,5062,5067],{"type":52,"tag":1582,"props":4982,"children":4983},{"style":2022},[4984],{"type":65,"value":3628},{"type":52,"tag":1582,"props":4986,"children":4987},{"style":2057},[4988],{"type":65,"value":3633},{"type":52,"tag":1582,"props":4990,"children":4991},{"style":3636},[4992],{"type":65,"value":3639},{"type":52,"tag":1582,"props":4994,"children":4995},{"style":2057},[4996],{"type":65,"value":3644},{"type":52,"tag":1582,"props":4998,"children":4999},{"style":2028},[5000],{"type":65,"value":4872},{"type":52,"tag":1582,"props":5002,"children":5003},{"style":2057},[5004],{"type":65,"value":1809},{"type":52,"tag":1582,"props":5006,"children":5007},{"style":2028},[5008],{"type":65,"value":3658},{"type":52,"tag":1582,"props":5010,"children":5011},{"style":2057},[5012],{"type":65,"value":2060},{"type":52,"tag":1582,"props":5014,"children":5015},{"style":2028},[5016],{"type":65,"value":3667},{"type":52,"tag":1582,"props":5018,"children":5019},{"style":2057},[5020],{"type":65,"value":1809},{"type":52,"tag":1582,"props":5022,"children":5023},{"style":2028},[5024],{"type":65,"value":3676},{"type":52,"tag":1582,"props":5026,"children":5027},{"style":2057},[5028],{"type":65,"value":2060},{"type":52,"tag":1582,"props":5030,"children":5031},{"style":2028},[5032],{"type":65,"value":848},{"type":52,"tag":1582,"props":5034,"children":5035},{"style":2057},[5036],{"type":65,"value":1809},{"type":52,"tag":1582,"props":5038,"children":5039},{"style":2028},[5040],{"type":65,"value":4913},{"type":52,"tag":1582,"props":5042,"children":5043},{"style":2057},[5044],{"type":65,"value":2060},{"type":52,"tag":1582,"props":5046,"children":5047},{"style":2028},[5048],{"type":65,"value":5049},"\u003Ccomma-separated-validated-columns>",{"type":52,"tag":1582,"props":5051,"children":5052},{"style":2057},[5053],{"type":65,"value":1809},{"type":52,"tag":1582,"props":5055,"children":5056},{"style":2028},[5057],{"type":65,"value":4931},{"type":52,"tag":1582,"props":5059,"children":5060},{"style":2057},[5061],{"type":65,"value":2060},{"type":52,"tag":1582,"props":5063,"children":5064},{"style":2028},[5065],{"type":65,"value":5066},"Allowed fields for \u003Ctable> Web API access",{"type":52,"tag":1582,"props":5068,"children":5069},{"style":2057},[5070],{"type":65,"value":2070},{"type":52,"tag":57,"props":5072,"children":5073},{},[5074],{"type":52,"tag":61,"props":5075,"children":5076},{},[5077],{"type":65,"value":5078},"Inner error setting (boolean, optional for debugging):",{"type":52,"tag":518,"props":5080,"children":5082},{"className":2008,"code":5081,"language":2010,"meta":523,"style":523},"node \"${PLUGIN_ROOT}\u002Fscripts\u002Fcreate-site-setting.js\" --projectRoot \"\u003CPROJECT_ROOT>\" --name \"Webapi\u002Ferror\u002Finnererror\" --value \"true\" --description \"Enable detailed error messages for debugging\" --type \"boolean\"\n",[5083],{"type":52,"tag":70,"props":5084,"children":5085},{"__ignoreMap":523},[5086],{"type":52,"tag":1582,"props":5087,"children":5088},{"class":2017,"line":2018},[5089,5093,5097,5101,5105,5109,5113,5117,5121,5125,5129,5133,5137,5142,5146,5150,5154,5158,5162,5166,5170,5175,5179,5183,5187,5191],{"type":52,"tag":1582,"props":5090,"children":5091},{"style":2022},[5092],{"type":65,"value":3628},{"type":52,"tag":1582,"props":5094,"children":5095},{"style":2057},[5096],{"type":65,"value":3633},{"type":52,"tag":1582,"props":5098,"children":5099},{"style":3636},[5100],{"type":65,"value":3639},{"type":52,"tag":1582,"props":5102,"children":5103},{"style":2057},[5104],{"type":65,"value":3644},{"type":52,"tag":1582,"props":5106,"children":5107},{"style":2028},[5108],{"type":65,"value":4872},{"type":52,"tag":1582,"props":5110,"children":5111},{"style":2057},[5112],{"type":65,"value":1809},{"type":52,"tag":1582,"props":5114,"children":5115},{"style":2028},[5116],{"type":65,"value":3658},{"type":52,"tag":1582,"props":5118,"children":5119},{"style":2057},[5120],{"type":65,"value":2060},{"type":52,"tag":1582,"props":5122,"children":5123},{"style":2028},[5124],{"type":65,"value":3667},{"type":52,"tag":1582,"props":5126,"children":5127},{"style":2057},[5128],{"type":65,"value":1809},{"type":52,"tag":1582,"props":5130,"children":5131},{"style":2028},[5132],{"type":65,"value":3676},{"type":52,"tag":1582,"props":5134,"children":5135},{"style":2057},[5136],{"type":65,"value":2060},{"type":52,"tag":1582,"props":5138,"children":5139},{"style":2028},[5140],{"type":65,"value":5141},"Webapi\u002Ferror\u002Finnererror",{"type":52,"tag":1582,"props":5143,"children":5144},{"style":2057},[5145],{"type":65,"value":1809},{"type":52,"tag":1582,"props":5147,"children":5148},{"style":2028},[5149],{"type":65,"value":4913},{"type":52,"tag":1582,"props":5151,"children":5152},{"style":2057},[5153],{"type":65,"value":2060},{"type":52,"tag":1582,"props":5155,"children":5156},{"style":2028},[5157],{"type":65,"value":4922},{"type":52,"tag":1582,"props":5159,"children":5160},{"style":2057},[5161],{"type":65,"value":1809},{"type":52,"tag":1582,"props":5163,"children":5164},{"style":2028},[5165],{"type":65,"value":4931},{"type":52,"tag":1582,"props":5167,"children":5168},{"style":2057},[5169],{"type":65,"value":2060},{"type":52,"tag":1582,"props":5171,"children":5172},{"style":2028},[5173],{"type":65,"value":5174},"Enable detailed error messages for debugging",{"type":52,"tag":1582,"props":5176,"children":5177},{"style":2057},[5178],{"type":65,"value":1809},{"type":52,"tag":1582,"props":5180,"children":5181},{"style":2028},[5182],{"type":65,"value":4949},{"type":52,"tag":1582,"props":5184,"children":5185},{"style":2057},[5186],{"type":65,"value":2060},{"type":52,"tag":1582,"props":5188,"children":5189},{"style":2028},[5190],{"type":65,"value":4958},{"type":52,"tag":1582,"props":5192,"children":5193},{"style":2057},[5194],{"type":65,"value":2070},{"type":52,"tag":57,"props":5196,"children":5197},{},[5198,5203,5204,5210],{"type":52,"tag":61,"props":5199,"children":5200},{},[5201],{"type":65,"value":5202},"Important",{"type":65,"value":129},{"type":52,"tag":70,"props":5205,"children":5207},{"className":5206},[],[5208],{"type":65,"value":5209},"--value",{"type":65,"value":5211}," for fields settings MUST use exact Dataverse LogicalNames (case-sensitive, all lowercase) for normal CRUD\u002Fread scenarios. Using incorrect casing causes 403 Forbidden errors.",{"type":52,"tag":57,"props":5213,"children":5214},{},[5215,5220,5222,5227,5228,5234,5236,5241,5243,5248],{"type":52,"tag":61,"props":5216,"children":5217},{},[5218],{"type":65,"value":5219},"Aggregate exception",{"type":65,"value":5221},": If the site uses aggregate OData queries (",{"type":52,"tag":70,"props":5223,"children":5225},{"className":5224},[],[5226],{"type":65,"value":2974},{"type":65,"value":1344},{"type":52,"tag":70,"props":5229,"children":5231},{"className":5230},[],[5232],{"type":65,"value":5233},"aggregate",{"type":65,"value":5235},", grouped totals, etc.), set ",{"type":52,"tag":70,"props":5237,"children":5239},{"className":5238},[],[5240],{"type":65,"value":848},{"type":65,"value":5242}," to ",{"type":52,"tag":70,"props":5244,"children":5246},{"className":5245},[],[5247],{"type":65,"value":2966},{"type":65,"value":5249},". Power Pages rejects some aggregate queries with 403 unless wildcard field access is enabled.",{"type":52,"tag":57,"props":5251,"children":5252},{},[5253,5258,5260,5264,5266,5272,5274,5280,5282,5288,5290,5295,5296,5302],{"type":52,"tag":61,"props":5254,"children":5255},{},[5256],{"type":65,"value":5257},"Lookup columns",{"type":65,"value":5259},": For every lookup column, include ",{"type":52,"tag":61,"props":5261,"children":5262},{},[5263],{"type":65,"value":3572},{"type":65,"value":5265}," the LogicalName (",{"type":52,"tag":70,"props":5267,"children":5269},{"className":5268},[],[5270],{"type":65,"value":5271},"cr87b_categoryid",{"type":65,"value":5273},") AND the OData computed attribute (",{"type":52,"tag":70,"props":5275,"children":5277},{"className":5276},[],[5278],{"type":65,"value":5279},"_cr87b_categoryid_value",{"type":65,"value":5281},") in the fields value. The Power Pages Web API does a literal match — the LogicalName is needed for write operations, the ",{"type":52,"tag":70,"props":5283,"children":5285},{"className":5284},[],[5286],{"type":65,"value":5287},"_..._value",{"type":65,"value":5289}," form is needed for read operations (",{"type":52,"tag":70,"props":5291,"children":5293},{"className":5292},[],[5294],{"type":65,"value":1183},{"type":65,"value":1344},{"type":52,"tag":70,"props":5297,"children":5299},{"className":5298},[],[5300],{"type":65,"value":5301},"$filter",{"type":65,"value":5303},"). Missing either form causes 403 errors.",{"type":52,"tag":57,"props":5305,"children":5306},{},[5307,5312],{"type":52,"tag":61,"props":5308,"children":5309},{},[5310],{"type":65,"value":5311},"AI-only read mode (Phase 1.6 flag set)",{"type":65,"value":5313},": the fields-value rules tighten:",{"type":52,"tag":98,"props":5315,"children":5316},{},[5317,5335,5352,5364],{"type":52,"tag":102,"props":5318,"children":5319},{},[5320,5322,5327,5328,5333],{"type":65,"value":5321},"Include only the columns named in the primary's ",{"type":52,"tag":70,"props":5323,"children":5325},{"className":5324},[],[5326],{"type":65,"value":1183},{"type":65,"value":3460},{"type":52,"tag":70,"props":5329,"children":5331},{"className":5330},[],[5332],{"type":65,"value":710},{"type":65,"value":5334},". Extra columns expand the allowlist without any caller reading them.",{"type":52,"tag":102,"props":5336,"children":5337},{},[5338,5340,5345,5346,5351],{"type":65,"value":5339},"Do NOT include the primary key. The summarization endpoint carries the record id in the URL path; Microsoft's shipped case preset ships ",{"type":52,"tag":70,"props":5341,"children":5343},{"className":5342},[],[5344],{"type":65,"value":3485},{"type":65,"value":3487},{"type":52,"tag":70,"props":5347,"children":5349},{"className":5348},[],[5350],{"type":65,"value":3493},{"type":65,"value":454},{"type":52,"tag":102,"props":5353,"children":5354},{},[5355,5357,5362],{"type":65,"value":5356},"For lookup columns, include only the ",{"type":52,"tag":70,"props":5358,"children":5360},{"className":5359},[],[5361],{"type":65,"value":3511},{"type":65,"value":5363}," read form. Omit the LogicalName write form — no write operations run against these tables in AI mode.",{"type":52,"tag":102,"props":5365,"children":5366},{},[5367,5369,5374],{"type":65,"value":5368},"The aggregate ",{"type":52,"tag":70,"props":5370,"children":5372},{"className":5371},[],[5373],{"type":65,"value":2966},{"type":65,"value":5375}," exception still applies if the summarised table also has aggregate OData code elsewhere in the site.",{"type":52,"tag":397,"props":5377,"children":5379},{"id":5378},"_65-git-commit",[5380],{"type":65,"value":5381},"6.5 Git Commit",{"type":52,"tag":57,"props":5383,"children":5384},{},[5385,5389],{"type":52,"tag":61,"props":5386,"children":5387},{},[5388],{"type":65,"value":1998},{"type":65,"value":2000},{"type":52,"tag":57,"props":5391,"children":5392},{},[5393],{"type":65,"value":5394},"Otherwise, stage and commit the permission and settings files:",{"type":52,"tag":518,"props":5396,"children":5398},{"className":2008,"code":5397,"language":2010,"meta":523,"style":523},"git add -A\ngit commit -m \"Add table permissions and Web API site settings for [table names]\"\n",[5399],{"type":52,"tag":70,"props":5400,"children":5401},{"__ignoreMap":523},[5402,5417],{"type":52,"tag":1582,"props":5403,"children":5404},{"class":2017,"line":2018},[5405,5409,5413],{"type":52,"tag":1582,"props":5406,"children":5407},{"style":2022},[5408],{"type":65,"value":2025},{"type":52,"tag":1582,"props":5410,"children":5411},{"style":2028},[5412],{"type":65,"value":2031},{"type":52,"tag":1582,"props":5414,"children":5415},{"style":2028},[5416],{"type":65,"value":2036},{"type":52,"tag":1582,"props":5418,"children":5419},{"class":2017,"line":2039},[5420,5424,5428,5432,5436,5441],{"type":52,"tag":1582,"props":5421,"children":5422},{"style":2022},[5423],{"type":65,"value":2025},{"type":52,"tag":1582,"props":5425,"children":5426},{"style":2028},[5427],{"type":65,"value":2049},{"type":52,"tag":1582,"props":5429,"children":5430},{"style":2028},[5431],{"type":65,"value":2054},{"type":52,"tag":1582,"props":5433,"children":5434},{"style":2057},[5435],{"type":65,"value":2060},{"type":52,"tag":1582,"props":5437,"children":5438},{"style":2028},[5439],{"type":65,"value":5440},"Add table permissions and Web API site settings for [table names]",{"type":52,"tag":1582,"props":5442,"children":5443},{"style":2057},[5444],{"type":65,"value":2070},{"type":52,"tag":57,"props":5446,"children":5447},{},[5448,5452],{"type":52,"tag":61,"props":5449,"children":5450},{},[5451],{"type":65,"value":915},{"type":65,"value":5453},": Table permissions and site settings created, verified, and (in normal mode) committed",{"type":52,"tag":268,"props":5455,"children":5456},{},[],{"type":52,"tag":91,"props":5458,"children":5460},{"id":5459},"phase-7-review-deploy",[5461],{"type":65,"value":5462},"Phase 7: Review & Deploy",{"type":52,"tag":57,"props":5464,"children":5465},{},[5466,5470],{"type":52,"tag":61,"props":5467,"children":5468},{},[5469],{"type":65,"value":383},{"type":65,"value":5471},": Present a summary of all work performed and offer deployment",{"type":52,"tag":57,"props":5473,"children":5474},{},[5475,5479],{"type":52,"tag":61,"props":5476,"children":5477},{},[5478],{"type":65,"value":393},{"type":65,"value":395},{"type":52,"tag":397,"props":5481,"children":5483},{"id":5482},"_71-record-skill-usage",[5484],{"type":65,"value":5485},"7.1 Record Skill Usage",{"type":52,"tag":53,"props":5487,"children":5488},{},[5489],{"type":52,"tag":57,"props":5490,"children":5491},{},[5492,5494],{"type":65,"value":5493},"Reference: ",{"type":52,"tag":70,"props":5495,"children":5497},{"className":5496},[],[5498],{"type":65,"value":5499},"${PLUGIN_ROOT}\u002Freferences\u002Fskill-tracking-reference.md",{"type":52,"tag":57,"props":5501,"children":5502},{},[5503,5505,5511],{"type":65,"value":5504},"Follow the skill tracking instructions in the reference to record this skill's usage. Use ",{"type":52,"tag":70,"props":5506,"children":5508},{"className":5507},[],[5509],{"type":65,"value":5510},"--skillName \"IntegrateWebApi\"",{"type":65,"value":454},{"type":52,"tag":397,"props":5513,"children":5515},{"id":5514},"_72-present-summary",[5516],{"type":65,"value":5517},"7.2 Present Summary",{"type":52,"tag":57,"props":5519,"children":5520},{},[5521],{"type":65,"value":5522},"Present a summary of everything that was done:",{"type":52,"tag":609,"props":5524,"children":5525},{},[5526,5547],{"type":52,"tag":613,"props":5527,"children":5528},{},[5529],{"type":52,"tag":617,"props":5530,"children":5531},{},[5532,5537,5542],{"type":52,"tag":621,"props":5533,"children":5534},{},[5535],{"type":65,"value":5536},"Step",{"type":52,"tag":621,"props":5538,"children":5539},{},[5540],{"type":65,"value":5541},"Status",{"type":52,"tag":621,"props":5543,"children":5544},{},[5545],{"type":65,"value":5546},"Details",{"type":52,"tag":637,"props":5548,"children":5549},{},[5550,5571,5598,5620,5641,5659,5676],{"type":52,"tag":617,"props":5551,"children":5552},{},[5553,5558,5563],{"type":52,"tag":644,"props":5554,"children":5555},{},[5556],{"type":65,"value":5557},"API Client",{"type":52,"tag":644,"props":5559,"children":5560},{},[5561],{"type":65,"value":5562},"Created\u002FExisted",{"type":52,"tag":644,"props":5564,"children":5565},{},[5566],{"type":52,"tag":70,"props":5567,"children":5569},{"className":5568},[],[5570],{"type":65,"value":1112},{"type":52,"tag":617,"props":5572,"children":5573},{},[5574,5578,5583],{"type":52,"tag":644,"props":5575,"children":5576},{},[5577],{"type":65,"value":2327},{"type":52,"tag":644,"props":5579,"children":5580},{},[5581],{"type":65,"value":5582},"Created",{"type":52,"tag":644,"props":5584,"children":5585},{},[5586,5591,5592],{"type":52,"tag":70,"props":5587,"children":5589},{"className":5588},[],[5590],{"type":65,"value":2142},{"type":65,"value":1344},{"type":52,"tag":70,"props":5593,"children":5595},{"className":5594},[],[5596],{"type":65,"value":5597},"src\u002Ftypes\u002Fcategory.ts",{"type":52,"tag":617,"props":5599,"children":5600},{},[5601,5606,5610],{"type":52,"tag":644,"props":5602,"children":5603},{},[5604],{"type":65,"value":5605},"Services",{"type":52,"tag":644,"props":5607,"children":5608},{},[5609],{"type":65,"value":5582},{"type":52,"tag":644,"props":5611,"children":5612},{},[5613,5618],{"type":52,"tag":70,"props":5614,"children":5616},{"className":5615},[],[5617],{"type":65,"value":2369},{"type":65,"value":5619},", etc.",{"type":52,"tag":617,"props":5621,"children":5622},{},[5623,5628,5632],{"type":52,"tag":644,"props":5624,"children":5625},{},[5626],{"type":65,"value":5627},"Hooks",{"type":52,"tag":644,"props":5629,"children":5630},{},[5631],{"type":65,"value":5582},{"type":52,"tag":644,"props":5633,"children":5634},{},[5635,5640],{"type":52,"tag":70,"props":5636,"children":5638},{"className":5637},[],[5639],{"type":65,"value":2187},{"type":65,"value":5619},{"type":52,"tag":617,"props":5642,"children":5643},{},[5644,5649,5654],{"type":52,"tag":644,"props":5645,"children":5646},{},[5647],{"type":65,"value":5648},"Components Updated",{"type":52,"tag":644,"props":5650,"children":5651},{},[5652],{"type":65,"value":5653},"X files",{"type":52,"tag":644,"props":5655,"children":5656},{},[5657],{"type":65,"value":5658},"Mock data replaced with API calls",{"type":52,"tag":617,"props":5660,"children":5661},{},[5662,5667,5671],{"type":52,"tag":644,"props":5663,"children":5664},{},[5665],{"type":65,"value":5666},"Table Permissions",{"type":52,"tag":644,"props":5668,"children":5669},{},[5670],{"type":65,"value":5582},{"type":52,"tag":644,"props":5672,"children":5673},{},[5674],{"type":65,"value":5675},"X permission files",{"type":52,"tag":617,"props":5677,"children":5678},{},[5679,5684,5688],{"type":52,"tag":644,"props":5680,"children":5681},{},[5682],{"type":65,"value":5683},"Site Settings",{"type":52,"tag":644,"props":5685,"children":5686},{},[5687],{"type":65,"value":5582},{"type":52,"tag":644,"props":5689,"children":5690},{},[5691],{"type":65,"value":5692},"X setting files",{"type":52,"tag":397,"props":5694,"children":5696},{"id":5695},"_73-ask-to-deploy",[5697],{"type":65,"value":5698},"7.3 Ask to Deploy",{"type":52,"tag":53,"props":5700,"children":5701},{},[5702,5713],{"type":52,"tag":57,"props":5703,"children":5704},{},[5705,5706,5711],{"type":65,"value":1482},{"type":52,"tag":61,"props":5707,"children":5708},{},[5709],{"type":65,"value":5710},"Gate (plan · integrate-webapi:7.3.deploy):",{"type":65,"value":5712}," Post-integration deploy prompt — Web API calls won't work until permissions and site settings are deployed.",{"type":52,"tag":57,"props":5714,"children":5715},{},[5716,5720,5722,5726,5728,5732],{"type":52,"tag":61,"props":5717,"children":5718},{},[5719],{"type":65,"value":1497},{"type":65,"value":5721}," All integration code + permissions YAML committed.\n",{"type":52,"tag":61,"props":5723,"children":5724},{},[5725],{"type":65,"value":1504},{"type":65,"value":5727}," Auto-deploy picks whatever env PAC CLI happens to point at.\n",{"type":52,"tag":61,"props":5729,"children":5730},{},[5731],{"type":65,"value":1511},{"type":65,"value":5733}," Nothing — integration artifacts stay on disk; no deploy fired.",{"type":52,"tag":57,"props":5735,"children":5736},{},[5737,5741],{"type":52,"tag":61,"props":5738,"children":5739},{},[5740],{"type":65,"value":1998},{"type":65,"value":5742}," (Phase 1.6 flag set) — the caller owns the single\nend-of-orchestration deploy decision. Return the Phase 7.2 summary and stop.",{"type":52,"tag":57,"props":5744,"children":5745},{},[5746,5747,5752],{"type":65,"value":1540},{"type":52,"tag":70,"props":5748,"children":5750},{"className":5749},[],[5751],{"type":65,"value":860},{"type":65,"value":395},{"type":52,"tag":609,"props":5754,"children":5755},{},[5756,5770],{"type":52,"tag":613,"props":5757,"children":5758},{},[5759],{"type":52,"tag":617,"props":5760,"children":5761},{},[5762,5766],{"type":52,"tag":621,"props":5763,"children":5764},{},[5765],{"type":65,"value":1561},{"type":52,"tag":621,"props":5767,"children":5768},{},[5769],{"type":65,"value":1566},{"type":52,"tag":637,"props":5771,"children":5772},{},[5773],{"type":52,"tag":617,"props":5774,"children":5775},{},[5776,5781],{"type":52,"tag":644,"props":5777,"children":5778},{},[5779],{"type":65,"value":5780},"The Web API integration and permissions are ready. To make everything live, the site needs to be deployed. Would you like to deploy now?",{"type":52,"tag":644,"props":5782,"children":5783},{},[5784],{"type":65,"value":5785},"Yes, deploy now (Recommended), No, I'll deploy later",{"type":52,"tag":57,"props":5787,"children":5788},{},[5789,5793,5795,5800],{"type":52,"tag":61,"props":5790,"children":5791},{},[5792],{"type":65,"value":2622},{"type":65,"value":5794},": Invoke the ",{"type":52,"tag":70,"props":5796,"children":5798},{"className":5797},[],[5799],{"type":65,"value":364},{"type":65,"value":5801}," skill to deploy the site.",{"type":52,"tag":57,"props":5803,"children":5804},{},[5805,5810],{"type":52,"tag":61,"props":5806,"children":5807},{},[5808],{"type":65,"value":5809},"If \"No, I'll deploy later\"",{"type":65,"value":5811},": Acknowledge and remind:",{"type":52,"tag":53,"props":5813,"children":5814},{},[5815],{"type":52,"tag":57,"props":5816,"children":5817},{},[5818,5820,5825],{"type":65,"value":5819},"\"No problem! Remember to deploy your site using ",{"type":52,"tag":70,"props":5821,"children":5823},{"className":5822},[],[5824],{"type":65,"value":364},{"type":65,"value":5826}," when you're ready. The Web API calls will not work until the site is deployed with the new permissions.\"",{"type":52,"tag":397,"props":5828,"children":5830},{"id":5829},"_74-post-deploy-notes",[5831],{"type":65,"value":5832},"7.4 Post-Deploy Notes",{"type":52,"tag":57,"props":5834,"children":5835},{},[5836,5840],{"type":52,"tag":61,"props":5837,"children":5838},{},[5839],{"type":65,"value":1998},{"type":65,"value":5841}," — the caller emits its own post-deploy guidance\nthat covers AI-specific concerns (governance hierarchy, runtime version, Bing dependency).",{"type":52,"tag":57,"props":5843,"children":5844},{},[5845],{"type":65,"value":5846},"Otherwise, after deployment (or if skipped), remind the user:",{"type":52,"tag":98,"props":5848,"children":5849},{},[5850,5860,5903,5920],{"type":52,"tag":102,"props":5851,"children":5852},{},[5853,5858],{"type":52,"tag":61,"props":5854,"children":5855},{},[5856],{"type":65,"value":5857},"Test the API",{"type":65,"value":5859},": Open the deployed site and verify Web API calls work in the browser's Network tab",{"type":52,"tag":102,"props":5861,"children":5862},{},[5863,5868,5870,5875,5877,5882,5883,5888,5890,5895,5897,5902],{"type":52,"tag":61,"props":5864,"children":5865},{},[5866],{"type":65,"value":5867},"Check permissions",{"type":65,"value":5869},": If any API call returns 403, verify table permissions and site settings are correct. The most common cause of 403 errors is column names in ",{"type":52,"tag":70,"props":5871,"children":5873},{"className":5872},[],[5874],{"type":65,"value":848},{"type":65,"value":5876}," not matching the exact Dataverse LogicalName (case-sensitive — must be all lowercase). If the failing request uses aggregate OData (",{"type":52,"tag":70,"props":5878,"children":5880},{"className":5879},[],[5881],{"type":65,"value":2974},{"type":65,"value":1344},{"type":52,"tag":70,"props":5884,"children":5886},{"className":5885},[],[5887],{"type":65,"value":5233},{"type":65,"value":5889},", grouped totals), also verify ",{"type":52,"tag":70,"props":5891,"children":5893},{"className":5892},[],[5894],{"type":65,"value":848},{"type":65,"value":5896}," is set to ",{"type":52,"tag":70,"props":5898,"children":5900},{"className":5899},[],[5901],{"type":65,"value":2966},{"type":65,"value":454},{"type":52,"tag":102,"props":5904,"children":5905},{},[5906,5911,5913,5918],{"type":52,"tag":61,"props":5907,"children":5908},{},[5909],{"type":65,"value":5910},"Disable innererror in production",{"type":65,"value":5912},": If ",{"type":52,"tag":70,"props":5914,"children":5916},{"className":5915},[],[5917],{"type":65,"value":5141},{"type":65,"value":5919}," was enabled for debugging, disable it before going live",{"type":52,"tag":102,"props":5921,"children":5922},{},[5923,5927],{"type":52,"tag":61,"props":5924,"children":5925},{},[5926],{"type":65,"value":2911},{"type":65,"value":5928},": Users must be assigned the appropriate web roles to access protected APIs",{"type":52,"tag":57,"props":5930,"children":5931},{},[5932,5936],{"type":52,"tag":61,"props":5933,"children":5934},{},[5935],{"type":65,"value":915},{"type":65,"value":5937},": Summary presented; deployment completed or deferred (normal mode), or returned to caller (AI-only read mode).",{"type":52,"tag":268,"props":5939,"children":5940},{},[],{"type":52,"tag":91,"props":5942,"children":5944},{"id":5943},"important-notes",[5945],{"type":65,"value":5946},"Important Notes",{"type":52,"tag":397,"props":5948,"children":5950},{"id":5949},"throughout-all-phases",[5951],{"type":65,"value":5952},"Throughout All Phases",{"type":52,"tag":98,"props":5954,"children":5955},{},[5956,5965,5975,5984,5994],{"type":52,"tag":102,"props":5957,"children":5958},{},[5959,5963],{"type":52,"tag":61,"props":5960,"children":5961},{},[5962],{"type":65,"value":204},{"type":65,"value":5964}," to track progress at every phase",{"type":52,"tag":102,"props":5966,"children":5967},{},[5968,5973],{"type":52,"tag":61,"props":5969,"children":5970},{},[5971],{"type":65,"value":5972},"Ask for user confirmation",{"type":65,"value":5974}," at key decision points (see list below)",{"type":52,"tag":102,"props":5976,"children":5977},{},[5978,5982],{"type":52,"tag":61,"props":5979,"children":5980},{},[5981],{"type":65,"value":109},{"type":65,"value":5983}," — the first table creates the shared API client; after that, remaining tables can be processed in parallel since each creates independent files",{"type":52,"tag":102,"props":5985,"children":5986},{},[5987,5992],{"type":52,"tag":61,"props":5988,"children":5989},{},[5990],{"type":65,"value":5991},"Commit at milestones",{"type":65,"value":5993}," — after integration code and after permission files",{"type":52,"tag":102,"props":5995,"children":5996},{},[5997,6002],{"type":52,"tag":61,"props":5998,"children":5999},{},[6000],{"type":65,"value":6001},"Verify each integration",{"type":65,"value":6003}," — confirm expected files exist after each agent invocation",{"type":52,"tag":397,"props":6005,"children":6007},{"id":6006},"key-decision-points-wait-for-user",[6008],{"type":65,"value":6009},"Key Decision Points (Wait for User)",{"type":52,"tag":278,"props":6011,"children":6012},{},[6013,6018,6023,6035,6040,6045],{"type":52,"tag":102,"props":6014,"children":6015},{},[6016],{"type":65,"value":6017},"After Phase 2: Confirm which tables to integrate",{"type":52,"tag":102,"props":6019,"children":6020},{},[6021],{"type":65,"value":6022},"After Phase 3: Approve integration plan",{"type":52,"tag":102,"props":6024,"children":6025},{},[6026,6028,6033],{"type":65,"value":6027},"At Phase 6.1: Deploy now or skip permissions (if ",{"type":52,"tag":70,"props":6029,"children":6031},{"className":6030},[],[6032],{"type":65,"value":160},{"type":65,"value":6034}," missing)",{"type":52,"tag":102,"props":6036,"children":6037},{},[6038],{"type":65,"value":6039},"At Phase 6.2: Choose permissions source (upload diagram or let the architects analyze)",{"type":52,"tag":102,"props":6041,"children":6042},{},[6043],{"type":65,"value":6044},"At Phase 6.3: Approve table permissions plan and Web API site settings plan (both agents run in parallel for Path B, each presents its own plan for approval)",{"type":52,"tag":102,"props":6046,"children":6047},{},[6048],{"type":65,"value":6049},"At Phase 7.2: Deploy now or deploy later",{"type":52,"tag":397,"props":6051,"children":6053},{"id":6052},"progress-tracking",[6054],{"type":65,"value":6055},"Progress Tracking",{"type":52,"tag":57,"props":6057,"children":6058},{},[6059,6061,6067],{"type":65,"value":6060},"Before starting Phase 1, create a task list with all phases using ",{"type":52,"tag":70,"props":6062,"children":6064},{"className":6063},[],[6065],{"type":65,"value":6066},"TaskCreate",{"type":65,"value":395},{"type":52,"tag":609,"props":6069,"children":6070},{},[6071,6091],{"type":52,"tag":613,"props":6072,"children":6073},{},[6074],{"type":52,"tag":617,"props":6075,"children":6076},{},[6077,6082,6087],{"type":52,"tag":621,"props":6078,"children":6079},{},[6080],{"type":65,"value":6081},"Task subject",{"type":52,"tag":621,"props":6083,"children":6084},{},[6085],{"type":65,"value":6086},"activeForm",{"type":52,"tag":621,"props":6088,"children":6089},{},[6090],{"type":65,"value":2752},{"type":52,"tag":637,"props":6092,"children":6093},{},[6094,6112,6130,6148,6166,6184,6202],{"type":52,"tag":617,"props":6095,"children":6096},{},[6097,6102,6107],{"type":52,"tag":644,"props":6098,"children":6099},{},[6100],{"type":65,"value":6101},"Verify site exists",{"type":52,"tag":644,"props":6103,"children":6104},{},[6105],{"type":65,"value":6106},"Verifying site prerequisites",{"type":52,"tag":644,"props":6108,"children":6109},{},[6110],{"type":65,"value":6111},"Locate project root, detect framework, check data model and deployment status",{"type":52,"tag":617,"props":6113,"children":6114},{},[6115,6120,6125],{"type":52,"tag":644,"props":6116,"children":6117},{},[6118],{"type":65,"value":6119},"Explore integration points",{"type":52,"tag":644,"props":6121,"children":6122},{},[6123],{"type":65,"value":6124},"Analyzing code for integration points",{"type":52,"tag":644,"props":6126,"children":6127},{},[6128],{"type":65,"value":6129},"Use Explore agent to discover tables, existing services, and compile integration manifest",{"type":52,"tag":617,"props":6131,"children":6132},{},[6133,6138,6143],{"type":52,"tag":644,"props":6134,"children":6135},{},[6136],{"type":65,"value":6137},"Review integration plan",{"type":52,"tag":644,"props":6139,"children":6140},{},[6141],{"type":65,"value":6142},"Reviewing integration plan with user",{"type":52,"tag":644,"props":6144,"children":6145},{},[6146],{"type":65,"value":6147},"Present findings and confirm which tables to integrate",{"type":52,"tag":617,"props":6149,"children":6150},{},[6151,6156,6161],{"type":52,"tag":644,"props":6152,"children":6153},{},[6154],{"type":65,"value":6155},"Implement integrations",{"type":52,"tag":644,"props":6157,"children":6158},{},[6159],{"type":65,"value":6160},"Implementing Web API integrations",{"type":52,"tag":644,"props":6162,"children":6163},{},[6164],{"type":65,"value":6165},"Invoke webapi-integration agent for first table (creates shared client), then remaining tables in parallel, verify output, git commit",{"type":52,"tag":617,"props":6167,"children":6168},{},[6169,6174,6179],{"type":52,"tag":644,"props":6170,"children":6171},{},[6172],{"type":65,"value":6173},"Verify integrations",{"type":52,"tag":644,"props":6175,"children":6176},{},[6177],{"type":65,"value":6178},"Verifying integrations",{"type":52,"tag":644,"props":6180,"children":6181},{},[6182],{"type":65,"value":6183},"Validate all expected files exist, check imports and API references, run project build",{"type":52,"tag":617,"props":6185,"children":6186},{},[6187,6192,6197],{"type":52,"tag":644,"props":6188,"children":6189},{},[6190],{"type":65,"value":6191},"Setup permissions and settings",{"type":52,"tag":644,"props":6193,"children":6194},{},[6195],{"type":65,"value":6196},"Configuring permissions and site settings",{"type":52,"tag":644,"props":6198,"children":6199},{},[6200],{"type":65,"value":6201},"Choose permissions source (upload diagram or architects), invoke table-permissions-architect and webapi-settings-architect agents in parallel, create YAML files with case-sensitive validated column names, git commit",{"type":52,"tag":617,"props":6203,"children":6204},{},[6205,6210,6215],{"type":52,"tag":644,"props":6206,"children":6207},{},[6208],{"type":65,"value":6209},"Review and deploy",{"type":52,"tag":644,"props":6211,"children":6212},{},[6213],{"type":65,"value":6214},"Reviewing summary and deploying",{"type":52,"tag":644,"props":6216,"children":6217},{},[6218],{"type":65,"value":6219},"Present summary, ask about deployment, provide post-deploy guidance",{"type":52,"tag":57,"props":6221,"children":6222},{},[6223,6225,6231,6233,6239,6241,6247],{"type":65,"value":6224},"Mark each task ",{"type":52,"tag":70,"props":6226,"children":6228},{"className":6227},[],[6229],{"type":65,"value":6230},"in_progress",{"type":65,"value":6232}," when starting it and ",{"type":52,"tag":70,"props":6234,"children":6236},{"className":6235},[],[6237],{"type":65,"value":6238},"completed",{"type":65,"value":6240}," when done via ",{"type":52,"tag":70,"props":6242,"children":6244},{"className":6243},[],[6245],{"type":65,"value":6246},"TaskUpdate",{"type":65,"value":6248},". This gives the user visibility into progress and keeps the workflow deterministic.",{"type":52,"tag":268,"props":6250,"children":6251},{},[],{"type":52,"tag":57,"props":6253,"children":6254},{},[6255],{"type":52,"tag":61,"props":6256,"children":6257},{},[6258],{"type":65,"value":6259},"Begin with Phase 1: Verify Site Exists",{"type":52,"tag":6261,"props":6262,"children":6263},"style",{},[6264],{"type":65,"value":6265},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":6267,"total":6460},[6268,6290,6311,6332,6347,6364,6375,6386,6401,6416,6435,6448],{"slug":6269,"name":6269,"fn":6270,"description":6271,"org":6272,"tags":6273,"stars":6287,"repoUrl":6288,"updatedAt":6289},"rushstack-best-practices","manage Rush monorepos with best practices","Provides best practices and guidance for working with Rush monorepos. Use when the user is working in a Rush-based repository, asks about Rush commands (install, update, build, rebuild), needs help with project selection, dependency management, build caching, subspace configuration, or troubleshooting Rush-specific issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6274,6277,6280,6281,6284],{"name":6275,"slug":6276,"type":15},"Engineering","engineering",{"name":6278,"slug":6279,"type":15},"Local Development","local-development",{"name":9,"slug":8,"type":15},{"name":6282,"slug":6283,"type":15},"Project Management","project-management",{"name":6285,"slug":6286,"type":15},"Rush","rush",6484,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frushstack","2026-04-06T18:34:44.965032",{"slug":6291,"name":6291,"fn":6292,"description":6293,"org":6294,"tags":6295,"stars":6308,"repoUrl":6309,"updatedAt":6310},"azure-ai-agents-persistent-dotnet","build AI agents with Azure .NET SDK","Azure AI Agents Persistent SDK for .NET. Low-level SDK for creating and managing AI agents with threads, messages, runs, and tools. Use for agent CRUD, conversation threads, streaming responses, function calling, file search, and code interpreter. Triggers: \"PersistentAgentsClient\", \"persistent agents\", \"agent threads\", \"agent runs\", \"streaming agents\", \"function calling agents .NET\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6296,6299,6302,6305],{"name":6297,"slug":6298,"type":15},".NET","net",{"name":6300,"slug":6301,"type":15},"Agents","agents",{"name":6303,"slug":6304,"type":15},"Azure","azure",{"name":6306,"slug":6307,"type":15},"LLM","llm",2804,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills","2026-07-03T16:32:10.297433",{"slug":6312,"name":6312,"fn":6313,"description":6314,"org":6315,"tags":6316,"stars":6308,"repoUrl":6309,"updatedAt":6331},"azure-ai-anomalydetector-java","build anomaly detection applications with Java","Build anomaly detection applications with Azure AI Anomaly Detector SDK for Java. Use when implementing univariate\u002Fmultivariate anomaly detection, time-series analysis, or AI-powered monitoring.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6317,6320,6321,6324,6327,6328],{"name":6318,"slug":6319,"type":15},"Analytics","analytics",{"name":6303,"slug":6304,"type":15},{"name":6322,"slug":6323,"type":15},"Data Analysis","data-analysis",{"name":6325,"slug":6326,"type":15},"Java","java",{"name":9,"slug":8,"type":15},{"name":6329,"slug":6330,"type":15},"Monitoring","monitoring","2026-05-13T06:14:16.261754",{"slug":6333,"name":6333,"fn":6334,"description":6335,"org":6336,"tags":6337,"stars":6308,"repoUrl":6309,"updatedAt":6346},"azure-ai-contentsafety-java","build content moderation applications with Azure AI","Build content moderation applications with Azure AI Content Safety SDK for Java. Use when implementing text\u002Fimage analysis, blocklist management, or harm detection for hate, violence, sexual content, and self-harm.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6338,6341,6342,6343],{"name":6339,"slug":6340,"type":15},"AI Infrastructure","ai-infrastructure",{"name":6303,"slug":6304,"type":15},{"name":6325,"slug":6326,"type":15},{"name":6344,"slug":6345,"type":15},"Security","security","2026-07-07T06:53:31.293235",{"slug":6348,"name":6348,"fn":6349,"description":6350,"org":6351,"tags":6352,"stars":6308,"repoUrl":6309,"updatedAt":6363},"azure-ai-contentsafety-py","detect harmful content with Azure AI Content Safety","Azure AI Content Safety SDK for Python. Use for detecting harmful content in text and images with multi-severity classification.\nTriggers: \"azure-ai-contentsafety\", \"ContentSafetyClient\", \"content moderation\", \"harmful content\", \"text analysis\", \"image analysis\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6353,6354,6357,6358,6359,6362],{"name":6303,"slug":6304,"type":15},{"name":6355,"slug":6356,"type":15},"Compliance","compliance",{"name":6306,"slug":6307,"type":15},{"name":9,"slug":8,"type":15},{"name":6360,"slug":6361,"type":15},"Python","python",{"name":6344,"slug":6345,"type":15},"2026-07-18T05:14:23.017504",{"slug":6365,"name":6365,"fn":6366,"description":6367,"org":6368,"tags":6369,"stars":6308,"repoUrl":6309,"updatedAt":6374},"azure-ai-language-conversations-py","implement conversational language understanding with Python","Implement Conversational Language Understanding (CLU) using the azure-ai-language-conversations Python SDK. Use when working with ConversationAnalysisClient to analyze conversation intent and entities, building NLP features, or integrating language understanding into applications.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6370,6371,6372,6373],{"name":6318,"slug":6319,"type":15},{"name":6303,"slug":6304,"type":15},{"name":6306,"slug":6307,"type":15},{"name":6360,"slug":6361,"type":15},"2026-07-31T05:54:29.068751",{"slug":6376,"name":6376,"fn":6377,"description":6378,"org":6379,"tags":6380,"stars":6308,"repoUrl":6309,"updatedAt":6385},"azure-ai-translation-text-py","translate text using Azure AI services","Azure AI Text Translation SDK for real-time text translation, transliteration, language detection, and dictionary lookup. Use for translating text content in applications.\nTriggers: \"text translation\", \"translator\", \"translate text\", \"transliterate\", \"TextTranslationClient\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6381,6382,6383,6384],{"name":18,"slug":19,"type":15},{"name":6303,"slug":6304,"type":15},{"name":9,"slug":8,"type":15},{"name":6360,"slug":6361,"type":15},"2026-07-18T05:14:16.988376",{"slug":6387,"name":6387,"fn":6388,"description":6389,"org":6390,"tags":6391,"stars":6308,"repoUrl":6309,"updatedAt":6400},"azure-ai-vision-imageanalysis-py","analyze images with Azure AI Vision","Azure AI Vision Image Analysis SDK for captions, tags, objects, OCR, people detection, and smart cropping. Use for computer vision and image understanding tasks.\nTriggers: \"image analysis\", \"computer vision\", \"OCR\", \"object detection\", \"ImageAnalysisClient\", \"image caption\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6392,6393,6396,6399],{"name":6303,"slug":6304,"type":15},{"name":6394,"slug":6395,"type":15},"Computer Vision","computer-vision",{"name":6397,"slug":6398,"type":15},"Images","images",{"name":6360,"slug":6361,"type":15},"2026-07-18T05:14:18.007737",{"slug":6402,"name":6402,"fn":6403,"description":6404,"org":6405,"tags":6406,"stars":6308,"repoUrl":6309,"updatedAt":6415},"azure-appconfiguration-java","manage configuration with Azure App Configuration","Azure App Configuration SDK for Java. Centralized application configuration management with key-value settings, feature flags, and snapshots.\nTriggers: \"ConfigurationClient java\", \"app configuration java\", \"feature flag java\", \"configuration setting java\", \"azure config java\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6407,6408,6411,6414],{"name":6303,"slug":6304,"type":15},{"name":6409,"slug":6410,"type":15},"Configuration","configuration",{"name":6412,"slug":6413,"type":15},"Feature Flags","feature-flags",{"name":6325,"slug":6326,"type":15},"2026-07-03T16:32:01.278468",{"slug":6417,"name":6417,"fn":6418,"description":6419,"org":6420,"tags":6421,"stars":6308,"repoUrl":6309,"updatedAt":6434},"azure-cosmos-rust","build applications with Azure Cosmos DB","Azure Cosmos DB library for Rust (NoSQL API). Document CRUD, containers, and globally distributed data.\nTriggers: \"cosmos db rust\", \"CosmosClient rust\", \"document crud rust\", \"NoSQL rust\", \"partition key rust\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6422,6425,6428,6431],{"name":6423,"slug":6424,"type":15},"Cosmos DB","cosmos-db",{"name":6426,"slug":6427,"type":15},"Database","database",{"name":6429,"slug":6430,"type":15},"NoSQL","nosql",{"name":6432,"slug":6433,"type":15},"Rust","rust","2026-07-31T05:54:27.021432",{"slug":6436,"name":6436,"fn":6418,"description":6437,"org":6438,"tags":6439,"stars":6308,"repoUrl":6309,"updatedAt":6447},"azure-cosmos-ts","Azure Cosmos DB JavaScript\u002FTypeScript SDK (@azure\u002Fcosmos) for data plane operations. Use for CRUD operations on documents, queries, bulk operations, and container management. Triggers: \"Cosmos DB\", \"@azure\u002Fcosmos\", \"CosmosClient\", \"document CRUD\", \"NoSQL queries\", \"bulk operations\", \"partition key\", \"container.items\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6440,6441,6442,6443,6444],{"name":6423,"slug":6424,"type":15},{"name":6426,"slug":6427,"type":15},{"name":9,"slug":8,"type":15},{"name":6429,"slug":6430,"type":15},{"name":6445,"slug":6446,"type":15},"TypeScript","typescript","2026-07-03T16:31:19.368382",{"slug":6449,"name":6449,"fn":6450,"description":6451,"org":6452,"tags":6453,"stars":6308,"repoUrl":6309,"updatedAt":6459},"azure-data-tables-java","build table storage applications with Java","Build table storage applications with Azure Tables SDK for Java. Use when working with Azure Table Storage or Cosmos DB Table API for NoSQL key-value data, schemaless storage, or structured data at scale.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6454,6455,6456,6457,6458],{"name":6303,"slug":6304,"type":15},{"name":6423,"slug":6424,"type":15},{"name":6426,"slug":6427,"type":15},{"name":6325,"slug":6326,"type":15},{"name":6429,"slug":6430,"type":15},"2026-05-13T06:14:17.582229",267,{"items":6462,"total":6553},[6463,6475,6489,6499,6512,6525,6539],{"slug":6464,"name":6464,"fn":6465,"description":6466,"org":6467,"tags":6468,"stars":26,"repoUrl":27,"updatedAt":6474},"activate-site","provision and activate Power Pages sites","Activates and provisions a Power Pages website in a Power Platform environment via the Power Platform REST API. Use when the user wants to activate, provision, turn on, or enable a Power Pages website or portal.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6469,6472,6473],{"name":6470,"slug":6471,"type":15},"Deployment","deployment",{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},"2026-04-06T18:34:34.732549",{"slug":6476,"name":6476,"fn":6477,"description":6478,"org":6479,"tags":6480,"stars":26,"repoUrl":27,"updatedAt":6488},"add-connector","add Power Platform connectors to apps","Adds any Power Platform connector to a Power Apps code app. Generic fallback for connectors not covered by a specific skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6481,6484,6486],{"name":6482,"slug":6483,"type":15},"Integrations","integrations",{"name":6485,"slug":36,"type":15},"Power Apps",{"name":6487,"slug":37,"type":15},"Power Platform","2026-07-31T05:54:47.042251",{"slug":6490,"name":6490,"fn":6491,"description":6492,"org":6493,"tags":6494,"stars":26,"repoUrl":27,"updatedAt":6498},"add-datasource","add data sources to Power Apps","Adds a data source or connector to a Power Apps code app. Asks what the user wants to accomplish and routes to the appropriate specialized skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6495,6496,6497],{"name":6482,"slug":6483,"type":15},{"name":9,"slug":8,"type":15},{"name":6485,"slug":36,"type":15},"2026-07-03T16:31:47.822186",{"slug":6500,"name":6500,"fn":6501,"description":6502,"org":6503,"tags":6504,"stars":26,"repoUrl":27,"updatedAt":6511},"add-dataverse","add Dataverse tables to Power Apps","Use when the user wants to add Dataverse tables (existing or new) to a Power Apps mobile app, extend an existing Dataverse table with new columns, or apply an approved data model plan.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6505,6508,6509,6510],{"name":6506,"slug":6507,"type":15},"Data Modeling","data-modeling",{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},{"name":6485,"slug":36,"type":15},"2026-07-31T05:54:46.078014",{"slug":6513,"name":6513,"fn":6514,"description":6515,"org":6516,"tags":6517,"stars":26,"repoUrl":27,"updatedAt":6524},"add-excel","integrate Excel Online into Power Apps","Adds Excel Online (Business) connector to a Power Apps code app. Use when reading or writing Excel workbook data from OneDrive or SharePoint.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6518,6521,6522,6523],{"name":6519,"slug":6520,"type":15},"Excel","excel",{"name":6482,"slug":6483,"type":15},{"name":9,"slug":8,"type":15},{"name":6485,"slug":36,"type":15},"2026-07-31T05:54:44.030943",{"slug":6526,"name":6526,"fn":6527,"description":6528,"org":6529,"tags":6530,"stars":26,"repoUrl":27,"updatedAt":6538},"add-mcscopilot","add Copilot Studio connectors to Power Apps","Adds Microsoft Copilot Studio connector to a Power Apps code app. Use when invoking Copilot Studio agents, sending prompts to agents, or integrating agent responses.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6531,6532,6535,6536,6537],{"name":6300,"slug":6301,"type":15},{"name":6533,"slug":6534,"type":15},"Copilot Studio","copilot-studio",{"name":6482,"slug":6483,"type":15},{"name":9,"slug":8,"type":15},{"name":6485,"slug":36,"type":15},"2026-07-31T05:54:39.025597",{"slug":6540,"name":6540,"fn":6541,"description":6542,"org":6543,"tags":6544,"stars":26,"repoUrl":27,"updatedAt":6552},"add-sample-data","populate Power Pages tables with sample data","Populates Dataverse tables with sample records for testing and demoing a Power Pages site. Use when the user wants to add sample data, seed data, generate test records, or insert demo data into their tables.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[6545,6546,6547,6548,6549],{"name":6426,"slug":6427,"type":15},{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":6550,"slug":6551,"type":15},"Testing","testing","2026-04-06T18:34:41.141155",26]