Repository navigation
Sync ako/mxcli: alter consumed rest service, keep edited lint rules, refuse widget-deleting page rewrites, MCP flow sides and notes - #1635
Merged
Conversation
Accordion groups, Pop-up menu items and other object-list items store no Name, so `insert into grp1` cannot resolve (#1326, mendixlabs#1453). Proposes reusing the navigation-list item address (`acc1 item@1`, `item('One')`, `item(btnInGroup)`) with the `.slot` suffix from `dataGrid1.controlbar`, with a bare item meaning its body slot. Table-cell addressing is deferred. Records two prerequisites found while checking the design: describe flattens an item's headerContent into its body, and the Accordion hides headerContent while headerRenderMode is 'text', so a write there is refused rather than stored hidden. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019httGxDh8UXt1Zoyh3Gh52
The OpenAPI importer wires every JSON response as raw `Response: json`; users and agents must hand-write the entities and mapping. Proposes an opt-in `GenerateEntities: Yes` that creates non-persistent entities and writes inline `Response: mapping` (Rest$ImplicitMappingResponseHandling, already supported), phased: P0 stops the silent Swagger 2.0 downgrade (measured: empty contract, no warning) and adds skill guidance; P1 schema model; P2 object-rooted generation; P3 array roots (needs a Studio Pro reference); P4 Swagger 2.0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PnpNHdpFqu1sPL7yNAQgTh
… contract The parser reads only OpenAPI 3 fields, so a Swagger 2.0 spec (the reporter's petstore.swagger.io/v2) unmarshalled cleanly into an empty contract: BaseUrl '', request bodies dropped, every response `none`, no warning. It is now refused with a conversion hint. Also documents, in the rest-client skill and the docs-site, that the import returns JSON responses as strings and how to wire `Response: mapping` instead - the route the reporter's agent got wrong. Phase 0 of PROPOSAL_openapi_response_entities.md (#1234). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PnpNHdpFqu1sPL7yNAQgTh
The create path sent no connection sides, so Studio Pro drew every flow right -> left: @anchor, CASE outcome anchors and the builder's own sides were lost (11.15.0-rc.4: a CASE read back 1 -> 3 on all eight flows). A note failed the whole create, since mapObjectTree had no Annotation case. buildFlowDocContent now maps each sequence flow's indexes onto originConnectionSide/destinationConnectionSide (setPEDSides, shared with the splice). It also writes notes as Microflows$Annotation and their lines as Microflows$AnnotationFlow elements: origin/destination plus the required connection indexes, defaulting through the new AnnotationFlow.SidesOrDefault, which the modelsdk writer uses as well. The skeleton adapter keeps a note line's $Type and shifts its ends past the parameters. On the pre-11.14 constructor, whose flows are untyped, notes are refused rather than risk a note line read as a sequence flow. The splice sent a note line with the constructor's originId/destinationId keys, which PED refuses. It now uses the same mapping and adds note lines after its new sequence flows, because PED stores an AnnotationFlow after a SequenceFlow added later in the same update. Verified live against Studio Pro 11.15.0-rc.4: the same script gives identical sides on all 10 flows over --mcp and on the modelsdk engine, note lines included; with the fix reverted every flow read back 1 -> 3. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ntract-drift-9p6ini
…umeration `create microflow M.X ($T: System.UserType)` was written as DataTypes$ObjectType with Entity "System.UserType" on every engine. The visitor types each bare qualified name in a parameter or return position as an entity, and the executor's entity-then-enumeration fallback skips the System module outright (its entities are not stored in the project), so a System enumeration kept the entity guess. The local engines wrote it without complaint and DESCRIBE printed a plausible bare `System.UserType` (an enumeration renders as `enum X`), but mx check reports CE1613 "The selected entity 'System.UserType' no longer exists" for the parameter and for a System-enum return type. Studio Pro's PED refuses it at write time, which is how it surfaced over --mcp. The explicit `enum System.UserType` spelling, what DESCRIBE emits for an enumeration, was refused as "enumeration not found", because the System module's enumerations are not in ListEnumerations. settleSystemEnumeration retypes a name in meta.SystemEnumerations before validation at all six sites (microflow, nanoflow, rule x parameter, return type), and isKnownEnumeration accepts a System enumeration where findEnumeration cannot see it. System.User stays an object type. Verified over --mcp on Studio Pro 11.15.0-rc.4: ped_read_document reads back DataTypes$EnumerationType for the parameter and the return type; a stubbed-fix control reproduces the PED error. Locally, mx check 11.14.0 goes from 2x CE1613 to 0 errors. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every insert over --mcp failed on 11.15.0-rc.4 with `undefined is not an object (evaluating 'u.$Type')`. The splice sent the whole insert as one ped_update_document and addressed the elements it added in that same update by index. PED resolves a path against the document as it was before the update, so none of those sets reach a new element: a set below a new flow's line fails the whole update, and any other set (an activity's action, a flow's isErrorHandler) is accepted and lost. Separately, several index-less adds to one array are stored in reverse and $id() resolves against that final order, so an insert of more than one element was wired to the wrong objects. The insert is now two updates. The first adds the new elements (constructor properties only, each at the stored length as its index, wired with $id()) and moves the stored ones. The second fills in the new elements: actions, conditions, loop sources, isErrorHandler and control vectors (0;0 is the schema default and is not sent). A failed second update leaves the insert incomplete in Studio Pro, the same contract as CreateMicroflow's create-then-set; the error says so. Verified live on 11.15.0-rc.4: plain, IF/ELSE and note inserts match the default engine on every flow's ends, sides and control vectors and every object's position, and ped_check_errors is clean on two successive calls. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… do not recreate a renamed one Bundled lint rules were recognised by file name only, so `mxcli init` and the session-start `init --sync-skills` overwrote an edited example_microflow.star (shipped to be customised), and wrote the stock file back beside a renamed copy, so CUSTOM002 ran twice — once from the stock list (mendixlabs#1615, #1543). A bundled file is now refreshed only while its content is a version mxcli shipped. cmd/mxcli/lint_rules_shipped.txt lists every such version (sha256, CRLF read as LF), seeded from the whole git history of .claude/lint-rules/; a test keeps it current and prints the line to add. Any other content is the project's edit and is kept, named once per mxcli version. A missing bundled rule is not written while another file in the directory defines its rule ID. init, init --sync-skills and add-tool share one write path. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NUbjJ5DeS2vysn9hfKir4Y
… takes no variable An operation created with `Response: json as $Result` describes as `Response: json`, because the variable is not stored (a consumed REST operation has none; the call activity names it). The parser rejected that form with `missing VARIABLE at ')'`, so describe -> edit -> create or modify was unavailable for every such service (mendixlabs#1608, #1536). string/file/status responses described as `as ` with nothing after it. `Response: json | string | file | status` now takes `as $var` as optional, and describe prints every kind bare when there is no variable. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NUbjJ5DeS2vysn9hfKir4Y
…n place There was no MDL way to add an operation to an existing consumed REST service: `alter consumed rest service … add operation` did not parse, and a `create or modify` naming the new operations deleted every stored one it did not list (mendixlabs#1608, #1536). alter consumed rest service M.Api add operation GetBooking ( … ), modify operation PostBooking (Timeout: 60), drop operation Old, set (BaseUrl: '…', Authentication: none); The operation body is CREATE's. Actions apply in order. The backend edits the stored unit as a splice (EditConsumedRestService, saved through UpdateRawUnitPatch) rather than a rebuild from the semantic model: an operation no action names is written back byte for byte, a modified one has only the keys the statement lists re-encoded (with CREATE's encoder), and a method change that keeps the element's shape keeps the stored body. A rebuild would reset what the reader does not carry — measured with an optional query parameter and a test value seeded as Studio Pro writes them, which `create or modify` from describe output resets and ALTER keeps. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NUbjJ5DeS2vysn9hfKir4Y
…emoves The statement declares the service's whole operation list, so one naming only the operations to add deleted the stored ones and reported only "Modified rest client: MyFirstModule.BookingApi (2 operations)" (mendixlabs#1608, #1536). It still applies — as `create or modify entity` does for attributes — and now names each removed operation and the `alter consumed rest service … add operation` that adds one without touching the others. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NUbjJ5DeS2vysn9hfKir4Y
Once `describe consumed rest service` output parsed (mendixlabs#1608), the TestApp round trip executed it for Mappings.RestClient and found the write changed a Studio Pro-authored service that nothing had changed: /Operations[0]: 3 -> 2 /Operations[1](Request)/Headers[0]: 3 -> 2 /Operations[1](Request)/Parameters[0]: 3 -> 2 Studio Pro writes marker 3 for Operations, an operation's Headers and Parameters, 2 for QueryParameters and 1 for Tags — measured on TestApp's services (11.14.0) and on `mx convert -p` of mxcli-written ones (11.6.6), which agree. The writer had 2 for the first three, copied from the legacy serializer. The ALTER splice now keeps the stored Operations marker rather than writing one. Mappings.RestClient no longer breaks parse or getput and is struck from the TestApp allowlist. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NUbjJ5DeS2vysn9hfKir4Y
…ntract-drift-9p6ini # Conflicts: # .claude/skills/mendix/rest-client/SKILL.md
TestSkillsTeachMDL1 requires every complete script in a skill to start with `mdl 1;`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PnpNHdpFqu1sPL7yNAQgTh
…p6ini OpenAPI response entities: proposal + Phase 0 (refuse Swagger 2.0, document response wiring)
fix(executor): a bare System enumeration in a flow signature is an enumeration
fix(mcp): ALTER MICROFLOW insert lands on Studio Pro 11.15
…bject-list-item-address # Conflicts: # docs/11-proposals/README.md
DESCRIBE folded every widget slot of an object-list item into the item's
body, so an Accordion group's headerContent widgets were printed beside
its content widgets, and a page regenerated from the description stored
them in content. Measured on a blank 11.13.0 app:
stored: headerContent -> [txtHead], content -> [txtBody]
regenerated: content -> [txtHead, txtBody]
The block form that keeps them apart could not run either:
`headercontent { … }` inside a group failed check with MDL-WIDGET25 "not
a widget in this project". The item builder routes that block; the
widget-kind validator resolved no parent for a child of an item, so the
item's own slot keyword fell through to the unknown-widget error.
- describe keeps each slot apart and prints the body slot as the item's
children, every other non-empty slot as `<keyword> { … }`;
- the body choice (content, else the first widget slot) is one function,
bodyItemSlotKey, called by both CREATE's defaultItemSlotKey and describe;
- the validator passes an item's mapping to its children, so a slot the
item declares is accepted and a misspelt one is still refused.
Control: before the fix the new tests fail with the body holding both
widgets and MDL-WIDGET25; the misspelt-block control passes before and
after. Fixed, the describe -> fresh-app round trip stores txtHead in
headerContent and txtBody in content, and mx check reports 0 errors.
Prerequisite of PROPOSAL_alter_object_list_item_address.md (#1564).
Refs #1326
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019httGxDh8UXt1Zoyh3Gh52
…ts MDL cannot author `describe page M.P` prints a classic data grid, a reference selector, a drop-down or a reference set selector as a `-- NOT re-executable` comment, and executing that output replaced the page with the widget gone — only "Replaced page M.P", mx check clean on both sides (mendixlabs#1622, #1554). A `create or modify` / `create or replace` of a stored page, snippet or layout that holds such a widget, and does not declare it by name, is now refused (guard-don't-drop, ADR-0005). The refusal lists every widget, the `alter` that edits the document while keeping them, and the `alter … { drop … }` that removes them on purpose first. `check -p` reports the same, following an earlier `alter` of the document in the script. The widgets come from describe itself: describeDroppedWidget already runs for exactly the widgets MDL cannot author, and now also feeds the guard, which describes the stored document into io.Discard. Layout describe goes through describeWidgetBody so the guard sees its widgets too. The #1415 round-trip test asserted the old behaviour (the description of a page with a legacy grid executes); it now asserts the refusal, that the #1415 dangling-selection error stays gone, and that the grid is kept. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NUbjJ5DeS2vysn9hfKir4Y
…ation attribute (CE7247) `combobox cb (Attribute: Flag)` on a Boolean, with no data source, passed `check --references` and `exec` and failed mxbuild with CE7247 "Only attributes of type Enumeration are allowed here." Enumeration mode writes the attribute to `attributeEnumeration`, whose AllowedTypes is Enum alone. Measured on fresh 11.14.0 and 11.13.0 projects, one combo box per type: String, Integer, Long, Decimal, AutoNumber, Boolean, DateTime and Binary are CE7247; Enumeration builds clean. MDL-WIDGET39 now judges an enumeration-mode combo box against that matrix, carrying the error code per rule (CE2421 for the built-in inputs, CE7247 for the combo box). Association mode (an options data source) is not judged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VKmbj53BC2vuUWYmgWgfQ5
fix: refuse a page, snippet or layout rewrite that would delete widgets MDL cannot author
…m-address docs(proposal): ALTER PAGE addressing of pluggable object-list items
fix: describe keeps an Accordion group's headerContent out of its body
fix(executor): refuse a combo box in enumeration mode on a non-enumeration attribute (CE7247)
… PostgreSQL On a standard Windows PostgreSQL install `postgres` always has a password and there is no sudo, so every passwordless path in resolveSuperuser failed with "no local PostgreSQL superuser available to create the role/database" and no way out (#1342, mendixlabs#1485). - --db-admin-user / --db-admin-password: tried alone when given, password passed to psql via PGPASSWORD (never argv), a rejected login reported with psql's own message. Refused without --ensure-db; never reaches the runtime. - The no-superuser error now names the flags, PGPASSWORD (which already worked but was undiscoverable), and the two CREATE statements with the real role and database names. Verified against a real PG16 cluster initdb'd scram-only with a postgres password: pre-fix binary reproduces the reported error verbatim; fixed binary provisions with --db-admin-password and reports a wrong one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011JxhJZ2dtafexgzZPPmdzN
buildUnitCache read every .mxunit in mprcontents/ to learn its $Type and discarded the bytes, and every write made the next listing repeat it, so `describe` of one microflow opened 393 of a blank app's 394 unit files. Unit types are now indexed by the Unit table's ContentsHash and persisted to .mxcli/unit-types.idx; only a unit whose hash the index has not seen is opened. Content-addressed entries cannot go stale, so the index survives writes and in-place re-types without invalidation. Fixes mendixlabs#1603 (#1513). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MdRSZCA1BzDfFCTFcLJS4r
Each member assignment of a `create` action made the flow builder look up the module and its domain model, and GetDomainModel decoded every module's domain model before keeping one; 200 creates of 8 members went from 14 s to 294 s after 30 modules were added. GetDomainModel now reads and decodes only its module's unit (the reader filters by container before reading contents), following a generalization chain into another module only when one exists. One flow build reads through the existing per-derivation memo, since the builder writes nothing. On pedapp + 30 modules x 20 entities the issue's script runs in 1.6 s (exec) and 1.8 s (check --references), from 142.6 s and 40.3 s. Fixes mendixlabs#1616 (#1549). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MdRSZCA1BzDfFCTFcLJS4r
…l build drops dist/pages On Mendix versions where mxbuild writes web/dist itself (measured on 11.12.5), only the first build in an `mxbuild --serve` process bundles the client completely. Every later build in the same process either replaces dist/ with a monolithic index.js and no pages/ or widgets.css (any non-page change, or no change at all) — reported as "applied via reload" while every page 404s — or fails outright with "Could not find a part of the path '…/web/pages/…'" when a page changes (#1485, mendixlabs#1580). Measured over mxbuild's /build API with no watch loop: an unchanged second build already loses the pages, deleting web/dist or web/ does not help, and a fresh process builds completely. So the watch loop now builds through serveRecovery, which restarts the serve process and builds once more on either shape, keeping the incremental build's restartRequired (a cold build always says true, which would restart the runtime per change). End to end on 11.12.5: pre-fix binary leaves dist = chunks + index.js and `mxcli playwright check` fails; fixed binary applies via reload with 13 page modules and the check passes, and a page edit applies instead of failing. The 11.14 hint now says mxcli already retried. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011JxhJZ2dtafexgzZPPmdzN
… theme error After a Sass error, the same `mxbuild --serve` process re-reports that first error as "[CE6093] The theme could not be compiled" on every later build, even once the SCSS is fixed — quoting a line no longer in the file — until `mxcli run restart` (#1482, mendixlabs#1577). Measured on 11.12.5 over mxbuild's /build API: fixed SCSS, same process → CE6093 twice; fresh process → Success. serveRecovery now tracks whether the current serve process's last theme compile failed, and when a theme failure follows another it restarts the process and builds once more. A first theme failure is reported as-is (it is genuine), and a failure that survives the restart is the source's own and current one. End to end on the 11.12.5 app: pre-fix binary → build #3 failed [CE6093] Undefined variable; fixed → build #3 applied, the served CSS has the fix, and a second, different error is reported as itself. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011JxhJZ2dtafexgzZPPmdzN
…tr`, refuse the CE7247 qualified name A Custom chart's eventDataAttribute bound to an attribute of the other page parameter ($Ctx) inside a data view over $Entry had no spelling that built: - `eventDataAttribute: $Ctx.EventData` was MDL-WIDGET42 "is a attribute property and cannot hold the expression $Ctx.EventData": a key authored by its own name goes through the expression grammar, and only mapped keys took `$Param.Attr`; - `MyFirstModule.ChartContext.EventData` passed check and exec, was stored as the AttributeRef alone, and mx check (11.12.5) reported CE7247 "Attribute 'MyFirstModule.ChartContext.EventData' is not an attribute of entity 'MyFirstModule.ChartEntry'"; - DESCRIBE printed that binding qualified, so a round trip re-created CE7247. `$Param.Attr` is now written on any attribute property as the AttributeRef plus a Forms$PageVariable naming the parameter, the pair Studio Pro stores. mx check: 0 errors. Check accepts it, including on a key whose kind is unknown without a project, since it is no Mendix expression (`$Param/Attr` is). A qualified attribute of an entity that is neither the bound one nor one of its generalizations is refused by the shared misboundAttributeError (check and exec give the same message), naming CE7247 and `$Param.Attr`. DESCRIBE prints a parameter-sourced attribute as `$Param.Attr`; describe -> exec is Unchanged. The #1591 bug-test MDL pinned the qualified form and now uses `$Ctx.EventData`. Mirror of mendixlabs#1591 (#1502). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GZbx4k5eUbdTGQEcBaWFdM
A reader that caught a unit between a writer's file rename and its hash update would learn the row's old ContentsHash with the new file's $Type, and list the unit under the wrong type once the old bytes came back. The index now keys what it learns by the SHA-256 of the bytes actually read. Follow-up to the MPR v2 type index (mendixlabs#1603, #1513). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MdRSZCA1BzDfFCTFcLJS4r
The unit-type index under .mxcli/ is a cache any listing may refresh, as the catalog is; mdl/scriptdiff's snapshot already excludes the directory for that reason. The rollback test counted it as a project write. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MdRSZCA1BzDfFCTFcLJS4r
On a module of 229 microflows the dump timed out after 5 minutes, and with a longer timeout stopped at the 10,000-line output limit, truncated. A module dump is bounded by the module, so neither default guard applies to it; an explicit MXCLI_EXEC_TIMEOUT still does, and the line limit is now configurable for every statement with MXCLI_OUTPUT_LINE_LIMIT (0 for none). The time went into each microflow's layout derivation: the read memo it rebuilds through hid the backend's by-name microflow lookup, so every described flow decoded every microflow in the project. The memo now forwards that lookup, and a describe reads each unit file once. A 400-flow module on pedapp: 66.9 s and exit 1 at 10,025 lines before, 5.7 s and all 12,810 lines after; the 229-flow dump is byte-identical. Fixes mendixlabs#1624 (#1556). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MdRSZCA1BzDfFCTFcLJS4r
…ndixlabs#1624 fixes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MdRSZCA1BzDfFCTFcLJS4r
…ate skill index Bare #NNNN in this repo's code means mendixlabs/mxcli — #1342 already names the Windows web-dir lock there — so the fork-issue numbers used in the three preceding fixes are replaced with their upstream ones (mendixlabs#1485, #1577, #1580). The run-local SKILL.md section index is regenerated by `make skill-index` after its edits. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011JxhJZ2dtafexgzZPPmdzN
Formatting a UUID costs more than the rest of a Unit row, so the container is compared only for units of the wanted type. The GetDomainModel agreement test now also runs on an MPR v1 fixture, the path this filter serves. Follow-up to mendixlabs#1616 (#1549). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MdRSZCA1BzDfFCTFcLJS4r
fix: run-local cluster — ensure-db admin login, serve restart for dropped dist/pages and stale CE6093
fix: cost that scales with the project — v2 type scan, create-member lookups, module dump
fix: pluggable attribute of another page parameter — write `$Param.Attr`, refuse the CE7247 qualified name
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Syncs
ako/mxcli:maininto upstream: 15 commits from fork PRs ako#1534, ako#1535, ako#1544, ako#1545, ako#1551, ako#1564, ako#1565, ako#1566 and ako#1567.Fixes #1608, #1615 and #1622. Refs #1453 and #280.
Urgent fixes
initandinit --sync-skillskeep an edited bundled lint rule (init and init --sync-skills overwrite an edited bundled lint rule (example_microflow.star / CUSTOM002) and recreate it when renamed #1615).cmd/mxcli/lint_rules_shipped.txtholds their sha256s, seeded from git history.TestShippedLintRuleHashes_CoverEmbeddedRulesfails when a rule changes without its new hash.describe consumed rest serviceoutput re-parses:Response: jsontakes no variable.alter consumed rest service:add operation,modify operation,drop operation, andset (BaseUrl: …, Authentication: …). It edits the stored unit as a splice, so an operation no action names is written back byte for byte. Studio Pro-only state survives, such as optional query parameters and test values.create or modifynames the operations it removes, and points at thealterthat avoids it.mx checkon 11.6.6, including a fault control: removing an operation'sAcceptheader gives CE7062.Pages
describewrites widgets it cannot execute, andexecthen drops them silently #1622). This covers classic data grids, reference selectors, drop-downs and reference set selectors.describeprints these as-- NOT re-executablecomments, so executing its output used to remove them with onlyReplaced page …as output.alterto use instead, or thedropto remove them on purpose.check -preports the same before anything is written.headerContentout of its body (prerequisite for alter page/snippet cannot target widgets inside pluggable widget object-list slots (other than DataGrid2 columns) or legacy table cells #1453). Regenerating a page used to move the header widget into the body. The checker now accepts an object-list item's own slot keyword, which was MDL-WIDGET25 before.check --referencesandexec, then failed mxbuild with CE7247. That was measured for all eight non-enumeration types on 11.13 and 11.14.MCP backend (
--mcp)@anchorhad no effect.@annotationfailed the whole create.undefined is not an object (evaluating 'u.$Type'), which hid two more defects: "No action defined", and an inserted IF/ELSE wired to the wrong objects. The cause was addressing elements added in the same update by index.($T: System.UserType)was written as an object type on every engine, and mx check reported CE1613. Over MCP the create was refused outright.OpenAPI (#280)
Response: noneon every operation.GenerateEntities: Yes. This does not close The Consumed REST Service does not generate the NPE entities associated with the Import Mapping. #280.Docs
alterexample gets itsmdl 1;header