add-table-to-offline-profile
Internal mobile-app workflow read and executed only by mobile orchestrators to add one Dataverse table to an existing Mobile Offline Profile.
Install / Use
npx skills add microsoft/power-platform-skills --skill add-table-to-offline-profileInstalls into whichever agent you are using.
SKILL.md
Installable skill definition
Quality Score
Category
AutomationSupported Platforms
Our assessment of add-table-to-offline-profile
add-table-to-offline-profile scores 91/100 on our quality scale, 1065th of 2,843 Automation skills we index (top 38%).
Its SKILL.md is 9.2 KB long, well organised into 15 sections with 9 code examples: a thorough specification that gives an agent plenty to work with.
It has 919 GitHub stars, a meaningful sign that others use it.
Maintenance, license and trust
- The repository was last updated 9 days ago, so add-table-to-offline-profile is actively maintained.
- It is released under the MIT license, a permissive license that allows use, modification and commercial use with attribution.
- Its trust signals score 100/100, with no cautions. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
Safety scan
No issues foundOur scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands.
Automated pattern scan on 2026-10-04. It catches known dangerous patterns, not every risk — read a skill before letting an agent act on it.
add-table-to-offline-profile compared with similar skills
All 4 of these similar skills score higher than add-table-to-offline-profile; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| add-table-to-offline-profile (this skill)by microsoft | 91 | 919 | 9d ago | SKILL.md |
| Agent-Reachby Panniantong | 100 | 89.8k | 18d ago | CLAUDE.md |
| headroomby headroomlabs-ai | 100 | 74.4k | today | CLAUDE.md |
| Scraplingby D4Vinci | 100 | 85.5k | today | MCP Server |
| crawl4aiby unclecode | 100 | 84.7k | 8d ago | MCP Server |
Frequently asked questions
- How do I install add-table-to-offline-profile?
- Run
npx skills add microsoft/power-platform-skills --skill add-table-to-offline-profile. The install tabs above show the steps for each supported agent. - Which AI agents does add-table-to-offline-profile work with?
- It is written for Universal, as a SKILL.md file. Other agents that read the same format can often use it too.
- Is add-table-to-offline-profile safe to use?
- Our scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. It is MIT-licensed and scores 100/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is add-table-to-offline-profile still maintained?
- The repository was last updated 9 days ago, so add-table-to-offline-profile is actively maintained.
Skill content
View source on GitHubname: add-table-to-offline-profile description: Internal mobile-app workflow read and executed only by mobile orchestrators to add one Dataverse table to an existing Mobile Offline Profile. user-invocable: false disable-model-invocation: true allowed-tools: Read, Edit, Write, Grep, Glob, Bash, AskUserQuestion model: sonnet
Shared instructions: shared-instructions.md — read first.
References:
- dataverse-offline-api.md §4 + §7 — POST item + PATCH selectedcolumns
- offline-profile-reconciliation.md — the
schemaColumnsbaseline written in Step 7
Add Table to Offline Profile
Add a single table to an existing Mobile Offline Profile. Most common flow: user ran /add-dataverse to add a new table to their app, now wants that table available offline too.
Equivalent to running /setup-offline-profile and seeing the existing profile (extend-mode), but skips the per-table questionnaire for the tables already in the profile — only configures the new one.
Workflow
- Verify project + locate profile → 2. Resolve target table → 3. Prereq check (auto-enable if needed) → 4. Scope picker (single question) → 5. POST item + PATCH selectedcolumns → 6. Publish → 7. Update artifacts → 8. Summary
Step 1 — Verify project + locate profile
test -f power.config.json
node "${PLUGIN_ROOT}/scripts/resolve-environment.js" "$(node -e \"console.log(require('./power.config.json').environmentId)\")"
Manifest path (dual-location):
MANIFEST=$(test -f .datamodel-manifest.json && echo ".datamodel-manifest.json" || \
(test -f docs/plan-artifacts/.datamodel-manifest.json && echo "docs/plan-artifacts/.datamodel-manifest.json"))
test -n "$MANIFEST" && echo "✓ manifest at $MANIFEST"
Profile ID resolution (same as /edit-offline-profile).
STOP if no profile exists. Recommend: Run /setup-offline-profile first to create the profile.
Step 2 — Resolve target table
$ARGUMENTS parsing:
| Flag | Effect |
|---|---|
| --table <logical-name> | Explicit target |
| --all-new | Add ALL tables in the manifest that aren't already in the profile (bulk mode) |
| (no flags) | Interactive: list tables in manifest NOT yet in profile via AskUserQuestion (max 4); if more than 4 candidates, prompt user to specify by name in next message |
For bulk --all-new mode, loop through Steps 3-6 for each missing table; each runs sequentially because Dataverse profile-item POSTs serialize.
Step 3 — Prereq check (auto-enable if needed)
Query the target table's EntityMetadata:
node "${PLUGIN_ROOT}/scripts/dataverse-request.js" <envUrl> GET \
"EntityDefinitions(LogicalName='<table>')?\$select=IsAvailableOffline,ChangeTrackingEnabled,OwnershipType,IsCustomizable"
| Flags state | Action |
|---|---|
| Both already true | Skip to Step 4 |
| Either false AND IsCustomizable | Auto-enable via update-entity-offline-flags.js (no prompt — the user already opted into "offline this table" by invoking this skill) |
| IsCustomizable.Value = false | STOP with BLOCKED: <table> is system-managed and cannot be flagged for offline. Use a different table or accept this row is read-only-offline. |
After auto-enable, single POST PublishAllXml.
Step 4 — Scope picker (single question)
Pull from manifest the target table's lookups[] to inform defaults. Run a quick row-count probe to inform reference-data classification.
AskUserQuestion with 4 options reflecting the architect's priority cascade:
| Option label | Maps to |
|---|---|
| Organization rows — User's rows only (Recommended for most tables) | recorddistributioncriteria: 2, recordsownedbyme: true |
| All records (for small reference data) | recorddistributioncriteria: 1 |
| Related rows only (for pure child tables) | recorddistributioncriteria: 0 |
| Custom — specify exact flags in next message | Prompt user with text |
Recommendation in the question body should be derived from the architect's heuristics for the table being added (use the same priority cascade from offline-profile-architect.md Step 4 inline). The user can override.
Step 5 — POST item + associations + PATCH selectedcolumns
Step 5a — POST profile item
node "${PLUGIN_ROOT}/scripts/dataverse-request.js" <envUrl> POST \
"mobileofflineprofileitems" \
--body '{
"name": "<DisplayName>",
"regardingobjectid@odata.bind": "/mobileofflineprofiles(<profileId>)",
"selectedentitytypecode": "<table>",
"recorddistributioncriteria": <0|1|2>,
"recordsownedbyme": <bool>,
"recordsownedbymyteam": false,
"recordsownedbymybusinessunit": false,
"getrelatedentityrecords": true,
"syncintervalinminutes": 10
}' \
--include-headers
Capture itemId from OData-EntityId response header.
Step 5b — POST associations for the new table's relationships
After the new item is created, walk the new table's relationships (from the manifest's lookups[] + a EntityDefinitions(LogicalName='<table>')/ManyToOneRelationships query) and POST one mobileofflineprofileitemassociation per relationship whose target is ALREADY in the profile.
Recipe per shared/references/dataverse-offline-api.md §5–§6:
node "${PLUGIN_ROOT}/scripts/dataverse-request.js" <envUrl> POST \
"mobileofflineprofileitemassociations" \
--body '{
"name": "<relationshipSchemaName>",
"relationshipdisplayname": "<relationshipSchemaName>",
"relationshipid": "<MetadataId-from-EntityDefinitions>",
"regardingobjectid@odata.bind": "/mobileofflineprofileitems(<newItemId>)"
}' \
--include-headers
Critical: do NOT include selectedrelationshipsschema in the body — server fills it in (empirical 2026-05-24).
For new tables that are recorddistributioncriteria: 0 (Related rows only), at least ONE inbound relationship MUST be included or the table will sync zero rows. The skill should validate this and warn if no associations are being created for a Related-only-scoped table.
Step 5c — PATCH selectedcolumns
Build selectedcolumns using the deterministic union from offline-profile-architect.md Step 6 (always-include ∪ lookups ∪ screen-grep'd, dedupe, sort).
node "${PLUGIN_ROOT}/scripts/dataverse-request.js" <envUrl> PATCH \
"mobileofflineprofileitems(<itemId>)" \
--body '{"selectedcolumns":"{\"Columns\":[...]}"}'
Step 6 — Publish (targeted PublishXml)
node "${PLUGIN_ROOT}/scripts/dataverse-request.js" <envUrl> POST \
"PublishXml" --body '{
"ParameterXml": "<publish><mobileofflineprofiles><mobileofflineprofile>'"$PROFILE_ID"'</mobileofflineprofile></mobileofflineprofiles></publish>"
}'
Publishes only this profile, not the entire org's customizations. See shared/references/dataverse-offline-api.md §9 for 0x80071141 circular-relationship handling + PublishAllXml fallback.
Step 7 — Update artifacts
Append the new table's entry to offline-profile.json tables[]. The entry MUST include a schemaColumns array — the added table's full set of schema column logical names from .datamodel-manifest.json at this moment. This is the schema-reconciliation baseline that scripts/offline-profile-delta.js diffs future manifest changes against; omitting it makes the lifecycle delta check report this table under columnBaselineMissing until it is re-reconciled. It is distinct from selectedColumns (the curated sync set) — see offline-profile-reconciliation.md. Match the canonical entry shape in /setup-offline-profile Step 9a.
Append to memory-bank.md ## Offline profile block:
addedTables:
- { at: 2026-05-19T..., table: <name>, itemId: <guid>, scope: <criterion> }
Step 8 — Summary
✓ Added <table> to profile.
Profile : <name>
New item ID : <guid>
Scope : <human-readable>
Sync : <minutes> min
Columns : <N> selected
Published : <ISO timestamp>
Total tables in profile now: <N>
Users who already have this profile assigned will receive the new table on their
next sign-in sync. To force-refresh, sign out and back in on the device.
Status code (final line)
DONE— table added, profile published, artifacts updatedDONE_WITH_CONCERNS: <list>— added with caveats (auto-enabled prereqs, publish timeout-then-success)NEEDS_CONTEXT: <missing>— no profile to add to, or no target tableBLOCKED: <reason>— IsCustomizable=false on target, auth failure, POST/PATCH failure
What this skill does NOT do
- Add N:N (ManyToMany) relationships to a profile item — uncommon, not covered by v0.1's recipe (which assumes N:1 / 1:N via the
regardingobjectidlookup). If the user has an M:N use case, point them at the maker portal. - Re-architect existing tables in the profile — that's
/edit-offline-profile. - Remove a table from the profile — manual
DELETE /mobileofflineprofileitems(<itemId>)(no current skill).
Related Skills
Agent-Reach
89.8kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
headroom
74.4kCompress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.
Scrapling
85.5k🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scrapling_dev
crawl4ai
84.7kOpen-source web crawler and scraper for LLMs and AI agents: any website into clean, LLM-ready Markdown. Run it yourself, or use Crawl4AI Cloud with one key.
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
