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

|
10 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.18.0. 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 · Binding badge · Class · Source) that filters, sorts and scrolls independently, and a resizable, toggleable editor side panel that stays in view. The panel edits every field with dropdowns/checkboxes, shows inline validation, has Open ↗ buttons to jump to a referenced IDO, and a read-only inherited PropertyClass section.
    • Overview — edit identity / ext-class / revision fields.
    • Tables — fully editable grid (alias, table, type, join) with add/delete rows.
    • 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 an editable parameter grid (seq, name, DB type/length/scale, in/out/message) and add/delete for methods and parameters.
  • 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), defaulting to the ones with no data-rule reference (22 of 41 in a real corpus); the title-bar toggle shows all declarations. Each row's tooltip 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 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 Explorer — activity-bar tree of all collections grouped by module, with a fuzzy Go to Collection… quick-pick. _IDS variants are flagged.
  • 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.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 Open matching files in the visual editor by default.
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, increment <RevisionNo> and stamp <RevisionDate> (local time).
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: 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)
  • 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.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. 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_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_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
© 2026 Microsoft