feat: route ERP via dataverse CLI across overview/query/data/connect - #90
feat: route ERP via dataverse CLI across overview/query/data/connect#90athanipavan wants to merge 11 commits into
Conversation
Treats Finance & Operations as an app on Dataverse, not a separate product. Adds ERP triggers (frontmatter, Plugin Covers note, Dataverse CLI row in capability matrix, routing pointers in PAC CLI row + tool priority). Detail lives in references/erp-target.md to keep the body close to Anthropic's Level 2 budget. Version 1.5.0 -> 1.5.1. Known: body is 5387 tokens (cap 5000). main was already 5186 over; this PR adds ~200. Opening for internal review of the integration approach — body-trim is a separate pass.
Conflicts: - plugin.json (x2): take main's expanded plugin description, keep 1.7.0 version - dv-connect SKILL.md: combine main's Step 5 failure-list update with the ERP detection/smoke-test pointers (extracted to references/erp-detection.md to stay close to budget) Budget status after merge: - dv-connect 5017/5000 (+17): the single line linking to erp-detection.md. Pre-PR baseline was 4999/5000 on main. - dv-overview 5395/5000 (+395): pre-existing 5256 overrun on main + 139 for ERP capability matrix row and tool-priority qualifier. Trimmed from +244 to +139 by inlining links and removing redundant prose.
|
@microsoft-github-policy-service agree company="Microsoft" |
# Conflicts: # .cursor-plugin/marketplace.json # .github/plugin/marketplace.json # .github/plugins/dataverse/.claude-plugin/plugin.json # .github/plugins/dataverse/.codex-plugin/plugin.json # .github/plugins/dataverse/.cursor-plugin/plugin.json # .github/plugins/dataverse/.github/plugin/plugin.json
These were inadvertently swept in by 'git add -A' during the earlier merge conflict resolution. The plugin's real auth.py lives under .github/plugins/dataverse/scripts/ and is unchanged in this PR.
jeffandms
left a comment
There was a problem hiding this comment.
We must remove all references to "Uno" before completing this PR.
Per reviewer feedback on PR #90: UNO is an internal-only codename and must not appear in externally published skill content. Substituted with phrasing that describes the actual configuration (F&O linked to / provisioned on top of the same Dataverse env).
Per reviewer follow-up on PR #90: pick one term and stick with it. Standardized on 'ERP' as the lead term, with '(Finance and Operations)' as the first-mention expansion in each skill / reference file. Replaced all subsequent 'F&O' and 'Finance & Operations' occurrences with 'ERP'. Single remaining 'F&O' is in a trigger-word list documenting input variants users may type, not descriptive prose.
- Move ERP writes/reads sections from dv-data/dv-query SKILL.md bodies into new references/erp-writes.md and references/erp-reads.md files; leave short one-line pointers in the bodies. - Trim ERP additions in dv-overview SKILL.md to shorter pointers so the body stays under the 5000-token cap (EVAL-BUDGET-02). - Drop 'For ERP linkage, see...' inline note from dv-connect Step 2; the pointer already exists elsewhere. - Sanitize speculative / opinion phrasing in erp-detection.md and erp-target.md (rollout notes, ''not yet packaged'' status, invented ''<=10 records'' limits). No code or auth pattern changes; docs-only.
There was a problem hiding this comment.
Pull request overview
This PR extends the Dataverse skills plugin to treat ERP (Finance & Operations) as an additional target variant (CLI/MCP-routed) within existing skills rather than introducing separate erp-* skills.
Changes:
- Add ERP routing guidance to
dv-overview, plus a new deep-dive reference (references/erp-target.md). - Add ERP read/write documentation to
dv-queryanddv-datavia new reference pages (erp-reads.md,erp-writes.md). - Bump plugin/marketplace versions from 1.6.0 → 1.7.0 across manifests.
Reviewed changes
Copilot reviewed 13 out of 13 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| .github/plugins/dataverse/skills/dv-query/SKILL.md | Adds ERP read-path guidance and links to ERP read/write references. |
| .github/plugins/dataverse/skills/dv-query/references/erp-reads.md | New ERP querying reference with CLI examples and Dataverse-vs-ERP differences. |
| .github/plugins/dataverse/skills/dv-overview/SKILL.md | Expands overview routing/capability matrix to include ERP target via Dataverse CLI. |
| .github/plugins/dataverse/skills/dv-overview/references/erp-target.md | New ERP target routing model and tool-priority guidance. |
| .github/plugins/dataverse/skills/dv-data/SKILL.md | Adds pointer section for ERP writes via reference doc. |
| .github/plugins/dataverse/skills/dv-data/references/erp-writes.md | New ERP write-path reference (MCP/CLI/DMF tiers + differences table). |
| .github/plugins/dataverse/skills/dv-connect/references/erp-detection.md | New ERP linkage detection reference (currently not discoverable from dv-connect). |
| .github/plugins/dataverse/.github/plugin/plugin.json | Version bump to 1.7.0. |
| .github/plugins/dataverse/.cursor-plugin/plugin.json | Version bump to 1.7.0. |
| .github/plugins/dataverse/.codex-plugin/plugin.json | Version bump to 1.7.0. |
| .github/plugins/dataverse/.claude-plugin/plugin.json | Version bump to 1.7.0. |
| .github/plugin/marketplace.json | Marketplace version bump to 1.7.0. |
| .cursor-plugin/marketplace.json | Marketplace version bump to 1.7.0. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| | Primary key | single GUID | composite, usually includes `dataAreaId` | | ||
| | Lookup binding | `@odata.bind` to navigation property | Set the FK property directly on the body | | ||
| | Bulk write | `CreateMultiple` via SDK | **No bulk API** — DMF is the platform path | | ||
| | Custom actions | bound/unbound via Web API | bound via `data invoke` or `api invoke --target erp` for unbound services | |
| # Detecting and validating ERP (Finance and Operations) linkage | ||
|
|
||
| On ERP-linked Dataverse environments, ERP is provisioned on top of the same Dataverse env. After Step 2 resolves `DATAVERSE_URL`, detect whether an ERP endpoint is also linked. | ||
|
|
saurabhrb
left a comment
There was a problem hiding this comment.
Reviewed end-to-end against tip 19d32d6 — pulled the branch, ran the static suite, and verified every ERP CLI command against the DataverseCLI source. Strong work: the CLI surface is accurate (--target erp, --cross-company gating, the data associate refusal text is verbatim), the reads/writes reference split keeps the bodies lean, and static checks pass. A few items in the inline comments, plus two notes here:
- PR description is stale. It states
static_checks.pyfails onEVAL-BUDGET-02and that dv-connect "Step 2/3/5" are modified. Neither holds on the current tip — the suite passes anddv-connect/SKILL.mdis unchanged. Please update the description to match the diff. - Root Cursor catalog. You correctly bumped
.cursor-plugin/marketplace.jsonto 1.7.0 here, but that field is outside theEVAL-VERSION-01check — flagging because #91 does not bump it and will drift (1.7.0 vs 1.8.0).
- dv-connect: add erp-detection.md pointer in Step 2; drop stale hard-coded /adminconsent URL (CLI now emits scope-scoped URL at runtime) - dv-overview: merge contradictory bullets on ERP/Dynamics scope - dv-query: correct User-Agent closed schema to (app/skill/agent) - dv-data/erp-writes: drop nonexistent 'data invoke' reference
Adds first-class ERP (F&O) routing to the Dataverse skills plugin without spawning
erp-*sibling skills. ERP is treated as a target variant of the existing skills:dv-overviewroutes ERP traffic,dv-queryanddv-datadocument the CLI-based ERP path, anddv-connectdetects ERP linkage on UNO environments and surfacesERP_URLin.env.The approach is CLI-only: ERP work goes through
dataverse --target erp,dataverse api invoke --target erp,dataverse erp batch ..., anddataverse mcp <fnoUrl>. No PythonErpClientis introduced;auth.pyis unchanged. The DataverseCLI repo already provides full ERP coverage (CRUD with composite keys +--cross-company, F&O custom services, batch jobs, ERP MCP auto-routing), so the plugin's job is to teach the agent how to route to it correctly.Highlights
dv-overview: ERP added to the trigger list; new Dataverse CLI row in the capability matrix; tool-priority paragraph notes the ERP tier (no Python SDK). Full detail in newreferences/erp-target.md.dv-query: SDK-First Rule clarifies ERP is a separate path; newQuerying ERP datasection with CLI examples and a Dataverse-vs-ERP differences table (PascalCase entity sets, composite keys withdataAreaId,--cross-company, no FetchXML/SQL/``).dv-data: newWriting ERP datasection covering MCP / CLI / DMF tiers with a key-differences table.dv-connect: Step 2 detects ERP viapac org whofirst, falls back todataverse org who --environment <DATAVERSE_URL> --json(--environmentpassed explicitly because DV CLI keeps its own active profile separate from PAC). Step 3 writesERP_URLto.envwhen present. Step 5 smoke-tests ERP withdataverse data query --target erp --table Currencies --top 1. Detail extracted to newreferences/erp-detection.mdto stay close to the body-token budget.Version
1.6.0 → 1.7.0 (MINOR — backward-compatible capability addition). All four version fields updated;
version_bump_check.pypasses.Validation
python .github/evals/static_checks.py: every check passes exceptEVAL-BUDGET-02:dv-overviewbody is 5395/5000 tokens. Pre-PR baseline on main is 5256; my additions account for ~139 tokens (Dataverse CLI matrix row and tool-priority qualifier) — trimmed down from an initial +244 by inlining links and folding prose intoreferences/erp-target.md.dv-connectbody is 5017/5000 tokens. Pre-PR baseline on main is 4999 (already 1 below cap); the +17 is a single line linking to the newreferences/erp-detection.mdplus surrounding prose. Reducible further only by removing the body pointer entirely, which would defeat the agent's ability to discover the reference.dv-overviewoverrun is best treated as a follow-up.dataverse.exe: every flag and subcommand the skills prescribe (data query/get/create/update/delete/upsert --target erp,--cross-company,api invoke --target erp --service-group ... --service ...,erp batch list|cancel,mcp <fnoUrl>,org who --environment ... --json) matches the CLI's own--helpoutput.dataverse data query --target erp --table Currencies --top 1against the UNO env) blocked locally by DNS to the F&O host; the CLI built the correct URL and authenticated correctly.Out of scope (deferred)
dv-admingainingdataverse erp batchrouting.api invoke).dv-overviewbody overrun under 5000 tokens.get_erp_url()toauth.pyif a real bulk-Python need emerges).Closes the abandoned attempt in #82.