Skip to content
| Marketplace
Sign in
Visual Studio Code>Other>Mongoose IDO Pro EditorNew to Visual Studio Code? Get it now.
Mongoose IDO Pro Editor

Mongoose IDO Pro Editor

Jeking

|
14 installs
| (0) | Free
Visual editor for Mongoose IDO Collection metadata (ObjectStudioExport XML).
Installation
Launch VS Code Quick Open (Ctrl+P), paste the following command, and press enter.
Copied to clipboard
More Info

Mongoose IDO Metadata Editor

A VS Code / Kiro IDE extension for editing Mongoose IDO Collection metadata (ObjectStudioExport XML) through a friendly, visual UI instead of hand-editing deeply nested XML.

Version 1.122.2. See CHANGELOG.md for release notes and DESIGN.md for the design and roadmap.

Features (v1)

  • Visual custom editor for any **/Collections/**/*.xml IDO file, with tabs:
    • Properties — the primary working view: a sticky Identity bar (name, module, ext-class, revision, inline-editable description), a read-only property grid (# · Name · Set / Where · Binding badge · Class · Source) that filters, sorts and scrolls independently, with the Property Grid opening in document order by default and supporting drag reordering, and a resizable, toggleable editor side panel that stays in view. The panel edits every field with dropdowns/checkboxes, shows inline validation, has Editor, Data Rules, and Bound Components sub-tabs, Open ↗ buttons to jump to a referenced IDO, and a read-only inherited PropertyClass section. Bound Components queries the installed SyteLine IDS Form Designer for direct IDS/IV2 bindings of the selected property and can reveal the exact control in its custom editor. Completed lookups are cached briefly in memory with bounded LRU storage; repeated requests are deduplicated, empty results are cached, and Refresh forces a rescan without starting a background query for every Property.
    • Overview — edit identity / ext-class / revision fields.
    • Tables — relationship-aware master–detail view with Primary/Secondary and IDO Alias badges, database table/view identity, Property usage counts and links, collapsible/filterable Usage, editable Join fields, inline validation, and add/edit/delete operations.
    • Properties — master–detail with binding badges, key markers, drag-to-reorder (auto-renumbers Sequence), add/delete, and a binding-aware detail form (BOUND/DERIVED/UNBOUND/SUBCOLLECTION fields + PropertyAttributes) with enum dropdowns.
    • Methods — editable method cards (name, type, transactional, stored proc, description) with a parameter grid (name, DB type/length/scale, in/out/message) and add/delete for methods and parameters. Parameter and Result Set Column Sequence values are calculated from row order: each grid displays in sequence order and offers Move up / Move down controls that reorder the XML nodes and recalculate 1…N. SP + Result Set and C# + Result Set methods also expose a Result Set Columns grid for the <ResultSetProperties> output contract; during a Dev Hub CLM refresh, its Match column lists deterministic/inferred/ambiguous candidate Properties for explicit selection, and the selected candidate is copied into the searchable Reference Property picker. Candidate selection updates locally without rebuilding or jumping the Methods editor; the persistent grid still preserves free-text output names. Duplicate Method is available on the selected method and deep-copies its full XML subtree, including parameters and result-set columns.
    • Data Rules — edit rule actions, activation conditions and filter conditions, with Set / Where filtering in the Property Editor side panel to focus on rules that set properties or filter rows, and Duplicate Rule for a complete deep copy that preserves unknown XML fields and nested content. When an IDO is saved, its direct DataRule nodes are ordered by RuleName without reordering other metadata or rule internals.
    • Feature Status — an IDO-level right-side panel collects Feature IDs from Data Rule activation conditions in an IDS Form Designer-style collapsible tree, with summary cards, grouped status cards, expandable details, text/status filters, AppFeatures details, and direct rule-reference navigation. Live AppFeatures status querying through the MG REST Client runs automatically once when the panel is opened, if the client is available; opening without the client remains static and does not prompt. Check Feature Status is always available as the explicit force-refresh action and follows the active MG REST Client connection profile, reusing its stored token without opening the IDO Editor connection form, matching IDS Form Designer behavior. Live results distinguish Force GA, GA Active/Inactive, Pre-Release Active/Inactive, and Hidden Active/Inactive; ActivatedBy is only considered for active GA features. Force GA remains an advisory warning based on current AppFeatures data, not an authoritative audit, and the editor never removes conditions or DataRules automatically.
    • Cached Settings — inspect and edit IDO cached-setting declarations, with Duplicate Cached Setting to deep-copy the selected declaration and all of its XML children while assigning a unique name.
  • Data tab (read-only live preview) — when the MG REST Client extension (jeking.mg-rest-client) is installed, a Data tab runs a LoadCollection against the server and shows the rows in a grid. Columns are seeded from the IDO's own properties (keys first; subcollections excluded) via a searchable column picker (All / None / Reset, key markers); a SQL-WHERE server filter, a Top-N cap, an in-results Find box, click-to-sort headers (numeric-aware), Copy (TSV, copies the rows shown) and an Open in MG REST Client hand-off (opens the same query in the full REST client) round it out. Read-only, and hidden when the MG REST Client isn't installed.
  • IDO Outline — a second sidebar tree showing the structure of the active IDO (Tables, Properties grouped by binding, Methods → parameters, Data Rules, Cached Settings). Clicking a node navigates the visual editor to that item and focuses it.
  • Cached-setting aware data rules — authoring a Cached Setting activation condition now resolves the chosen IDO's <CachedSetting> declarations on demand: the Setting IDO field lists only the IDOs that actually declare cached settings (9 of ~5,700 in a real corpus), the Setting field becomes a picker of the real setting names, Value offers the backing property's coded values, a hint shows the scope/source (Site/User · property/method), and a name that isn't declared there is flagged inline. Both fields stay free-text so a not-yet-indexed name can still be typed. The condition's comparison also offers the full six operators (=, ≠, ≥, >, ≤, <).
  • IDO Cached Settings panel — an activity-bar tree of every <CachedSetting> declaration and whether any data rule reads it (IDO → setting), showing all declarations by default; the title-bar filter toggle narrows to the ones with no data-rule reference (22 of 41 in a real corpus). Each IDO node has an inline cloud-upload icon (and a right-click Import to SyteLine…) that imports that declaring IDO's XML. Each setting that a data rule reads is expandable — its reading references are grouped by reading IDO, with the individual rules (part · kind) listed beneath each; clicking an IDO group or a rule opens that IDO on the Data Rules tab. Each setting row's tooltip also lists the reading rule parts and the scope/source. Detection covers all three reference kinds: action (ValueType=1/ActionType=10), activation condition (SourceType=4) and filter condition (ValueType=2). IDO metadata only — an empty reference list means "no data-rule reference found", not that the setting is unused: a form script or C# extension class may still read it.
  • Labeled enums — "magic number" fields (MethodType, Binding, OperationType, ActionType, comparison operators, …) render as dropdowns with human labels.
  • Validation — semantic + intra-file reference checks surfaced as diagnostics (Problems panel) and a live footer summary: required fields, invalid enum codes, duplicate names, BOUND/DERIVED/SUBCOLLECTION requirements, ColumnTableAlias must match a real table alias, duplicate sequences, and more. A Fix all button in the Problems panel applies safe default fixes for eligible errors (e.g. setting IsReadOnly on a property targeted by a "Set Property Enabled" data-rule action). IDO: Validate All scans every indexed collection at once (batched, schema-aware), lists every flagged file in the Problems panel, and offers a themed report (IDOs sorted by error/warning count). After a scan the IDO Explorer filter can narrow the tree to IDOs with errors / warnings / clean, and flagged rows show a ⛔ N · ⚠ M badge.
  • IDO Explorer — activity-bar tree of all collections grouped by module, with a fuzzy Go to Collection… quick-pick. _IDS variants are flagged. Its filter (title-bar search) combines a name substring with a validation status (all / has errors / has warnings / clean; a status pick runs IDO: Validate All first if nothing has been scanned yet).
  • Base ⇄ _IDS compare — open a diff between a collection and its _IDS sibling.
  • PropertyClass editor — **/PropertyClasses/**/*.xml files open in a dedicated visual master–detail editor (list of PropertyClass definitions + a detail form covering the full PropertyAttributes set from PropertyClass.xsd), with clean round-trip and validation. A dedicated IDO Property Classes activity-bar panel (grouped by module) and the IDO: Go to PropertyClass… quick-pick help you find and open them.
  • Clean round-trip — writes are format-conformant (BOM, CRLF, 3-space indent, self-closing empties) and schema-faithful. 98% of the real corpus round-trips byte-for-byte; the rest are irregularly-indented files that get normalized by design.
  • Always available: one-click Open as XML to drop to the raw text editor.

Configuration

Setting Default Description
mgIdo.collectionsGlob **/IdoMetadata/**/Collections/**/*.xml Files discovered for the explorer/index.
mgIdo.devHub.preserveExistingMethodMetadata false When refreshing Method parameters from Dev Hub, preserve existing same-name direction/message and DBDataType/Length/Scale metadata instead of applying returned metadata.
mgIdo.devHub.mapCsharpTypeToDbDataType true Map known C# primitive types to IDO DBDataType during Method Parameter refresh. Unknown types are retained with warnings; CLM Result Set Columns are not type-mapped.
mgIdo.formsGlob **/*.{ids,iv2}.json Files scanned by the Forms Using This IDO panel (SyteLine IDS/IV2 form JSON).
mgIdo.metadataRoots / mgIdo.metadataRoot / mgIdo.mongooseMetadataRoot (empty) Explicit IDO metadata root folders to index (Collections + PropertyClasses). When all empty (default), the extension auto-detects metadata from the open workspace via collectionsGlob.
mgIdo.fallbackDevRoot C:\\Development\\csi Fallback CSI dev root used only when no metadata-root setting is set and the open workspace has no IDO metadata. The extension then indexes <fallbackDevRoot>\\IdoMetadata and <fallbackDevRoot>\\Mongoose.submod\\IdoMetadata\\Mongoose.
mgIdo.indentSize 3 Indent width fallback.
mgIdo.validateOnSave true Validate on save.
mgIdo.openVisualByDefault true Retained for compatibility; matching metadata files use the visual editor by default. Choose Open With Text Editor for raw XML.
mgIdo.sequenceMode contiguous contiguous | preserve | gapped sequence numbering.
mgIdo.formatScope document document | touched formatting scope (v1: document).
mgIdo.referenceScope module module | workspace cross-reference resolution.
mgIdo.sytelineInstallPath C:\Program Files\Infor\CSI Folder with AppMetadataTransport.exe used to import IDO XML for testing. Falls back to …\Setup\WinStudio and the dev …\Mongoose.submod\Setup\WinStudio.
mgIdo.importConfig (empty) Target SyteLine configuration for imports (e.g. Demo_DALS). Prompted and saved here on first import if empty.
mgIdo.clearCacheAfterImport true After a successful IDO import, discard that configuration's IDO metadata cache so the imported changes reload. For the AppMetadataTransport path it runs ConfigManCMD.exe -U:CACHE -c:<config>; for the MG REST path (mgRest.enabled) it invokes IdoProjects.DiscardMetadataCache. Requires no login token (transport) / reuses the REST connection.
mgIdo.mgRest.enabled false Use the MG REST Client extension (jeking.mg-rest-client) to import/export IDOs over the Mongoose REST API (IdoCollections.ImportFromXmlString / GenerateXml) instead of AppMetadataTransport.exe. When on, Import goes over REST and IDO: Export from SyteLine becomes available; you're prompted for the connection each time.
mgIdo.mgRest.baseUrl / mgIdo.mgRest.config / mgIdo.mgRest.username (empty) Defaults used to pre-fill the connection prompt. The password is always prompted and never stored.
mgIdo.mgRest.insecure false Skip TLS certificate verification for MG REST import/export (self-signed dev servers).
mgIdo.bumpRevisionOnSave true On save of a changed IDO file, stamp <RevisionDate> and calculate <RevisionNo>. With Git file history, the committed HEAD RevisionNo + 1 is the minimum, repeated uncommitted saves stay stable, and a manually higher value is preserved; without Git, the legacy current-value + 1 behavior remains. A Git repository with no history for the file starts at 1.
mgIdo.schemaCatalog (empty) Path to a JSON DB schema catalog { "Table": ["Col", …] }. When set, validation also flags Table names not in the schema and BOUND properties whose BoundToColumn isn't a real column of its table.

Schema-aware validation (verify tables & columns)

Point mgIdo.schemaCatalog at a JSON file mapping each table to its columns; validation then checks that every <Table Name> exists and every BOUND property's BoundToColumn is a real column of its table (surfaced as warnings in the Problems panel). Generate the catalog from INFORMATION_SCHEMA, e.g. with sqlcmd + a small transform:

sqlcmd -S localhost -E -d <YourDb> -h -1 -W -s "," -Q \
  "SELECT TABLE_NAME + ',' + COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS" \
  | awk -F, 'NF==2{printf "%s\t%s\n",$1,$2}' \
  | node -e "const m={};require('readline').createInterface({input:process.stdin}).on('line',l=>{const [t,c]=l.split('\t');if(t&&c){(m[t]=m[t]||[]).push(c);}}).on('close',()=>process.stdout.write(JSON.stringify(m)))" \
  > schema-catalog.json

Commands

  • IDO: Open in Visual Editor / IDO: Open as XML
  • IDO: Validate / IDO: Validate All — validate the active file, or scan every indexed collection (Problems panel + a themed report; then filter the explorer to flagged IDOs)
  • IDO: Go to Collection…
  • IDO: Compare base ⇄ _IDS variant — native side-by-side XML diff
  • IDO: Compare base ⇄ _IDS (structured) — a readable HTML report (themed tables) of what differs (added / removed / changed properties, tables, methods, data rules), ignoring the revision stamp
  • IDO: Analyze Cached Setting Impact… — cross-file report of every data rule (action/condition) that reads a chosen cached setting, so you can see what breaks before renaming/removing it
  • IDO: Analyze Data Rules (test plan) — writes <IDO>.datarules.md: a test-plan analysis that classifies every rule by REST-testability, renders trigger logic trees, lists environment dependencies, and derives test scenarios (for automated MG API test generation)
  • IDO: Apply Authoring Spec… — pick an idoAuthoringSpec:1 JSON file and apply it to the active IDO (add/update properties + add data rules); strictly validated, shows a summary and confirms before writing (same engine as the ido_apply_spec MCP tool)
  • IDO: Import to SyteLine (for testing) — deploys the current IDO XML via AppMetadataTransport.exe (or, when mgIdo.mgRest.enabled is on, over the Mongoose REST API via IdoCollections.ImportFromXmlString)
  • IDO: Import to SyteLine (AppMetadataTransport) — always uses AppMetadataTransport.exe, even when mgIdo.mgRest.enabled is on — a fallback that doesn't require toggling the setting off (also offered as a button if a REST import fails)
  • IDO: Export from SyteLine (MG REST) — with mgIdo.mgRest.enabled on, exports the IDO's XML from the server via IdoCollections.GenerateXml and offers to diff it against the workspace file (format/semantic fidelity check). Every REST call is verified (HTTP + ReturnValue/infobar) with visible errors.
  • IDO: Test in MG REST Client — opens a pre-selected quick test form (Load/Update/Invoke/…) using the REST client's active profile, or Generate Data Rule Tests (calls mgRestClient.generateDataRuleTests to build a test collection from this IDO's data rules); shown only when the jeking.mg-rest-client extension is installed
  • SyteLine Dev Hub integration (shown only when the SyteLine Dev Hub extension is installed): IDO: Open C# Entry Point (title-bar → jump to the IDO's C# entry-point code), IDO: Forms Using This IDO (title-bar → every form that consumes the IDO), IDO: Trace Dependencies in Dev Hub (title-bar → down-trace the IDO's C# entry point), and IDO: Trace GetService Roots (right-click a method in the IDO Outline → trace that method's services)
  • SyteLine IDS Form Designer integration (shown only when the jeking.sl-ids-form-designer extension is installed): IDO: Forms Using This IDO Method… (title-bar → pick one of the open IDO's methods and list the workspace forms that call it — declarative event calls and form-script Invoke — then pick a form to open it). The same lookup is also a per-method button in the Methods editor (scoped to that method, no picker). The selected Property Editor also has a Bound Components tab that calls slIds.findComponentsBoundToPropertyData for the exact IDO/property; each result can call slIds.selectLayoutNode to activate the IDS/IV2 custom editor and reveal the bound control. This part is available only when the Form Designer exposes both commands.
  • IDO: Enable XSD Validation (Red Hat XML) — binds the bundled official Mongoose IDODefinition.xsd to **/Collections/**/*.xml so the Red Hat XML extension validates IDO files against the schema
  • IDO: Rebuild Index

For other extensions (programmatic)

mgIdo.openIdoByName(name: string): Promise<boolean> — resolve an IDO by name via the workspace index and open it in the visual editor; returns true if found. Hidden from the Command Palette. Example:

const ext = vscode.extensions.getExtension('jeking.mg-ido-pro-editor');
await ext.activate();
const ok = await vscode.commands.executeCommand('mgIdo.openIdoByName', 'SLItems');

Read-only metadata API (used by MG REST Client to source IDO metadata from the workspace files instead of live Mongoose REST queries — faster and works offline). Each returns undefined when the IDO isn't found in the workspace, so the caller can fall back to REST. Activate the extension first.

Command Returns
mgIdo.api.getIdoNames() string[] — distinct IDO collection names in the workspace
mgIdo.api.validateAll() { scanned, withErrors, withWarnings, idos:[{ ido, path, errors, warnings, issues[] }] } — validate every indexed collection (schema-aware; same engine as the ido_validate_all MCP tool) and return the flagged IDOs. Cross-extension callers (e.g. SyteLine Dev Hub) use this because extensions can call commands but not MCP tools; also refreshes the IDO Explorer's validation badges.
mgIdo.api.getMethods(ido, kind?) { name, type }[] — kind='load' for custom-load (result-set) methods, else invokable
mgIdo.api.getProperties(ido) { name, isKey, readOnly, required, type }[]
mgIdo.api.getProperty(ido, name) IdoPropertyDetail — full detail for one property (case-insensitive). Convenience fields (type, dataLength, labelStringId, readOnly, required, isHTML, isRORecordFlag, defaultValue) are effective: the property's own value, else inherited from its PropertyClass chain. Also returns name, binding, sequence, isKey, propertyClass, propertyClassChain, boundToColumn, columnTableAlias, expression, subcollection, initialValue, plus three attribute bags — attributes (own only), inheritedAttributes (from the PropertyClass chain), effectiveAttributes (merged, own wins; canonical camelCase keys). labelStringId is the caption string id (e.g. sItemDescription), not resolved text. undefined if not found.
mgIdo.api.getMethodParameters(ido, method) { name, direction, type }[] (direction: in/out/inout/message)
mgIdo.api.getDataRules(ido) IdoDataRuleInfo[] — all data rules with active/inheritToUI/operationType (+label) and their actions / conditions / filters (each with decoded labels, e.g. ActionType → "Set Property Enabled")
mgIdo.api.getDataRule(ido, ruleName) a single data rule by name (case-insensitive), or undefined
mgIdo.api.analyzeDataRules(idoNameOrPath) { markdown, spec } — the full Data Rule + property-validator test-plan analysis (accepts an IDO name or a file path), or undefined
mgIdo.api.getCachedSettingUsage() CachedSettingUsage[] — every declared <CachedSetting> with { ido, settingName, scopeLevel, sourceType, propertyName/methodName, references[] }. references covers action / activation-condition / filter-condition reads, each with the reading IDO and location. An empty references list means no data-rule reference in the IDO metadata — not proof the setting is unused.
mgIdo.api.findFormsUsingIdo(idoName) FormUsageRow[] — workspace IDS/IV2 forms that use the IDO, each with { formName, path, variant, isPrimary, primaryIdo, properties, objectRefs } (where-used detail). isPrimary resolves every real primary_ido shape (plain, SL.-prefixed, Ido.CustomLoadSp, or empty → falls back to primary_datasource). Name matching is exact — SLItems and SLItems_IDS are different collections; a form that uses the sibling is returned with sibling: true + matchedIdo and never counted as a use of the requested IDO. properties covers every collection slot the IDO occupies — primary and secondary (object2…objectN) — and objectRefs lists those slots. Results are cached per file (invalidated by mtime + a file watcher), so repeat lookups are near-instant.

MCP server (for AI agents)

The extension ships a dependency-free MCP server (dist/mcp/server.js, stdio JSON-RPC) that exposes the IDO engine to MCP-capable agents (e.g. Kiro). Register it with IDO: Register MCP Server with Kiro (writes .kiro/settings/mcp.json, seeding MG_IDO_ROOTS from your metadata-root settings); remove it with IDO: Unregister MCP Server from Kiro. After an extension upgrade, an existing registration is refreshed automatically on activation (the launcher + entry are regenerated so the newest server ships without re-running the command); this never creates a registration you didn't opt into and can be turned off with mgIdo.mcpAutoReregister. Tools:

Tool Purpose
ido_create Create a new IDO collection file at a path or in an existing folder (identity + optional initial tables/properties/methods/data-rules) — dry-run/apply, won't overwrite unless overwrite:true.
ido_update Update an IDO's definition-level (identity) fields — dry-run/apply.
ido_delete Delete the entire IDO collection file (dry-run/apply; distinct from ido_delete_item).
ido_list_collections Discover IDOs under MG_IDO_ROOTS (name, module, AccessAs, _IDS, path).
ido_get_model Full structured model (tables/properties/methods/data-rules) for one file.
ido_get_property / ido_get_table / ido_get_method / ido_get_data_rule Fetch a single item by name.
ido_list_property_classes List PropertyClasses discovered under MG_IDO_ROOTS (name, BaseClass, file).
ido_describe_enums Code↔label catalog for every "magic number" field (Data Rule OperationType/ActionType/ValueType/SourceType/ComparisonOperator, Binding, MethodType, DataType, formats); optional enum filters to one. Makes the server self-documenting for agents.
ido_validate Semantic + reference validation issues (schema-aware when MG_IDO_SCHEMA is set); pass checkReferences:true to also resolve cross-file INCOLLECTION/IDOMETHOD/Domain + cached-setting references against MG_IDO_ROOTS and flag dangling ones.
ido_validate_all Batch-validate every collection under MG_IDO_ROOTS in one call → { scanned, withErrors, withWarnings, idos:[{ ido, path, errors, warnings, issues[] }] } for flagged IDOs; schema-aware, checkReferences/errorsOnly options.
ido_compare_ids Structured base ⇄ _IDS diff (summary + Markdown).
ido_analyze_datarules Analyze data rules + property validators → a test-plan (Markdown/JSON spec): per-rule REST-testability class, trigger tree, scenarios, env deps.
ido_get_cached_settings List an IDO's <CachedSetting>s (name + fields; ScopeLevel/SourceType decoded).
ido_add_cached_setting / ido_set_cached_setting / ido_delete_cached_setting Cached-setting CRUD (by SettingName) — dry-run/apply.
ido_cached_setting_usage Cross-reference every declared <CachedSetting> against every data-rule part that reads it (action / condition / filter); unreferencedOnly:true returns just the ones nothing reads. IDO metadata only.
ido_analyze_cached_setting_impact Cross-file: every data rule that reads a cached setting (impact of renaming/removing it).
ido_resolve_property_class Resolve a PropertyClass chain → effective attributes.
ido_add_property / ido_set_property Add / edit a property (bindings, PropertyAttributes) — dry-run/apply.
ido_reorder_property Move a property to a new position and renumber — dry-run/apply.
ido_add_table / ido_set_table Add / edit a table (name, alias, type, join) — dry-run/apply.
ido_add_method / ido_set_method Add / edit a method + parameters — dry-run/apply.
ido_add_parameter / ido_set_parameter / ido_delete_parameter Method-parameter CRUD — dry-run/apply.
ido_add_data_rule / ido_set_data_rule Add / edit a data rule + actions/conditions/filters — dry-run/apply.
ido_apply_spec Apply an authoring spec (idoAuthoringSpec:1) in one call — add/update properties + add data rules from an inline spec or a JSON specPath; strictly validated (rejected whole if malformed) — dry-run/apply.
ido_add_rule_item / ido_delete_rule_item Add / delete a rule action/condition/filter — dry-run/apply.
ido_change_rule_sub_type Change a rule sub-item's type field (action ActionType/ValueType, condition SourceType, filter ComparisonOperator) and clean up children the new type no longer uses (optional restore re-applies prior values) — the same shared engine the visual editor uses — dry-run/apply.
ido_tidy_data_rules Tidy every data rule — remove stale, type-irrelevant child elements from all actions/conditions/filters (foreign tags preserved), reporting how many were removed — dry-run/apply.
ido_rename_item Rename a property/table/method/data rule — dry-run/apply.
ido_delete_item Delete a property/table/method/data rule by key — dry-run/apply.
ido_import Deploy/import an IDO into a SyteLine config via AppMetadataTransport.exe — dry-run/apply (uses MG_SL_INSTALL / MG_IMPORT_CONFIG).
ido_import_changed Import all IDOs changed vs a base git ref (batch deploy) — dry-run/apply.
ido_sync_to_ids Copy an item into the _IDS sibling — dry-run/apply.
ido_bump_revision Increment RevisionNo + stamp RevisionDate — dry-run/apply.
ido_format Canonically re-serialize a file — dry-run/apply.

Read tools are auto-approved; the write tools default to a dry-run and only touch disk with apply:true.

Architecture

src/
  model/        XML tree (parse/serialize), typed projection, enums, sequence, edits
  validation/   semantic + reference validation
  editor/       CustomTextEditorProvider (hosts the webview, applies edits)
  explorer/     workspace index + collections tree + active-IDO outline tree
  webview/      UI (framework-free TS) + host/webview message protocol
  extension.ts  activation: editor, explorer, commands, diagnostics
media/          webview.css + activity-bar icon
test/           node:test suites (core + corpus round-trip)

The open TextDocument is the single source of truth. Webview edits post typed messages; the host applies them to the XML tree, re-serializes canonically, and replaces the document via a WorkspaceEdit — so text view, undo/redo, and external edits all stay in sync.

Development

npm install
npm run build        # bundle extension + webview (esbuild)
npm run watch        # rebuild on change
npm run typecheck    # tsc --noEmit
npm test             # compile + run node:test suites

Run the extension: open this folder in VS Code / Kiro and press F5 (Extension Development Host), then open any IDO collection XML.

Tests

  • test/roundtrip.test.ts — runs against the real corpus (set MG_CORPUS to override the path, MG_SAMPLE to change the file count). Hard gates: semantic equality (no data loss) and idempotency (no formatting drift); plus a byte-exact rate metric.
  • test/core.test.ts — enum catalog, model projection, sequence renumbering, edit ops, and validation.
  • test/edits.test.ts — full CRUD edit operations (add/edit/delete for properties, tables, methods, parameters) with serialization-stability checks.
  • test/webview.test.ts — jsdom smoke test that runs the real bundled webview, asserts the Canvas renders, and that inline edits / row-expand / add emit the correct messages.

Status / Roadmap

This is the MVP. Planned next: cross-file reference go-to-definition, the guided DataRule builder, canvas relationship lines + drag-drop binding conversions, _IDS sync, and editors for the sibling constructs (PropertyClass, Form/ComponentClass/Validator). See DESIGN.md.

  • Contact us
  • Jobs
  • Privacy
  • Manage cookies
  • Terms of use
  • Trademarks
  • Your Privacy Choices
  • Consumer Health Privacy
© 2026 Microsoft